diff --git a/.gitignore b/.gitignore index 33db69f..2d397fc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ /target +# files generated by running servers steam_appid.txt +/data diff --git a/assets/robocraft/cubes.json b/assets/robocraft/cubes.json index 6918a36..cb791e4 100644 --- a/assets/robocraft/cubes.json +++ b/assets/robocraft/cubes.json @@ -6,18 +6,18 @@ "category": "NotAFunctionalItem", "placements": 63, "stats": { - "MASS": "15 Kg", - "ARMOR": "1,026", - "CPU LOAD": "1 pFLOP", - "ROBOT RANKING": "7626.00", - "OVERCLOCK": "Armor cubes do not Overclock." + "strMass": "15 [strKilograms]", + "strHealth": "1,026", + "strCPU": "1 [strPFlops]", + "strRobotRanking": "7626.00" }, - "description": "Tougher and Heavier than lower Tier Armor.", - "size": "T2", + "description": "Tougher and Heavier than lower Tier Armor. (227205318_10|0d8ae0c6_16)", + "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 1026 + "health": 1026, + "ignore_in_weapon_list": true }, "spriteName": "Medium_Cube", "nameStrKey": "strMediumCubeName", @@ -28,20 +28,20 @@ "id": 227917916, "info": { "category": "NotAFunctionalItem", - "placements": 54, + "placements": 63, "stats": { - "MASS": "7.5 Kg", - "ARMOR": "1,026", - "CPU LOAD": "1 pFLOP", - "ROBOT RANKING": "7626.00", - "OVERCLOCK": "Armor cubes do not Overclock." + "strMass": "7.5 [strKilograms]", + "strHealth": "1,026", + "strCPU": "1 [strPFlops]", + "strRobotRanking": "7626.00" }, - "description": "Tougher and Heavier than lower Tier Armor.", - "size": "T2", + "description": "Tougher and Heavier than lower Tier Armor. (227917916_10|0d95c05c_16)", + "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 1026 + "health": 1026, + "ignore_in_weapon_list": true }, "spriteName": "Medium_Edge", "nameStrKey": "strMediumEdgeName", @@ -52,20 +52,20 @@ "id": 1931676396, "info": { "category": "NotAFunctionalItem", - "placements": 22, + "placements": 63, "stats": { - "MASS": "4.95 Kg", - "ARMOR": "1,026", - "CPU LOAD": "1 pFLOP", - "ROBOT RANKING": "7626.00", - "OVERCLOCK": "Armor cubes do not Overclock." + "strMass": "4.95 [strKilograms]", + "strHealth": "1,026", + "strCPU": "1 [strPFlops]", + "strRobotRanking": "7626.00" }, - "description": "Tougher and Heavier than lower Tier Armor.", - "size": "T2", + "description": "Tougher and Heavier than lower Tier Armor. (1931676396_10|73230aec_16)", + "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 1026 + "health": 1026, + "ignore_in_weapon_list": true }, "spriteName": "Medium_Corner", "nameStrKey": "strMediumCornerName", @@ -78,18 +78,18 @@ "category": "NotAFunctionalItem", "placements": 63, "stats": { - "MASS": "10.05 Kg", - "ARMOR": "1,026", - "CPU LOAD": "1 pFLOP", - "ROBOT RANKING": "7626.00", - "OVERCLOCK": "Armor cubes do not Overclock." + "strMass": "10.05 [strKilograms]", + "strHealth": "1,026", + "strCPU": "1 [strPFlops]", + "strRobotRanking": "7626.00" }, - "description": "Tougher and Heavier than lower Tier Armor.", - "size": "T2", + "description": "Tougher and Heavier than lower Tier Armor. (3559488176_10|d4297ab0_16)", + "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 1026 + "health": 1026, + "ignore_in_weapon_list": true }, "spriteName": "Medium_Inner", "nameStrKey": "strMediumInnerName", @@ -100,12 +100,13 @@ "id": 447126572, "info": { "category": "NotAFunctionalItem", - "placements": 54, + "placements": 63, "stats": {}, "description": "MediumEdgeRound (447126572_10|1aa69c2c_16) without a description", - "size": "T2", + "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Medium_Edge_Round", "nameStrKey": "strMediumEdgeRoundName", @@ -116,12 +117,13 @@ "id": 2589418111, "info": { "category": "NotAFunctionalItem", - "placements": 22, + "placements": 63, "stats": {}, "description": "MediumCornerRound (2589418111_10|9a57627f_16) without a description", - "size": "T2", + "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Medium_Corner_Round", "nameStrKey": "strMediumCornerRoundName", @@ -135,9 +137,10 @@ "placements": 63, "stats": {}, "description": "MediumInnerRound (1837286858_10|6d82c5ca_16) without a description", - "size": "T2", + "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Medium_Inner_Round", "nameStrKey": "strMediumInnerRoundName", @@ -148,12 +151,13 @@ "id": 1538778047, "info": { "category": "NotAFunctionalItem", - "placements": 54, + "placements": 63, "stats": {}, "description": "MediumEdgeSlope (1538778047_10|5bb7e3bf_16) without a description", - "size": "T2", + "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Medium_Edge_Slope", "nameStrKey": "strMediumEdgeSlopeName", @@ -164,12 +168,13 @@ "id": 557016830, "info": { "category": "NotAFunctionalItem", - "placements": 22, + "placements": 63, "stats": {}, "description": "MediumCornerSlope (557016830_10|213366fe_16) without a description", - "size": "T2", + "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Medium_Corner_Slope", "nameStrKey": "strMediumCornerSlopeName", @@ -183,9 +188,10 @@ "placements": 63, "stats": {}, "description": "MediumInnerSlope (495400745_10|1d873729_16) without a description", - "size": "T2", + "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Medium_Inner_Slope", "nameStrKey": "strMediumInnerSlopeName", @@ -196,12 +202,13 @@ "id": 1352234106, "info": { "category": "NotAFunctionalItem", - "placements": 22, + "placements": 63, "stats": {}, "description": "MediumCone (1352234106_10|5099747a_16) without a description", - "size": "T2", + "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Medium_Cone", "nameStrKey": "strMediumConeName", @@ -212,12 +219,13 @@ "id": 2686602224, "info": { "category": "NotAFunctionalItem", - "placements": 22, + "placements": 63, "stats": {}, "description": "MediumPyramid (2686602224_10|a0224bf0_16) without a description", - "size": "T2", + "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Medium_Pyramid", "nameStrKey": "strMediumPyramidName", @@ -233,7 +241,8 @@ "description": "HeavyCube (123901970_10|07629812_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Heavy_Cube", "nameStrKey": "strHeavyCubeName", @@ -244,12 +253,13 @@ "id": 1225928721, "info": { "category": "NotAFunctionalItem", - "placements": 54, + "placements": 63, "stats": {}, "description": "HeavyEdge (1225928721_10|49123011_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Heavy_Edge", "nameStrKey": "strHeavyEdgeName", @@ -260,12 +270,13 @@ "id": 222074329, "info": { "category": "NotAFunctionalItem", - "placements": 22, + "placements": 63, "stats": {}, "description": "HeavyCorner (222074329_10|0d3c95d9_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Heavy_Corner", "nameStrKey": "strHeavyCornerName", @@ -281,7 +292,8 @@ "description": "HeavyInner (2577871627_10|99a7330b_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Heavy_Inner", "nameStrKey": "strHeavyInnerName", @@ -292,12 +304,13 @@ "id": 368051733, "info": { "category": "NotAFunctionalItem", - "placements": 54, + "placements": 63, "stats": {}, "description": "HeavyEdgeRound (368051733_10|15f00615_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Heavy_Edge_Round", "nameStrKey": "strHeavyEdgeRoundName", @@ -308,12 +321,13 @@ "id": 2148353926, "info": { "category": "NotAFunctionalItem", - "placements": 22, + "placements": 63, "stats": {}, "description": "HeavyCornerRound (2148353926_10|800d4786_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Heavy_Corner_Round", "nameStrKey": "strHeavyCornerRoundName", @@ -329,7 +343,8 @@ "description": "HeavyInnerRound (665761850_10|27aeb83a_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Heavy_Inner_Round", "nameStrKey": "strHeavyInnerRoundName", @@ -340,12 +355,13 @@ "id": 1334508924, "info": { "category": "NotAFunctionalItem", - "placements": 54, + "placements": 63, "stats": {}, "description": "HeavyEdgeSlope (1334508924_10|4f8afd7c_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Heavy_Edge_Slope", "nameStrKey": "strHeavyEdgeSlopeName", @@ -356,12 +372,13 @@ "id": 3665280239, "info": { "category": "NotAFunctionalItem", - "placements": 22, + "placements": 63, "stats": {}, "description": "HeavyCornerSlope (3665280239_10|da77bcef_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Heavy_Corner_Slope", "nameStrKey": "strHeavyCornerSlopeName", @@ -377,7 +394,8 @@ "description": "HeavyInnerSlope (2111062867_10|7dd44353_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Heavy_Inner_Slope", "nameStrKey": "strHeavyInnerSlopeName", @@ -388,12 +406,13 @@ "id": 3886136035, "info": { "category": "NotAFunctionalItem", - "placements": 22, + "placements": 63, "stats": {}, "description": "HeavytCone (3886136035_10|e7a1bae3_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Heavy_Cone", "nameStrKey": "strHeavytConeName", @@ -404,12 +423,13 @@ "id": 4184274974, "info": { "category": "NotAFunctionalItem", - "placements": 22, + "placements": 63, "stats": {}, "description": "HeavyPyramid (4184274974_10|f966f81e_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Heavy_Pyramid", "nameStrKey": "strHeavyPyramidName", @@ -425,7 +445,8 @@ "description": "LightCube (1972224393_10|758dc189_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Light_Cube", "nameStrKey": "strLightCubeName", @@ -436,12 +457,13 @@ "id": 4157111053, "info": { "category": "NotAFunctionalItem", - "placements": 54, + "placements": 63, "stats": {}, "description": "LightEdge (4157111053_10|f7c87b0d_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Light_Edge", "nameStrKey": "strLightEdgeName", @@ -452,12 +474,13 @@ "id": 1347255791, "info": { "category": "NotAFunctionalItem", - "placements": 22, + "placements": 63, "stats": {}, "description": "LightCorner (1347255791_10|504d7def_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Light_Corner", "nameStrKey": "strLightCornerName", @@ -473,7 +496,8 @@ "description": "LightInner (1941682825_10|73bbba89_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Light_Inner", "nameStrKey": "strLightInnerName", @@ -484,12 +508,13 @@ "id": 1993583577, "info": { "category": "NotAFunctionalItem", - "placements": 54, + "placements": 63, "stats": {}, "description": "LightEdgeRound (1993583577_10|76d3abd9_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Light_Edge_Round", "nameStrKey": "strLightEdgeRoundName", @@ -500,12 +525,13 @@ "id": 582052348, "info": { "category": "NotAFunctionalItem", - "placements": 22, + "placements": 63, "stats": {}, "description": "LightCornerRound (582052348_10|22b169fc_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Light_Corner_Round", "nameStrKey": "strLightCornerRoundName", @@ -521,7 +547,8 @@ "description": "LightInnerRound (1578378954_10|5e1426ca_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Light_Inner_Round", "nameStrKey": "strLightInnerRoundName", @@ -532,12 +559,13 @@ "id": 3093572869, "info": { "category": "NotAFunctionalItem", - "placements": 54, + "placements": 63, "stats": {}, "description": "LightEdgeSlope (3093572869_10|b8642d05_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Light_Edge_Slope", "nameStrKey": "strLightEdgeSlopeName", @@ -548,12 +576,13 @@ "id": 3959877408, "info": { "category": "NotAFunctionalItem", - "placements": 22, + "placements": 63, "stats": {}, "description": "LightCornerSlope (3959877408_10|ec06ef20_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Light_Corner_Slope", "nameStrKey": "strLightCornerSlopeName", @@ -569,7 +598,8 @@ "description": "LightInnerSlope (2426642454_10|90a3a016_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Light_Inner_Slope", "nameStrKey": "strLightInnerSlopeName", @@ -580,12 +610,13 @@ "id": 1422041599, "info": { "category": "NotAFunctionalItem", - "placements": 22, + "placements": 63, "stats": {}, "description": "LightCone (1422041599_10|54c2a1ff_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Light_Cone", "nameStrKey": "strLightConeName", @@ -596,12 +627,13 @@ "id": 885415789, "info": { "category": "NotAFunctionalItem", - "placements": 22, + "placements": 63, "stats": {}, "description": "LightPyramid (885415789_10|34c65f6d_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Light_Pyramid", "nameStrKey": "strLightPyramidName", @@ -617,7 +649,8 @@ "description": "CompactCube (1576857358_10|5dfcef0e_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "TX_Cube", "nameStrKey": "strCompactCubeName", @@ -628,12 +661,13 @@ "id": 327960333, "info": { "category": "NotAFunctionalItem", - "placements": 54, + "placements": 63, "stats": {}, "description": "CompactEdge (327960333_10|138c470d_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "TX_Edge", "nameStrKey": "strCompactEdgeName", @@ -644,12 +678,13 @@ "id": 126353766, "info": { "category": "NotAFunctionalItem", - "placements": 22, + "placements": 63, "stats": {}, "description": "CompactCorner (126353766_10|07880166_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "TX_Corner", "nameStrKey": "strCompactCornerName", @@ -665,7 +700,8 @@ "description": "CompactInner (2378018821_10|8dbdb005_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "TX_Inner", "nameStrKey": "strCompactInnerName", @@ -676,12 +712,13 @@ "id": 676446887, "info": { "category": "NotAFunctionalItem", - "placements": 54, + "placements": 63, "stats": {}, "description": "CompactEdgeRound (676446887_10|2851c2a7_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "TX_Edge_Round", "nameStrKey": "strCompactEdgeRoundName", @@ -692,12 +729,13 @@ "id": 1728084091, "info": { "category": "NotAFunctionalItem", - "placements": 22, + "placements": 63, "stats": {}, "description": "CompactCornerRound (1728084091_10|6700787b_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "TX_Corner_Round", "nameStrKey": "strCompactCornerRoundName", @@ -713,7 +751,8 @@ "description": "CompactInnerRound (925214026_10|3725a54a_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "TX_Inner_Round", "nameStrKey": "strCompactInnerRoundName", @@ -724,12 +763,13 @@ "id": 1915435470, "info": { "category": "NotAFunctionalItem", - "placements": 54, + "placements": 63, "stats": {}, "description": "CompactEdgeSlope (1915435470_10|722b39ce_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "TX_Edge_Slope", "nameStrKey": "strCompactEdgeSlopeName", @@ -740,12 +780,13 @@ "id": 1881278783, "info": { "category": "NotAFunctionalItem", - "placements": 22, + "placements": 63, "stats": {}, "description": "CompactCornerSlope (1881278783_10|7022093f_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "TX_Corner_Slope", "nameStrKey": "strCompactCornerSlopeName", @@ -761,7 +802,8 @@ "description": "CompactInnerSlope (1834966563_10|6d5f5e23_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "TX_Inner_Slope", "nameStrKey": "strCompactInnerSlopeName", @@ -772,12 +814,13 @@ "id": 1979640496, "info": { "category": "NotAFunctionalItem", - "placements": 22, + "placements": 63, "stats": {}, "description": "CompactCone (1979640496_10|75feeab0_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "TX_Cone", "nameStrKey": "strCompactConeName", @@ -788,12 +831,13 @@ "id": 979123471, "info": { "category": "NotAFunctionalItem", - "placements": 22, + "placements": 63, "stats": {}, "description": "CompactPyramid (979123471_10|3a5c3d0f_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "TX_Pyramid", "nameStrKey": "strCompactPyramidName", @@ -806,18 +850,18 @@ "category": "NotAFunctionalItem", "placements": 63, "stats": { - "MASS": "5 Kg", - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.50", - "ARMOR": "55", - "OVERCLOCK": "Chassis cubes do not Overclock" + "strMass": "5 [strKilograms]", + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.50", + "strHealth": "55" }, - "description": "A transparent cube made from reinforced space glass used for Robot\ncockpits so the SCU can see out.", + "description": "A transparent cube made from reinforced space glass used for Robot\ncockpits so the SCU can see out. (3327812742_10|c65a6486_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 55 + "health": 55, + "ignore_in_weapon_list": true }, "spriteName": "Glass_Cube", "nameStrKey": "strGlassCubeName", @@ -828,20 +872,20 @@ "id": 4235300269, "info": { "category": "NotAFunctionalItem", - "placements": 54, + "placements": 63, "stats": { - "MASS": "4 Kg", - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.50", - "ARMOR": "55", - "OVERCLOCK": "Chassis cubes do not Overclock" + "strMass": "4 [strKilograms]", + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.50", + "strHealth": "55" }, - "description": "A transparent cube made from reinforced space glass used for Robot\ncockpits so the SCU can see out.", + "description": "A transparent cube made from reinforced space glass used for Robot\ncockpits so the SCU can see out. (4235300269_10|fc718dad_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 55 + "health": 55, + "ignore_in_weapon_list": true }, "spriteName": "Glass_Edge", "nameStrKey": "strGlassEdgeName", @@ -852,20 +896,20 @@ "id": 1094997616, "info": { "category": "NotAFunctionalItem", - "placements": 22, + "placements": 63, "stats": { - "MASS": "3 Kg", - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.50", - "ARMOR": "55", - "OVERCLOCK": "Chassis cubes do not Overclock" + "strMass": "3 [strKilograms]", + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.50", + "strHealth": "55" }, - "description": "A transparent cube made from reinforced space glass used for Robot\ncockpits so the SCU can see out.", + "description": "A transparent cube made from reinforced space glass used for Robot\ncockpits so the SCU can see out. (1094997616_10|41445670_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 55 + "health": 55, + "ignore_in_weapon_list": true }, "spriteName": "Glass_Corner", "nameStrKey": "strGlassCornerName", @@ -878,18 +922,18 @@ "category": "NotAFunctionalItem", "placements": 63, "stats": { - "MASS": "3.35 Kg", - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.50", - "ARMOR": "55", - "OVERCLOCK": "Chassis cubes do not Overclock" + "strMass": "3.35 [strKilograms]", + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.50", + "strHealth": "55" }, - "description": "A transparent cube made from reinforced space glass used for Robot\ncockpits so the SCU can see out.", + "description": "A transparent cube made from reinforced space glass used for Robot\ncockpits so the SCU can see out. (445857183_10|1a933d9f_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 55 + "health": 55, + "ignore_in_weapon_list": true }, "spriteName": "Glass_Inner", "nameStrKey": "strGlassInnerName", @@ -900,12 +944,13 @@ "id": 3629216992, "info": { "category": "NotAFunctionalItem", - "placements": 54, + "placements": 63, "stats": {}, "description": "GlassEdgeRound (3629216992_10|d85174e0_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Glass_Edge_Round", "nameStrKey": "strGlassEdgeRoundName", @@ -916,12 +961,13 @@ "id": 2380494106, "info": { "category": "NotAFunctionalItem", - "placements": 22, + "placements": 63, "stats": {}, "description": "GlassCornerRound (2380494106_10|8de3751a_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Glass_Corner_Round", "nameStrKey": "strGlassCornerRoundName", @@ -937,7 +983,8 @@ "description": "GlassInnerRound (3066776961_10|b6cb4d81_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Glass_Inner_Round", "nameStrKey": "strGlassInnerRoundName", @@ -953,7 +1000,8 @@ "description": "CubewithC6Logo (3367514907_10|c8b8331b_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Cube_with_C6_Logo", "nameStrKey": "strCubewithC6LogoName", @@ -969,7 +1017,8 @@ "description": "CubewithCARBONLetters (2392661891_10|8e9d1f83_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Cube_with_CARBON_Letters", "nameStrKey": "strCubewithCARBONLettersName", @@ -983,41 +1032,62 @@ "placements": 63, "stats": {}, "description": "MediumCubeCardLife (2077855120_10|7bd98d90_16) without a description", - "size": "T2", + "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Medium_Cube_Cardlife", "nameStrKey": "strMediumCubeCardLifeName", "mirrorCubeId": "", - "hexId": "7bd98d90" + "hexId": "7bd98d90", + "tree": { + "position_x": 0, + "position_y": 8, + "tech_points": 57, + "neighbours": [], + "requires": [ + 227205318 + ] + } }, "MediumEdgeCardLife hexCode:14c3e911 intCode:348383505": { "id": 348383505, "info": { "category": "NotAFunctionalItem", - "placements": 54, + "placements": 63, "stats": {}, "description": "MediumEdgeCardLife (348383505_10|14c3e911_16) without a description", - "size": "T2", + "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Medium_Edge_Cardlife", "nameStrKey": "strMediumEdgeCardLifeName", "mirrorCubeId": "", - "hexId": "14c3e911" + "hexId": "14c3e911", + "tree": { + "position_x": 1, + "position_y": 8, + "tech_points": 58, + "neighbours": [], + "requires": [ + 227205318 + ] + } }, "Rod hexCode:6c66f501 intCode:1818686721": { "id": 1818686721, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "Rod (1818686721_10|6c66f501_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Rod", "nameStrKey": "strRodName", @@ -1028,12 +1098,13 @@ "id": 1312806203, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "RodShort (1312806203_10|4e3fd53b_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Rod_Short", "nameStrKey": "strRodShortName", @@ -1044,12 +1115,13 @@ "id": 3489647384, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "RodLong (3489647384_10|cfffcb18_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Rod_Long", "nameStrKey": "strRodLongName", @@ -1060,12 +1132,13 @@ "id": 2454932271, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "RodArc (2454932271_10|92534b2f_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Rod_Arc", "nameStrKey": "strRodArcName", @@ -1076,12 +1149,13 @@ "id": 3568811832, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "RodArcShort (3568811832_10|d4b7bf38_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Rod_Arc_Short", "nameStrKey": "strRodArcShortName", @@ -1092,12 +1166,13 @@ "id": 394503911, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "RodDiagonal2D (394503911_10|1783a6e7_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Rod_Diagonal_2D", "nameStrKey": "strRodDiagonal2DName", @@ -1108,12 +1183,13 @@ "id": 1316425218, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "RodDiagonal2DShort (1316425218_10|4e770e02_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Rod_Diagonal_Short", "nameStrKey": "strRodDiagonal2DShortName", @@ -1124,12 +1200,13 @@ "id": 3705632066, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "RodDiagonal3D (3705632066_10|dcdf7542_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Rod_Diagonal_3D", "nameStrKey": "strRodDiagonal3DName", @@ -1140,12 +1217,13 @@ "id": 1750720388, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "RodPlus (1750720388_10|6859df84_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Rod_Plus", "nameStrKey": "strRodPlusName", @@ -1156,12 +1234,13 @@ "id": 651695911, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "RodSkewedPlus (651695911_10|26d81727_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Rod_Skewed_Plus", "nameStrKey": "strRodSkewedPlusName", @@ -1172,12 +1251,13 @@ "id": 4265819694, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "RodCross (4265819694_10|fe433e2e_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Rod_Cross", "nameStrKey": "strRodCrossName", @@ -1188,12 +1268,13 @@ "id": 4262490755, "info": { "category": "NotAFunctionalItem", - "placements": 0, + "placements": 63, "stats": {}, "description": "Strut (4262490755_10|fe107283_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Strut", "nameStrKey": "strStrutName", @@ -1204,12 +1285,13 @@ "id": 1648206355, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "StrutShort (1648206355_10|623da213_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Strut_Short", "nameStrKey": "strStrutShortName", @@ -1220,12 +1302,13 @@ "id": 3084940372, "info": { "category": "NotAFunctionalItem", - "placements": 0, + "placements": 63, "stats": {}, "description": "StrutLong (3084940372_10|b7e07454_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Strut_Long", "nameStrKey": "strStrutLongName", @@ -1236,12 +1319,13 @@ "id": 743433251, "info": { "category": "NotAFunctionalItem", - "placements": 0, + "placements": 63, "stats": {}, "description": "StrutArc (743433251_10|2c4fe423_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Strut_Arc", "nameStrKey": "strStrutArcName", @@ -1252,12 +1336,13 @@ "id": 2126360617, "info": { "category": "NotAFunctionalItem", - "placements": 0, + "placements": 63, "stats": {}, "description": "StrutSlice (2126360617_10|7ebdb029_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Strut_Slice", "nameStrKey": "strStrutSliceName", @@ -1268,12 +1353,13 @@ "id": 2608938070, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "StrutSliceShort (2608938070_10|9b813c56_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Strut_Slice_Short", "nameStrKey": "strStrutSliceShortName", @@ -1284,12 +1370,13 @@ "id": 3999885169, "info": { "category": "NotAFunctionalItem", - "placements": 0, + "placements": 63, "stats": {}, "description": "StrutRamp (3999885169_10|ee696771_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Strut_Ramp", "nameStrKey": "strStrutRampName", @@ -1300,12 +1387,13 @@ "id": 14694903, "info": { "category": "NotAFunctionalItem", - "placements": 0, + "placements": 63, "stats": {}, "description": "StrutDiagonal2D (14694903_10|00e039f7_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Strut_Diagonal_2D", "nameStrKey": "strStrutDiagonal2DName", @@ -1316,12 +1404,13 @@ "id": 3562021587, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "StrutDiagonal2DShort (3562021587_10|d45022d3_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Strut_Diagonal_Short", "nameStrKey": "strStrutDiagonal2DShortName", @@ -1332,12 +1421,13 @@ "id": 2028802540, "info": { "category": "NotAFunctionalItem", - "placements": 0, + "placements": 63, "stats": {}, "description": "StrutDiagonal3DL (2028802540_10|78ed11ec_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Strut_Diagonal_3D_Left", "nameStrKey": "strStrutDiagonal3DLName", @@ -1348,12 +1438,13 @@ "id": 2002864041, "info": { "category": "NotAFunctionalItem", - "placements": 0, + "placements": 63, "stats": {}, "description": "StrutDiagonal3DR (2002864041_10|776147a9_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Strut_Diagonal_3D_Right", "nameStrKey": "strStrutDiagonal3DRName", @@ -1364,12 +1455,13 @@ "id": 511164535, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "StrutPlus (511164535_10|1e77c077_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Strut_Plus", "nameStrKey": "strStrutPlusName", @@ -1380,12 +1472,13 @@ "id": 1521447199, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "StrutSkewedPlus (1521447199_10|5aaf711f_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Strut_Skewed_Plus", "nameStrKey": "strStrutSkewedPlusName", @@ -1396,12 +1489,13 @@ "id": 787409845, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "StrutCross (787409845_10|2eeeebb5_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Strut_Cross", "nameStrKey": "strStrutCrossName", @@ -1414,17 +1508,18 @@ "category": "NotAFunctionalItem", "placements": 63, "stats": { - "LIFT": "336,000N", - "ARMOR": "606", - "CPU LOAD": "18 pFLOPS", - "ROBOT RANKING": "137,261.00" + "strLiftDS": "336,000N", + "strHealth": "606", + "strCPU": "18 [strPFlops]S", + "strRobotRanking": "137,261.00" }, - "description": "Armored and lighter than air, so can be used to make flying Robots.", + "description": "Armored and lighter than air, so can be used to make flying Robots. (3226650954_10|c052c94a_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 18, - "health": 606 + "health": 606, + "ignore_in_weapon_list": true }, "spriteName": "Helium", "nameStrKey": "strHeliumName", @@ -1435,2356 +1530,4062 @@ "id": 932552373, "info": { "category": "Wheel", - "placements": 2, + "placements": 12, "stats": {}, "description": "T0SteeringWheel (932552373_10|37959eb5_16) without a description", "size": "T0", "type": "Movement", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Steering_Wheel_Tiny", "nameStrKey": "strT0SteeringWheelName", "mirrorCubeId": "", - "hexId": "37959eb5" + "hexId": "37959eb5", + "tree": { + "position_x": 0, + "position_y": 0, + "tech_points": 85, + "neighbours": [], + "requires": [] + } }, "T0Wheel hexCode:6befc670 intCode:1810876016": { "id": 1810876016, "info": { "category": "Wheel", - "placements": 2, + "placements": 12, "stats": {}, "description": "T0Wheel (1810876016_10|6befc670_16) without a description", "size": "T0", "type": "Movement", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Wheel_Tiny", "nameStrKey": "strT0WheelName", "mirrorCubeId": "", - "hexId": "6befc670" + "hexId": "6befc670", + "tree": { + "position_x": 1, + "position_y": 0, + "tech_points": 86, + "neighbours": [ + 932552373 + ], + "requires": [ + 932552373 + ] + } }, "T1SteeringWheel hexCode:0a1f8ccf intCode:169839823": { "id": 169839823, "info": { "category": "Wheel", - "placements": 2, + "placements": 12, "stats": {}, "description": "T1SteeringWheel (169839823_10|0a1f8ccf_16) without a description", "size": "T1", "type": "Movement", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Steering_Wheel_Small", "nameStrKey": "strT1SteeringWheelName", "mirrorCubeId": "", - "hexId": "0a1f8ccf" + "hexId": "0a1f8ccf", + "tree": { + "position_x": 2, + "position_y": 0, + "tech_points": 87, + "neighbours": [ + 1810876016 + ], + "requires": [ + 1810876016 + ] + } }, "T1Wheel hexCode:f8b8b9dd intCode:4172855773": { "id": 4172855773, "info": { "category": "Wheel", - "placements": 2, + "placements": 12, "stats": {}, "description": "T1Wheel (4172855773_10|f8b8b9dd_16) without a description", "size": "T1", "type": "Movement", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Wheel_Small", "nameStrKey": "strT1WheelName", "mirrorCubeId": "", - "hexId": "f8b8b9dd" + "hexId": "f8b8b9dd", + "tree": { + "position_x": 3, + "position_y": 0, + "tech_points": 88, + "neighbours": [ + 169839823 + ], + "requires": [ + 169839823 + ] + } }, "T2SteeringWheel hexCode:b0598626 intCode:2958657062": { "id": 2958657062, "info": { "category": "Wheel", - "placements": 2, + "placements": 12, "stats": {}, "description": "T2SteeringWheel (2958657062_10|b0598626_16) without a description", "size": "T2", "type": "Movement", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Steering_Wheel_Medium", "nameStrKey": "strT2SteeringWheelName", "mirrorCubeId": "", - "hexId": "b0598626" + "hexId": "b0598626", + "tree": { + "position_x": 4, + "position_y": 0, + "tech_points": 89, + "neighbours": [ + 4172855773 + ], + "requires": [ + 4172855773 + ] + } }, "T2Wheel hexCode:ae4bb256 intCode:2924196438": { "id": 2924196438, "info": { "category": "Wheel", - "placements": 2, + "placements": 12, "stats": {}, "description": "T2Wheel (2924196438_10|ae4bb256_16) without a description", "size": "T2", "type": "Movement", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Wheel_Medium", "nameStrKey": "strT2WheelName", "mirrorCubeId": "", - "hexId": "ae4bb256" + "hexId": "ae4bb256", + "tree": { + "position_x": 5, + "position_y": 0, + "tech_points": 90, + "neighbours": [ + 2958657062 + ], + "requires": [ + 2958657062 + ] + } }, "T3SteeringWheel hexCode:462d2e13 intCode:1177366035": { "id": 1177366035, "info": { "category": "Wheel", - "placements": 2, + "placements": 12, "stats": {}, "description": "T3SteeringWheel (1177366035_10|462d2e13_16) without a description", "size": "T3", "type": "Movement", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Steering_Wheel_Large", "nameStrKey": "strT3SteeringWheelName", "mirrorCubeId": "", - "hexId": "462d2e13" + "hexId": "462d2e13", + "tree": { + "position_x": 6, + "position_y": 0, + "tech_points": 91, + "neighbours": [ + 2924196438 + ], + "requires": [ + 2924196438 + ] + } }, "T3Wheel hexCode:b48a1b01 intCode:3028949761": { "id": 3028949761, "info": { "category": "Wheel", - "placements": 2, + "placements": 12, "stats": {}, "description": "T3Wheel (3028949761_10|b48a1b01_16) without a description", "size": "T3", "type": "Movement", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Wheel_Large", "nameStrKey": "strT3WheelName", "mirrorCubeId": "", - "hexId": "b48a1b01" + "hexId": "b48a1b01", + "tree": { + "position_x": 7, + "position_y": 0, + "tech_points": 92, + "neighbours": [ + 1177366035 + ], + "requires": [ + 1177366035 + ] + } }, "T4SteeringWheel hexCode:149105ca intCode:345048522": { "id": 345048522, "info": { "category": "Wheel", - "placements": 2, + "placements": 12, "stats": {}, "description": "T4SteeringWheel (345048522_10|149105ca_16) without a description", "size": "T4", "type": "Movement", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Steering_Wheel_Huge", "nameStrKey": "strT4SteeringWheelName", "mirrorCubeId": "", - "hexId": "149105ca" + "hexId": "149105ca", + "tree": { + "position_x": 8, + "position_y": 0, + "tech_points": 93, + "neighbours": [ + 3028949761 + ], + "requires": [ + 3028949761 + ] + } }, "T4Wheel hexCode:48eb5d0f intCode:1223384335": { "id": 1223384335, "info": { "category": "Wheel", - "placements": 2, + "placements": 12, "stats": {}, "description": "T4Wheel (1223384335_10|48eb5d0f_16) without a description", "size": "T4", "type": "Movement", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Wheel_Huge", "nameStrKey": "strT4WheelName", "mirrorCubeId": "", - "hexId": "48eb5d0f" + "hexId": "48eb5d0f", + "tree": { + "position_x": 9, + "position_y": 0, + "tech_points": 94, + "neighbours": [ + 345048522 + ], + "requires": [ + 345048522 + ] + } }, "T4SteeringWheelCardLife hexCode:01eb245b intCode:32187483": { "id": 32187483, "info": { "category": "Wheel", - "placements": 2, + "placements": 12, "stats": {}, "description": "T4SteeringWheelCardLife (32187483_10|01eb245b_16) without a description", "size": "T4", "type": "Movement", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "T4_Wheel_Cardlife", "nameStrKey": "strT4SteeringWheelCardLifeName", "mirrorCubeId": "", - "hexId": "01eb245b" + "hexId": "01eb245b", + "tree": { + "position_x": 2, + "position_y": 8, + "tech_points": 95, + "neighbours": [], + "requires": [ + 227205318 + ] + } }, "T4WheelCardLife hexCode:7d7ba3f9 intCode:2105254905": { "id": 2105254905, "info": { "category": "Wheel", - "placements": 2, + "placements": 12, "stats": {}, "description": "T4WheelCardLife (2105254905_10|7d7ba3f9_16) without a description", "size": "T4", "type": "Movement", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "T4_Wheel_Cardlife", "nameStrKey": "strT4WheelCardLifeName", "mirrorCubeId": "", - "hexId": "7d7ba3f9" + "hexId": "7d7ba3f9", + "tree": { + "position_x": 3, + "position_y": 8, + "tech_points": 96, + "neighbours": [], + "requires": [ + 227205318 + ] + } }, "T5SteeringWheel hexCode:02df9a33 intCode:48208435": { "id": 48208435, "info": { "category": "Wheel", - "placements": 2, + "placements": 12, "stats": {}, "description": "T5SteeringWheel (48208435_10|02df9a33_16) without a description", "size": "T5", "type": "Movement", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Mega_Wheel_Steering", "nameStrKey": "strT5SteeringWheelName", "mirrorCubeId": "", - "hexId": "02df9a33" + "hexId": "02df9a33", + "tree": { + "position_x": 10, + "position_y": 0, + "tech_points": 97, + "neighbours": [ + 1223384335 + ], + "requires": [ + 1223384335 + ] + } }, "T5Wheel hexCode:c4c3bd27 intCode:3301162279": { "id": 3301162279, "info": { "category": "Wheel", - "placements": 2, + "placements": 12, "stats": {}, "description": "T5Wheel (3301162279_10|c4c3bd27_16) without a description", "size": "T5", "type": "Movement", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Mega_Wheel", "nameStrKey": "strT5WheelName", "mirrorCubeId": "", - "hexId": "c4c3bd27" + "hexId": "c4c3bd27", + "tree": { + "position_x": 11, + "position_y": 0, + "tech_points": 98, + "neighbours": [ + 48208435 + ], + "requires": [ + 48208435 + ] + } }, "T1TankTrack hexCode:f1752e70 intCode:4050988656": { "id": 4050988656, "info": { "category": "TankTrack", - "placements": 2, + "placements": 60, "stats": {}, "description": "T1TankTrack (4050988656_10|f1752e70_16) without a description", "size": "T1", "type": "Movement", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Tank_Track_Tiny", "nameStrKey": "strT1TankTrackName", "mirrorCubeId": "", - "hexId": "f1752e70" + "hexId": "f1752e70", + "tree": { + "position_x": 12, + "position_y": 0, + "tech_points": 99, + "neighbours": [ + 3301162279 + ], + "requires": [ + 3301162279 + ] + } }, "T2TankTrack hexCode:64cc6601 intCode:1691117057": { "id": 1691117057, "info": { "category": "TankTrack", - "placements": 2, + "placements": 60, "stats": { - "MASS": "11786 Kg", - "ARMOR": "2,572", - "CPU LOAD": "36 pFLOP", - "ROBOT RANKING": "708.59", - "MAX SPEED": "88 mph", - "OVERCLOCKER": "Max Speed increases up to 180%." + "strMass": "11786 [strKilograms]", + "strHealth": "2,572", + "strCPU": "36 [strPFlops]", + "strRobotRanking": "708.59", + "strMaxSpeedDS": "88 mph" }, - "description": "Powerful movement type which includes multiple connection points.", + "description": "Powerful movement type which includes multiple connection points. (1691117057_10|64cc6601_16)", "size": "T2", "type": "Movement", "active": true, "cpu": 36, - "health": 2572 + "health": 2572, + "ignore_in_weapon_list": true }, "spriteName": "Tank_Track_Small", "nameStrKey": "strT2TankTrackName", "mirrorCubeId": "", - "hexId": "64cc6601" + "hexId": "64cc6601", + "tree": { + "position_x": 13, + "position_y": 0, + "tech_points": 100, + "neighbours": [ + 4050988656 + ], + "requires": [ + 4050988656 + ] + } }, "T3TankTrack hexCode:0af7e408 intCode:184017928": { "id": 184017928, "info": { "category": "TankTrack", - "placements": 2, + "placements": 60, "stats": { - "MASS": "20357 Kg", - "ARMOR": "6,782", - "CPU LOAD": "40 pFLOP", - "ROBOT RANKING": "5,739.56", - "MAX SPEED": "90 mph", - "OVERCLOCKER": "Max Speed increases up to 180%." + "strMass": "20357 [strKilograms]", + "strHealth": "6,782", + "strCPU": "40 [strPFlops]", + "strRobotRanking": "5,739.56", + "strMaxSpeedDS": "90 mph" }, - "description": "Powerful movement type which includes multiple connection points.", + "description": "Powerful movement type which includes multiple connection points. (184017928_10|0af7e408_16)", "size": "T3", "type": "Movement", "active": true, "cpu": 40, - "health": 6782 + "health": 6782, + "ignore_in_weapon_list": true }, "spriteName": "Tank_Track_Medium", "nameStrKey": "strT3TankTrackName", "mirrorCubeId": "", - "hexId": "0af7e408" + "hexId": "0af7e408", + "tree": { + "position_x": 14, + "position_y": 0, + "tech_points": 101, + "neighbours": [ + 1691117057 + ], + "requires": [ + 1691117057 + ] + } }, "T4TankTrack hexCode:00576a34 intCode:5728820": { "id": 5728820, "info": { "category": "TankTrack", - "placements": 2, + "placements": 60, "stats": { - "MASS": "28929 Kg", - "ARMOR": "14,818", - "CPU LOAD": "44 pFLOP", - "ROBOT RANKING": "46,025.55", - "MAX SPEED": "92 mph", - "OVERCLOCKER": "Max Speed increases up to 180%." + "strMass": "28929 [strKilograms]", + "strHealth": "14,818", + "strCPU": "44 [strPFlops]", + "strRobotRanking": "46,025.55", + "strMaxSpeedDS": "92 mph" }, - "description": "Powerful movement type which includes multiple connection points.", + "description": "Powerful movement type which includes multiple connection points. (5728820_10|00576a34_16)", "size": "T4", "type": "Movement", "active": true, "cpu": 44, - "health": 14818 + "health": 14818, + "ignore_in_weapon_list": true }, "spriteName": "Tank_Track_Large", "nameStrKey": "strT4TankTrackName", "mirrorCubeId": "", - "hexId": "00576a34" + "hexId": "00576a34", + "tree": { + "position_x": 15, + "position_y": 0, + "tech_points": 102, + "neighbours": [ + 184017928 + ], + "requires": [ + 184017928 + ] + } }, "T5TankTrack hexCode:19b4f590 intCode:431289744": { "id": 431289744, "info": { "category": "TankTrack", - "placements": 2, + "placements": 60, "stats": { - "MASS": "37500 Kg", - "ARMOR": "26,319", - "CPU LOAD": "48 pFLOP", - "ROBOT RANKING": "366,028.68", - "MAX SPEED": "94 mph", - "OVERCLOCKER": "Max Speed increases up to 180%." + "strMass": "37500 [strKilograms]", + "strHealth": "26,319", + "strCPU": "48 [strPFlops]", + "strRobotRanking": "366,028.68", + "strMaxSpeedDS": "94 mph" }, - "description": "Powerful movement type which includes multiple connection points.", + "description": "Powerful movement type which includes multiple connection points. (431289744_10|19b4f590_16)", "size": "T5", "type": "Movement", "active": true, "cpu": 48, - "health": 26319 + "health": 26319, + "ignore_in_weapon_list": true }, "spriteName": "Tank_Track_Huge", "nameStrKey": "strT5TankTrackName", "mirrorCubeId": "", - "hexId": "19b4f590" + "hexId": "19b4f590", + "tree": { + "position_x": 0, + "position_y": 1, + "tech_points": 103, + "neighbours": [ + 5728820 + ], + "requires": [ + 5728820 + ] + } }, "T0MechLeg hexCode:b6c71d1e intCode:3066502430": { "id": 3066502430, "info": { "category": "MechLeg", - "placements": 2, + "placements": 3, "stats": {}, "description": "T0MechLeg (3066502430_10|b6c71d1e_16) without a description", "size": "T0", "type": "Movement", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Mech_Leg_Tiny", "nameStrKey": "strT0MechLegName", "mirrorCubeId": "", - "hexId": "b6c71d1e" + "hexId": "b6c71d1e", + "tree": { + "position_x": 1, + "position_y": 1, + "tech_points": 104, + "neighbours": [ + 431289744 + ], + "requires": [ + 431289744 + ] + } }, "T1MechLeg hexCode:048a9b04 intCode:76192516": { "id": 76192516, "info": { "category": "MechLeg", - "placements": 2, + "placements": 3, "stats": {}, "description": "T1MechLeg (76192516_10|048a9b04_16) without a description", "size": "T1", "type": "Movement", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Mech_Leg_Small", "nameStrKey": "strT1MechLegName", "mirrorCubeId": "", - "hexId": "048a9b04" + "hexId": "048a9b04", + "tree": { + "position_x": 2, + "position_y": 1, + "tech_points": 105, + "neighbours": [ + 3066502430 + ], + "requires": [ + 3066502430 + ] + } }, "T2MechLeg hexCode:6ab1190d intCode:1789991181": { "id": 1789991181, "info": { "category": "MechLeg", - "placements": 2, + "placements": 3, "stats": {}, "description": "T2MechLeg (1789991181_10|6ab1190d_16) without a description", "size": "T2", "type": "Movement", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Mech_Leg_Medium", "nameStrKey": "strT2MechLegName", "mirrorCubeId": "", - "hexId": "6ab1190d" + "hexId": "6ab1190d", + "tree": { + "position_x": 3, + "position_y": 1, + "tech_points": 106, + "neighbours": [ + 76192516 + ], + "requires": [ + 76192516 + ] + } }, "T3MechLeg hexCode:60119731 intCode:1611765553": { "id": 1611765553, "info": { "category": "MechLeg", - "placements": 2, + "placements": 3, "stats": {}, "description": "T3MechLeg (1611765553_10|60119731_16) without a description", "size": "T3", "type": "Movement", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Mech_Leg_Large", "nameStrKey": "strT3MechLegName", "mirrorCubeId": "", - "hexId": "60119731" + "hexId": "60119731", + "tree": { + "position_x": 4, + "position_y": 1, + "tech_points": 107, + "neighbours": [ + 1789991181 + ], + "requires": [ + 1789991181 + ] + } }, "T4MechLeg hexCode:922f6341 intCode:2452579137": { "id": 2452579137, "info": { "category": "MechLeg", - "placements": 2, + "placements": 3, "stats": {}, "description": "T4MechLeg (2452579137_10|922f6341_16) without a description", "size": "T4", "type": "Movement", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Mech_Leg_Huge", "nameStrKey": "strT4MechLegName", "mirrorCubeId": "", - "hexId": "922f6341" + "hexId": "922f6341", + "tree": { + "position_x": 5, + "position_y": 1, + "tech_points": 108, + "neighbours": [ + 1611765553 + ], + "requires": [ + 1611765553 + ] + } }, "T5MechLeg hexCode:f6c88297 intCode:4140335767": { "id": 4140335767, "info": { "category": "MechLeg", - "placements": 2, + "placements": 3, "stats": {}, "description": "T5MechLeg (4140335767_10|f6c88297_16) without a description", "size": "T5", "type": "Movement", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Mega_Mech_Leg", "nameStrKey": "strT5MechLegName", "mirrorCubeId": "", - "hexId": "f6c88297" + "hexId": "f6c88297", + "tree": { + "position_x": 6, + "position_y": 1, + "tech_points": 109, + "neighbours": [ + 2452579137 + ], + "requires": [ + 2452579137 + ] + } }, "T3SprinterLeg hexCode:c767dd68 intCode:3345472872": { "id": 3345472872, "info": { "category": "SprinterLeg", - "placements": 2, + "placements": 3, "stats": {}, "description": "T3SprinterLeg (3345472872_10|c767dd68_16) without a description", "size": "T3", "type": "Movement", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Sprinter_Leg_Small", "nameStrKey": "strT3SprinterLegName", "mirrorCubeId": "", - "hexId": "c767dd68" + "hexId": "c767dd68", + "tree": { + "position_x": 7, + "position_y": 1, + "tech_points": 110, + "neighbours": [ + 4140335767 + ], + "requires": [ + 4140335767 + ] + } }, "T4SprinterLeg hexCode:45aebff7 intCode:1169080311": { "id": 1169080311, "info": { "category": "SprinterLeg", - "placements": 2, + "placements": 3, "stats": {}, "description": "T4SprinterLeg (1169080311_10|45aebff7_16) without a description", "size": "T4", "type": "Movement", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Sprinter_Leg_Large", "nameStrKey": "strT4SprinterLegName", "mirrorCubeId": "", - "hexId": "45aebff7" + "hexId": "45aebff7", + "tree": { + "position_x": 8, + "position_y": 1, + "tech_points": 111, + "neighbours": [ + 3345472872 + ], + "requires": [ + 3345472872 + ] + } }, "T4SprinterLegCarbon6 hexCode:93783fc5 intCode:2474131397": { "id": 2474131397, "info": { "category": "SprinterLeg", - "placements": 2, + "placements": 3, "stats": {}, "description": "T4SprinterLegCarbon6 (2474131397_10|93783fc5_16) without a description", "size": "T4", "type": "Movement", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Sprinter_Leg_Large_Carbon_6", "nameStrKey": "strT4SprinterLegCarbon6Name", "mirrorCubeId": "", - "hexId": "93783fc5" + "hexId": "93783fc5", + "tree": { + "position_x": 4, + "position_y": 8, + "tech_points": 112, + "neighbours": [], + "requires": [ + 227205318 + ] + } }, "T3InsectLeg hexCode:079bf4af intCode:127661231": { "id": 127661231, "info": { "category": "InsectLeg", - "placements": 2, + "placements": 60, "stats": { - "CPU": "42 pFLOPS", - "ROBOT RANKING": "43,933", - "ARMOR": "12,447", - "CARRYING CAPACITY": "1,191 Kg", - "MASS": "12.5 Kg" + "strCPU": "42 [strPFlops]S", + "strRobotRanking": "43,933", + "strHealth": "12,447", + "strCapacity": "1,191 [strKilograms]", + "strMass": "12.5 [strKilograms]" }, - "description": "Faster, more heavily armored, and can carry more mass than the T7\nLeg.", + "description": "Faster, more heavily armored, and can carry more mass than the T7\nLeg. (127661231_10|079bf4af_16)", "size": "T3", "type": "Movement", "active": true, - "health": 12447 + "health": 12447, + "ignore_in_weapon_list": true }, "spriteName": "Insect_Leg_Large", "nameStrKey": "strT3InsectLegName", "mirrorCubeId": "", - "hexId": "079bf4af" + "hexId": "079bf4af", + "tree": { + "position_x": 9, + "position_y": 1, + "tech_points": 113, + "neighbours": [ + 1169080311 + ], + "requires": [ + 1169080311 + ] + } }, "T3InsectLegBladed hexCode:9f3a3d02 intCode:2671394050": { "id": 2671394050, "info": { "category": "InsectLeg", - "placements": 2, + "placements": 60, "stats": { - "CPU": "40 pFLOPS", - "ROBOT RANKING": "9,766", - "ARMOR": "9,958", - "CARRYING CAPACITY": "1,050 Kg", - "MASS": "12.5 Kg" + "strCPU": "40 [strPFlops]S", + "strRobotRanking": "9,766", + "strHealth": "9,958", + "strCapacity": "1,050 [strKilograms]", + "strMass": "12.5 [strKilograms]" }, - "description": "Wolf Legs spike into terrain allowing Robots to scale sheer cliff\nfaces and hang upside down. They can also jump and crouch.", + "description": "Wolf Legs spike into terrain allowing Robots to scale sheer cliff\nfaces and hang upside down. They can also jump and crouch. (2671394050_10|9f3a3d02_16)", "size": "T3", "type": "Movement", "active": true, - "health": 9958 + "health": 9958, + "ignore_in_weapon_list": true }, "spriteName": "Insect_Leg_Large_Overwolf", "nameStrKey": "strT3InsectLegBladedName", "mirrorCubeId": "", - "hexId": "9f3a3d02" + "hexId": "9f3a3d02", + "tree": { + "position_x": 10, + "position_y": 1, + "tech_points": 114, + "neighbours": [ + 127661231 + ], + "requires": [ + 127661231 + ] + } }, "T4InsectLeg hexCode:637741e5 intCode:1668760037": { "id": 1668760037, "info": { "category": "InsectLeg", - "placements": 2, + "placements": 60, "stats": { - "CPU": "46 pFLOPS", - "ROBOT RANKING": "350,777", - "ARMOR": "22,108", - "CARRYING CAPACITY": "1,500 Kg", - "MASS": "15 Kg" + "strCPU": "46 [strPFlops]S", + "strRobotRanking": "350,777", + "strHealth": "22,108", + "strCapacity": "1,500 [strKilograms]", + "strMass": "15 [strKilograms]" }, - "description": "Can carry extremely heavily armored Robots up sheer faces at fantastic\nspeeds.", + "description": "Can carry extremely heavily armored Robots up sheer faces at fantastic\nspeeds. (1668760037_10|637741e5_16)", "size": "T4", "type": "Movement", "active": true, - "health": 22108 + "health": 22108, + "ignore_in_weapon_list": true }, "spriteName": "Insect_Leg_Huge", "nameStrKey": "strT4InsectLegName", "mirrorCubeId": "", - "hexId": "637741e5" + "hexId": "637741e5", + "tree": { + "position_x": 11, + "position_y": 1, + "tech_points": 115, + "neighbours": [ + 2671394050 + ], + "requires": [ + 2671394050 + ] + } }, "T4InsectLegSpider hexCode:342d70cd intCode:875393229": { "id": 875393229, "info": { "category": "InsectLeg", - "placements": 2, + "placements": 60, "stats": {}, "description": "T4InsectLegSpider (875393229_10|342d70cd_16) without a description", "size": "T4", "type": "Movement", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Insect_Leg_Huge_Spider", "nameStrKey": "strT4InsectLegSpiderName", "mirrorCubeId": "", - "hexId": "342d70cd" + "hexId": "342d70cd", + "tree": { + "position_x": 5, + "position_y": 8, + "tech_points": 116, + "neighbours": [], + "requires": [ + 227205318 + ] + } }, "T2Ski hexCode:14b4c4e3 intCode:347391203": { "id": 347391203, "info": { "category": "Ski", - "placements": 2, + "placements": 3, "stats": { - "ARMOR": "1170", - "CPU LOAD": "25 pFLOP", - "ROBOT RANKING": "1329", - "MASS": "10 Kg" + "strHealth": "1170", + "strCPU": "25 [strPFlops]", + "strRobotRanking": "1329", + "strMass": "10 [strKilograms]" }, - "description": "A Straight Ski that allows light Robots to slide quickly over terrain.", + "description": "A Straight Ski that allows light Robots to slide quickly over terrain. (347391203_10|14b4c4e3_16)", "size": "T2", "type": "Movement", "active": true, "cpu": 25, - "health": 1170 + "health": 1170, + "ignore_in_weapon_list": true }, "spriteName": "Ski", "nameStrKey": "strT2SkiName", "mirrorCubeId": "", - "hexId": "14b4c4e3" + "hexId": "14b4c4e3", + "tree": { + "position_x": 13, + "position_y": 5, + "tech_points": 357, + "neighbours": [ + 344080878 + ], + "requires": [ + 344080878 + ] + } }, "T2SteeringSki hexCode:b79e9a9b intCode:3080624795": { "id": 3080624795, "info": { "category": "Ski", - "placements": 2, + "placements": 3, "stats": { - "ARMOR": "1170", - "CPU LOAD": "25 pFLOP", - "ROBOT RANKING": "1329", - "MASS": "10 Kg" + "strHealth": "1170", + "strCPU": "25 [strPFlops]", + "strRobotRanking": "1329", + "strMass": "10 [strKilograms]" }, - "description": "A Steering Ski that allows light Robots to slide quickly over terrain.", + "description": "A Steering Ski that allows light Robots to slide quickly over terrain. (3080624795_10|b79e9a9b_16)", "size": "T2", "type": "Movement", "active": true, "cpu": 25, - "health": 1170 + "health": 1170, + "ignore_in_weapon_list": true }, "spriteName": "Steering_Ski", "nameStrKey": "strT2SteeringSkiName", "mirrorCubeId": "", - "hexId": "b79e9a9b" + "hexId": "b79e9a9b", + "tree": { + "position_x": 13, + "position_y": 1, + "tech_points": 118, + "neighbours": [ + 347391203 + ], + "requires": [ + 347391203 + ] + } }, "T0Hover hexCode:6e5ee8c2 intCode:1851713730": { "id": 1851713730, "info": { "category": "Hover", - "placements": 2, + "placements": 60, "stats": { - "TOP SPEED": "62 MPH", - "MAX LIFT": "395,136N", - "ROBOT RANKING": "56.70", - "ARMOR": "321", - "CPU LOAD": "21 pFLOPS", - "MASS": "5 Kg" + "strMaxSpeedDS": "62 MPH", + "strLiftDS": "395,136N", + "strRobotRanking": "56.70", + "strHealth": "321", + "strCPU": "21 [strPFlops]S", + "strMass": "5 [strKilograms]" }, - "description": "A higher performance and more heavily armoured version of the T1\nHover Blade.", + "description": "A higher performance and more heavily armoured version of the T1\nHover Blade. (1851713730_10|6e5ee8c2_16)", "size": "T0", "type": "Movement", "active": true, "cpu": 21, - "health": 321 + "health": 321, + "ignore_in_weapon_list": true }, "spriteName": "Hover_Blade_Tiny", "nameStrKey": "strT0HoverName", "mirrorCubeId": "", - "hexId": "6e5ee8c2" + "hexId": "6e5ee8c2", + "tree": { + "position_x": 14, + "position_y": 1, + "tech_points": 119, + "neighbours": [ + 3080624795 + ], + "requires": [ + 3080624795 + ] + } }, "T1Hover hexCode:bd0103b0 intCode:3170960304": { "id": 3170960304, "info": { "category": "Hover", - "placements": 2, + "placements": 60, "stats": { - "TOP SPEED": "65 MPH", - "MAX LIFT": "618,240N", - "ROBOT RANKING": "452.71", - "ARMOR": "1,003", - "CPU LOAD": "23 pFLOPS", - "MASS": "7.5 Kg" + "strMaxSpeedDS": "65 MPH", + "strLiftDS": "618,240N", + "strRobotRanking": "452.71", + "strHealth": "1,003", + "strCPU": "23 [strPFlops]S", + "strMass": "7.5 [strKilograms]" }, - "description": "A higher performance and more heavily armoured version of the T3\nHover Blade.", + "description": "A higher performance and more heavily armoured version of the T3\nHover Blade. (3170960304_10|bd0103b0_16)", "size": "T1", "type": "Movement", "active": true, "cpu": 23, - "health": 1003 + "health": 1003, + "ignore_in_weapon_list": true }, "spriteName": "Hover_Blade_Small", "nameStrKey": "strT1HoverName", "mirrorCubeId": "", - "hexId": "bd0103b0" + "hexId": "bd0103b0", + "tree": { + "position_x": 15, + "position_y": 1, + "tech_points": 120, + "neighbours": [ + 1851713730 + ], + "requires": [ + 1851713730 + ] + } }, "T2Hover hexCode:61c01a62 intCode:1639979618": { "id": 1639979618, "info": { "category": "Hover", - "placements": 2, + "placements": 60, "stats": { - "TOP SPEED": "68 MPH", - "MAX LIFT": "817,152N", - "ROBOT RANKING": "3587.00", - "ARMOR": "2,645", - "CPU LOAD": "25 pFLOPS", - "MASS": "10 Kg" + "strMaxSpeedDS": "68 MPH", + "strLiftDS": "817,152N", + "strRobotRanking": "3587.00", + "strHealth": "2,645", + "strCPU": "25 [strPFlops]S", + "strMass": "10 [strKilograms]" }, - "description": "A higher performance and more heavily armoured version of the T5\nHover Blade.", + "description": "A higher performance and more heavily armoured version of the T5\nHover Blade. (1639979618_10|61c01a62_16)", "size": "T2", "type": "Movement", "active": true, "cpu": 25, - "health": 2645 + "health": 2645, + "ignore_in_weapon_list": true }, "spriteName": "Hover_Blade_Medium", "nameStrKey": "strT2HoverName", "mirrorCubeId": "", - "hexId": "61c01a62" + "hexId": "61c01a62", + "tree": { + "position_x": 0, + "position_y": 2, + "tech_points": 121, + "neighbours": [ + 3170960304 + ], + "requires": [ + 3170960304 + ] + } }, "T3Hover hexCode:1bbed555 intCode:465491285": { "id": 465491285, "info": { "category": "Hover", - "placements": 2, + "placements": 60, "stats": { - "TOP SPEED": "71 MPH", - "MAX LIFT": "999,744N", - "ROBOT RANKING": "28,243.00", - "ARMOR": "5,779", - "CPU LOAD": "27 pFLOPS", - "MASS": "12.5 Kg" + "strMaxSpeedDS": "71 MPH", + "strLiftDS": "999,744N", + "strRobotRanking": "28,243.00", + "strHealth": "5,779", + "strCPU": "27 [strPFlops]S", + "strMass": "12.5 [strKilograms]" }, - "description": "A higher performance and more heavily armoured version of the T7\nHover Blade.", + "description": "A higher performance and more heavily armoured version of the T7\nHover Blade. (465491285_10|1bbed555_16)", "size": "T3", "type": "Movement", "active": true, "cpu": 27, - "health": 5779 + "health": 5779, + "ignore_in_weapon_list": true }, "spriteName": "Hover_Blade_Large", "nameStrKey": "strT3HoverName", "mirrorCubeId": "", - "hexId": "1bbed555" + "hexId": "1bbed555", + "tree": { + "position_x": 1, + "position_y": 2, + "tech_points": 122, + "neighbours": [ + 1639979618 + ], + "requires": [ + 1639979618 + ] + } }, "T4Hover hexCode:c77fcc87 intCode:3347041415": { "id": 3347041415, "info": { "category": "Hover", - "placements": 2, + "placements": 60, "stats": { - "TOP SPEED": "74 MPH", - "MAX LIFT": "1,152,000N", - "ROBOT RANKING": "221,142.00", - "ARMOR": "10,264", - "CPU LOAD": "29 pFLOPS", - "MASS": "15 Kg" + "strMaxSpeedDS": "74 MPH", + "strLiftDS": "1,152,000N", + "strRobotRanking": "221,142.00", + "strHealth": "10,264", + "strCPU": "29 [strPFlops]S", + "strMass": "15 [strKilograms]" }, - "description": "A higher performance and more heavily armoured version of the T9\nHover Blade.", + "description": "A higher performance and more heavily armoured version of the T9\nHover Blade. (3347041415_10|c77fcc87_16)", "size": "T4", "type": "Movement", "active": true, "cpu": 29, - "health": 10264 + "health": 10264, + "ignore_in_weapon_list": true }, "spriteName": "Hover_Blade_Huge", "nameStrKey": "strT4HoverName", "mirrorCubeId": "", - "hexId": "c77fcc87" + "hexId": "c77fcc87", + "tree": { + "position_x": 2, + "position_y": 2, + "tech_points": 123, + "neighbours": [ + 465491285 + ], + "requires": [ + 465491285 + ] + } }, "T5Hover hexCode:e4989890 intCode:3835205776": { "id": 3835205776, "info": { "category": "Hover", - "placements": 2, + "placements": 60, "stats": { - "TOP SPEED": "74 MPH", - "MAX LIFT": "2,139,426N", - "ROBOT RANKING": "11,118,121", - "ARMOR": "17,417", - "CPU LOAD": "200 pFLOPS", - "MASS": "50 Kg" + "strMaxSpeedDS": "74 MPH", + "strLiftDS": "2,139,426N", + "strRobotRanking": "11,118,121", + "strHealth": "17,417", + "strCPU": "200 [strPFlops]S", + "strMass": "50 [strKilograms]" }, - "description": "A Massive Massive Hoverblade.", + "description": "A Massive Massive Hoverblade. (3835205776_10|e4989890_16)", "size": "T5", "type": "Movement", "active": true, "cpu": 200, - "health": 17417 + "health": 17417, + "ignore_in_weapon_list": true }, "spriteName": "Mega_Hover_Blade", "nameStrKey": "strT5HoverName", "mirrorCubeId": "", - "hexId": "e4989890" + "hexId": "e4989890", + "tree": { + "position_x": 3, + "position_y": 2, + "tech_points": 124, + "neighbours": [ + 3347041415 + ], + "requires": [ + 3347041415 + ] + } }, "T1Thruster hexCode:325a4b05 intCode:844778245": { "id": 844778245, "info": { "category": "Thruster", - "placements": 2, + "placements": 63, "stats": { - "THRUST": "90,667N", - "CPU LOAD": "11 pFLOPS", - "ROBOT RANKING": "29.70", - "ARMOR": "164", - "MASS": "5 Kg" + "strCPU": "11 [strPFlops]S", + "strRobotRanking": "29.70", + "strHealth": "164", + "strMass": "5 [strKilograms]" }, - "description": "A more powerful and more armoured version of the T1 Thruster.", + "description": "A more powerful and more armoured version of the T1 Thruster. (844778245_10|325a4b05_16)", "size": "T1", "type": "Movement", "active": true, "cpu": 11, - "health": 164 + "health": 164, + "ignore_in_weapon_list": true }, "spriteName": "Thruster_Tiny", "nameStrKey": "strT1ThrusterName", "mirrorCubeId": "", - "hexId": "325a4b05" + "hexId": "325a4b05", + "tree": { + "position_x": 4, + "position_y": 2, + "tech_points": 125, + "neighbours": [ + 3835205776 + ], + "requires": [ + 3835205776 + ] + } }, "T2Thruster hexCode:94e59de0 intCode:2498076128": { "id": 2498076128, "info": { "category": "Thruster", - "placements": 2, + "placements": 63, "stats": { - "THRUST": "176,000N", - "CPU LOAD": "13 pFLOPS", - "ROBOT RANKING": "255.88", - "ARMOR": "514", - "MASS": "7.5 Kg" + "strCPU": "13 [strPFlops]S", + "strRobotRanking": "255.88", + "strHealth": "514", + "strMass": "7.5 [strKilograms]" }, - "description": "A more powerful and more armoured version of the T3 Thruster.", + "description": "A more powerful and more armoured version of the T3 Thruster. (2498076128_10|94e59de0_16)", "size": "T2", "type": "Movement", "active": true, "cpu": 13, - "health": 514 + "health": 514, + "ignore_in_weapon_list": true }, "spriteName": "Thruster_Small", "nameStrKey": "strT2ThrusterName", "mirrorCubeId": "", - "hexId": "94e59de0" + "hexId": "94e59de0", + "tree": { + "position_x": 5, + "position_y": 2, + "tech_points": 126, + "neighbours": [ + 844778245 + ], + "requires": [ + 844778245 + ] + } }, "T3Thruster hexCode:e06375b2 intCode:3764614578": { "id": 3764614578, "info": { "category": "Thruster", - "placements": 2, + "placements": 63, "stats": { - "THRUST": "261,333N", - "CPU LOAD": "15 pFLOPS", - "ROBOT RANKING": "2152.00", - "ARMOR": "1356", - "MASS": "10 Kg" + "strCPU": "15 [strPFlops]S", + "strRobotRanking": "2152.00", + "strHealth": "1356", + "strMass": "10 [strKilograms]" }, - "description": "A more powerful and more armoured version of the T5 Thruster.", + "description": "A more powerful and more armoured version of the T5 Thruster. (3764614578_10|e06375b2_16)", "size": "T3", "type": "Movement", "active": true, "cpu": 15, - "health": 1356 + "health": 1356, + "ignore_in_weapon_list": true }, "spriteName": "Thruster_Medium", "nameStrKey": "strT3ThrusterName", "mirrorCubeId": "", - "hexId": "e06375b2" + "hexId": "e06375b2", + "tree": { + "position_x": 6, + "position_y": 2, + "tech_points": 127, + "neighbours": [ + 2498076128 + ], + "requires": [ + 2498076128 + ] + } }, "T4Thruster hexCode:eac3fb8e intCode:3938712462": { "id": 3938712462, "info": { "category": "Thruster", - "placements": 2, + "placements": 63, "stats": { - "THRUST": "346,667N", - "CPU LOAD": "17 pFLOPS", - "ROBOT RANKING": "17,783.00", - "ARMOR": "2964", - "MASS": "12.5 Kg" + "strCPU": "17 [strPFlops]S", + "strRobotRanking": "17,783.00", + "strHealth": "2964", + "strMass": "12.5 [strKilograms]" }, - "description": "A more powerful and more armoured version of the T7 Thruster.", + "description": "A more powerful and more armoured version of the T7 Thruster. (3938712462_10|eac3fb8e_16)", "size": "T4", "type": "Movement", "active": true, "cpu": 17, - "health": 2964 + "health": 2964, + "ignore_in_weapon_list": true }, "spriteName": "Thruster_Large", "nameStrKey": "strT4ThrusterName", "mirrorCubeId": "", - "hexId": "eac3fb8e" + "hexId": "eac3fb8e", + "tree": { + "position_x": 7, + "position_y": 2, + "tech_points": 128, + "neighbours": [ + 3764614578 + ], + "requires": [ + 3764614578 + ] + } }, "T5Thruster hexCode:b105d593 intCode:2969949587": { "id": 2969949587, "info": { "category": "Thruster", - "placements": 2, + "placements": 63, "stats": { - "THRUST": "432,000N", - "CPU LOAD": "19 pFLOPS", - "ROBOT RANKING": "144,886.00", - "ARMOR": "5264", - "MASS": "15 Kg" + "strCPU": "19 [strPFlops]S", + "strRobotRanking": "144,886.00", + "strHealth": "5264", + "strMass": "15 [strKilograms]" }, - "description": "A more powerful and more armoured version of the T9 Thruster.", + "description": "A more powerful and more armoured version of the T9 Thruster. (2969949587_10|b105d593_16)", "size": "T5", "type": "Movement", "active": true, "cpu": 19, - "health": 5264 + "health": 5264, + "ignore_in_weapon_list": true }, "spriteName": "Thruster_Huge", "nameStrKey": "strT5ThrusterName", "mirrorCubeId": "", - "hexId": "b105d593" + "hexId": "b105d593", + "tree": { + "position_x": 8, + "position_y": 2, + "tech_points": 129, + "neighbours": [ + 3938712462 + ], + "requires": [ + 3938712462 + ] + } }, "T5ThrusterCarbon6 hexCode:384998ef intCode:944347375": { "id": 944347375, "info": { "category": "Thruster", - "placements": 2, + "placements": 63, "stats": {}, "description": "T5ThrusterCarbon6 (944347375_10|384998ef_16) without a description", "size": "T5", "type": "Movement", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Thruster_Huge_Carbon_6", "nameStrKey": "strT5ThrusterCarbon6Name", "mirrorCubeId": "", - "hexId": "384998ef" + "hexId": "384998ef", + "tree": { + "position_x": 6, + "position_y": 8, + "tech_points": 130, + "neighbours": [], + "requires": [ + 227205318 + ] + } }, "T3Propeller hexCode:c3df94b7 intCode:3286209719": { "id": 3286209719, "info": { "category": "Propeller", - "placements": 2, + "placements": 63, "stats": {}, "description": "T3Propeller (3286209719_10|c3df94b7_16) without a description", "size": "T3", "type": "Movement", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "propeller_small", "nameStrKey": "strT3PropellerName", "mirrorCubeId": "", - "hexId": "c3df94b7" + "hexId": "c3df94b7", + "tree": { + "position_x": 9, + "position_y": 2, + "tech_points": 131, + "neighbours": [ + 2969949587 + ], + "requires": [ + 2969949587 + ] + } }, "T4Propeller hexCode:a5f8dace intCode:2784549582": { "id": 2784549582, "info": { "category": "Propeller", - "placements": 2, + "placements": 63, "stats": {}, "description": "T4Propeller (2784549582_10|a5f8dace_16) without a description", "size": "T4", "type": "Movement", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "propeller_large", "nameStrKey": "strT4PropellerName", "mirrorCubeId": "", - "hexId": "a5f8dace" + "hexId": "a5f8dace", + "tree": { + "position_x": 10, + "position_y": 2, + "tech_points": 132, + "neighbours": [ + 3286209719 + ], + "requires": [ + 3286209719 + ] + } }, "T2Rotor hexCode:eb45664f intCode:3947193935": { "id": 3947193935, "info": { "category": "Rotor", - "placements": 62, + "placements": 60, "stats": { - "MASS": "12.5 Kg", - "CPU LOAD": "31 pFLOPS", - "ROBOT RANKING": "4448", - "ARMOR": "4476" + "strMass": "12.5 [strKilograms]", + "strCPU": "31 [strPFlops]S", + "strRobotRanking": "4448", + "strHealth": "4476" }, - "description": "Stable hover flight at high altitude, with multiple connections for\nadded toughness.", + "description": "Stable hover flight at high altitude, with multiple connections for\nadded toughness. (3947193935_10|eb45664f_16)", "size": "T2", "type": "Movement", "active": true, "cpu": 31, - "health": 4476 + "health": 4476, + "ignore_in_weapon_list": true }, "spriteName": "Rotor_Blade_Medium", "nameStrKey": "strT2RotorName", "mirrorCubeId": "", - "hexId": "eb45664f" + "hexId": "eb45664f", + "tree": { + "position_x": 11, + "position_y": 2, + "tech_points": 133, + "neighbours": [ + 2784549582 + ], + "requires": [ + 2784549582 + ] + } }, "T3Rotor hexCode:e1e5e873 intCode:3789940851": { "id": 3789940851, "info": { "category": "Rotor", - "placements": 62, + "placements": 60, "stats": { - "MASS": "17.5 Kg", - "CPU LOAD": "34 pFLOPS", - "ROBOT RANKING": "35565", - "ARMOR": "11,558" + "strMass": "17.5 [strKilograms]", + "strCPU": "34 [strPFlops]S", + "strRobotRanking": "35565", + "strHealth": "11,558" }, - "description": "Stable hover flight at high altitude, with multiple connections for\nadded toughness.", + "description": "Stable hover flight at high altitude, with multiple connections for\nadded toughness. (3789940851_10|e1e5e873_16)", "size": "T3", "type": "Movement", "active": true, "cpu": 34, - "health": 11558 + "health": 11558, + "ignore_in_weapon_list": true }, "spriteName": "Rotor_Blade_Large", "nameStrKey": "strT3RotorName", "mirrorCubeId": "", - "hexId": "e1e5e873" + "hexId": "e1e5e873", + "tree": { + "position_x": 12, + "position_y": 2, + "tech_points": 134, + "neighbours": [ + 3947193935 + ], + "requires": [ + 3947193935 + ] + } }, "T4Rotor hexCode:6b758638 intCode:1802864184": { "id": 1802864184, "info": { "category": "Rotor", - "placements": 62, + "placements": 60, "stats": { - "MASS": "22.5 Kg", - "CPU LOAD": "36 pFLOPS", - "ROBOT RANKING": "274522", - "ARMOR": "23,687" + "strMass": "22.5 [strKilograms]", + "strCPU": "36 [strPFlops]S", + "strRobotRanking": "274522", + "strHealth": "23,687" }, - "description": "Stable hover flight at high altitude, with multiple connections for\nadded toughness.", + "description": "Stable hover flight at high altitude, with multiple connections for\nadded toughness. (1802864184_10|6b758638_16)", "size": "T4", "type": "Movement", "active": true, "cpu": 36, - "health": 23687 + "health": 23687, + "ignore_in_weapon_list": true }, "spriteName": "Rotor_Blade_Huge", "nameStrKey": "strT4RotorName", "mirrorCubeId": "", - "hexId": "6b758638" + "hexId": "6b758638", + "tree": { + "position_x": 13, + "position_y": 2, + "tech_points": 135, + "neighbours": [ + 3789940851 + ], + "requires": [ + 3789940851 + ] + } }, "T2Wing hexCode:ed482724 intCode:3980928804": { "id": 3980928804, "info": { "category": "Wing", - "placements": 2, + "placements": 60, "stats": { - "CPU": "23pFLOPS", - "ROBOT RANKING": "453.00", - "ARMOR": "1,029", - "LOAD CAPACITY PER WING": "545Kg", - "MASS": "7.5 Kg" + "strCPU": "23[strPFlops]S", + "strRobotRanking": "453.00", + "strHealth": "1,029", + "strCapacity": "545[strKilograms]", + "strMass": "7.5 [strKilograms]" }, - "description": "Aerofoil stabilises aircraft and allows for midflight agility control\nand tight manouvres.", + "description": "Aerofoil stabilises aircraft and allows for midflight agility control\nand tight manouvres. (3980928804_10|ed482724_16)", "size": "T2", "type": "Movement", "active": true, - "health": 1029 + "health": 1029, + "ignore_in_weapon_list": true }, "spriteName": "Wing_Small", "nameStrKey": "strT2WingName", "mirrorCubeId": "", - "hexId": "ed482724" + "hexId": "ed482724", + "tree": { + "position_x": 14, + "position_y": 2, + "tech_points": 136, + "neighbours": [ + 1802864184 + ], + "requires": [ + 1802864184 + ] + } }, "T3Wing hexCode:8373a52d intCode:2205394221": { "id": 2205394221, "info": { "category": "Wing", - "placements": 2, + "placements": 60, "stats": { - "CPU": "25 pFLOPS", - "ROBOT RANKING": "3,587.00", - "ARMOR": "2,713", - "LOAD CAPACITY PER WING": "753.8 Kg", - "MASS": "10 Kg" + "strCPU": "25 [strPFlops]S", + "strRobotRanking": "3,587.00", + "strHealth": "2,713", + "strCapacity": "753.8 [strKilograms]", + "strMass": "10 [strKilograms]" }, - "description": "Aerofoil stabilises aircraft and allows for midflight agility control\nand tight manouvres. Has more armour and Load capacity than the T5 Wings", + "description": "Aerofoil stabilises aircraft and allows for midflight agility control\nand tight manouvres. Has more armour and Load capacity than the T5 Wings (2205394221_10|8373a52d_16)", "size": "T3", "type": "Movement", "active": true, - "health": 2713 + "health": 2713, + "ignore_in_weapon_list": true }, "spriteName": "Wing_Medium", "nameStrKey": "strT3WingName", "mirrorCubeId": "", - "hexId": "8373a52d" + "hexId": "8373a52d", + "tree": { + "position_x": 15, + "position_y": 2, + "tech_points": 137, + "neighbours": [ + 3980928804 + ], + "requires": [ + 3980928804 + ] + } }, "T4Wing hexCode:89d32b11 intCode:2312317713": { "id": 2312317713, "info": { "category": "Wing", - "placements": 2, + "placements": 60, "stats": { - "CPU": "27 pFLOPS", - "ROBOT RANKING": "28,243.00", - "ARMOR": "5,927", - "LOAD CAPACITY PER WING": "961.9 Kg", - "MASS": "12.5 Kg" + "strCPU": "27 [strPFlops]S", + "strRobotRanking": "28,243.00", + "strHealth": "5,927", + "strCapacity": "961.9 [strKilograms]", + "strMass": "12.5 [strKilograms]" }, - "description": "Aerofoil stabilises aircraft and allows for midflight agility control\nand tight manouvres. Has more armour and Load capacity than the T7 Wings", + "description": "Aerofoil stabilises aircraft and allows for midflight agility control\nand tight manouvres. Has more armour and Load capacity than the T7 Wings (2312317713_10|89d32b11_16)", "size": "T4", "type": "Movement", "active": true, - "health": 5927 + "health": 5927, + "ignore_in_weapon_list": true }, "spriteName": "Wing_Large", "nameStrKey": "strT4WingName", "mirrorCubeId": "", - "hexId": "89d32b11" + "hexId": "89d32b11", + "tree": { + "position_x": 0, + "position_y": 3, + "tech_points": 138, + "neighbours": [ + 2205394221 + ], + "requires": [ + 2205394221 + ] + } }, "T4WingBat hexCode:aad3001e intCode:2865954846": { "id": 2865954846, "info": { "category": "Wing", - "placements": 2, + "placements": 60, "stats": { - "CPU LOAD": "27 pFLOPS", - "ROBOT RANKING": "28,243.00", - "ARMOR": "5,927", - "LOAD CAPACITY PER WING": "961.9 Kg" + "strCPU": "27 [strPFlops]S", + "strRobotRanking": "28,243.00", + "strHealth": "5,927", + "strCapacity": "961.9 [strKilograms]" }, - "description": "The performance of this aerofoil matches that of the T8 Aerofoil,\nbut it looks much cooler.", + "description": "The performance of this aerofoil matches that of the T8 Aerofoil,\nbut it looks much cooler. (2865954846_10|aad3001e_16)", "size": "T4", "type": "Movement", "active": true, "cpu": 27, - "health": 5927 + "health": 5927, + "ignore_in_weapon_list": true }, "spriteName": "Bat_Wing", "nameStrKey": "strT4WingBatName", "mirrorCubeId": "", - "hexId": "aad3001e" + "hexId": "aad3001e", + "tree": { + "position_x": 7, + "position_y": 8, + "tech_points": 139, + "neighbours": [], + "requires": [ + 227205318 + ] + } }, "T5Wing hexCode:92e0975e intCode:2464192350": { "id": 2464192350, "info": { "category": "Wing", - "placements": 2, + "placements": 60, "stats": { - "CPU": "29 pFLOPS", - "ROBOT RANKING": "221,142.00", - "ARMOR": "10,528", - "LOAD CAPACITY PER WING": "1170.0 Kg", - "MASS": "15 Kg" + "strCPU": "29 [strPFlops]S", + "strRobotRanking": "221,142.00", + "strHealth": "10,528", + "strCapacity": "1170.0 [strKilograms]", + "strMass": "15 [strKilograms]" }, - "description": "Aerofoil stabilises aircraft and allows for midflight agility control\nand tight manouvres. Has more armour and Load capacity than the T9 Wings", + "description": "Aerofoil stabilises aircraft and allows for midflight agility control\nand tight manouvres. Has more armour and Load capacity than the T9 Wings (2464192350_10|92e0975e_16)", "size": "T5", "type": "Movement", "active": true, - "health": 10528 + "health": 10528, + "ignore_in_weapon_list": true }, "spriteName": "Wing_Huge", "nameStrKey": "strT5WingName", "mirrorCubeId": "", - "hexId": "92e0975e" + "hexId": "92e0975e", + "tree": { + "position_x": 1, + "position_y": 3, + "tech_points": 140, + "neighbours": [ + 2312317713 + ], + "requires": [ + 2312317713 + ] + } }, "T5WingBat hexCode:aab2c475 intCode:2863842421": { "id": 2863842421, "info": { "category": "Wing", - "placements": 2, + "placements": 60, "stats": {}, "description": "T5WingBat (2863842421_10|aab2c475_16) without a description", "size": "T5", "type": "Movement", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Vampire_Bat_Wing", "nameStrKey": "strT5WingBatName", "mirrorCubeId": "", - "hexId": "aab2c475" + "hexId": "aab2c475", + "tree": { + "position_x": 8, + "position_y": 8, + "tech_points": 141, + "neighbours": [], + "requires": [ + 227205318 + ] + } }, "T2Rudder hexCode:8d3ff3d4 intCode:2369778644": { "id": 2369778644, "info": { "category": "Rudder", - "placements": 2, + "placements": 60, "stats": { - "CPU": "20 pFLOPS", - "ROBOT RANKING": "394.00", - "ARMOR": "1,029", - "LOAD CAPACITY PER WING": "352.4 Kg", - "MASS": "7.5 Kg" + "strCPU": "20 [strPFlops]S", + "strRobotRanking": "394.00", + "strHealth": "1,029", + "strCapacity": "352.4 [strKilograms]", + "strMass": "7.5 [strKilograms]" }, - "description": "The Rudder stabilises aircraft and allows for midflight agility control\nand tight manouvres.", + "description": "The Rudder stabilises aircraft and allows for midflight agility control\nand tight manouvres. (2369778644_10|8d3ff3d4_16)", "size": "T2", "type": "Movement", "active": true, - "health": 1029 + "health": 1029, + "ignore_in_weapon_list": true }, "spriteName": "Rudder_Small", "nameStrKey": "strT2RudderName", "mirrorCubeId": "", - "hexId": "8d3ff3d4" + "hexId": "8d3ff3d4", + "tree": { + "position_x": 2, + "position_y": 3, + "tech_points": 142, + "neighbours": [ + 2464192350 + ], + "requires": [ + 2464192350 + ] + } }, "T3Rudder hexCode:e30471dd intCode:3808719325": { "id": 3808719325, "info": { "category": "Rudder", - "placements": 2, + "placements": 60, "stats": { - "CPU": "22 pFLOPS", - "ROBOT RANKING": "3,157.00", - "ARMOR": "2,713", - "LOAD CAPACITY PER WING": "490.0 Kg", - "MASS": "10 Kg" + "strCPU": "22 [strPFlops]S", + "strRobotRanking": "3,157.00", + "strHealth": "2,713", + "strCapacity": "490.0 [strKilograms]", + "strMass": "10 [strKilograms]" }, - "description": "The Rudder stabilises aircraft and allows for midflight agility control\nand tight manouvres.", + "description": "The Rudder stabilises aircraft and allows for midflight agility control\nand tight manouvres. (3808719325_10|e30471dd_16)", "size": "T3", "type": "Movement", "active": true, - "health": 2713 + "health": 2713, + "ignore_in_weapon_list": true }, "spriteName": "Rudder_Medium", "nameStrKey": "strT3RudderName", "mirrorCubeId": "", - "hexId": "e30471dd" + "hexId": "e30471dd", + "tree": { + "position_x": 3, + "position_y": 3, + "tech_points": 143, + "neighbours": [ + 2369778644 + ], + "requires": [ + 2369778644 + ] + } }, "T4Rudder hexCode:e9a4ffe1 intCode:3919904737": { "id": 3919904737, "info": { "category": "Rudder", - "placements": 2, + "placements": 60, "stats": { - "CPU": "24 pFLOPS", - "ROBOT RANKING": "25,105.00", - "ARMOR": "5,927", - "LOAD CAPACITY PER WING": "625.2 Kg", - "MASS": "12.5 Kg" + "strCPU": "24 [strPFlops]S", + "strRobotRanking": "25,105.00", + "strHealth": "5,927", + "strCapacity": "625.2 [strKilograms]", + "strMass": "12.5 [strKilograms]" }, - "description": "The Rudder stabilises aircraft and allows for midflight agility control\nand tight manouvres.", + "description": "The Rudder stabilises aircraft and allows for midflight agility control\nand tight manouvres. (3919904737_10|e9a4ffe1_16)", "size": "T4", "type": "Movement", "active": true, - "health": 5927 + "health": 5927, + "ignore_in_weapon_list": true }, "spriteName": "Rudder_Large", "nameStrKey": "strT4RudderName", "mirrorCubeId": "", - "hexId": "e9a4ffe1" + "hexId": "e9a4ffe1", + "tree": { + "position_x": 4, + "position_y": 3, + "tech_points": 144, + "neighbours": [ + 3808719325 + ], + "requires": [ + 3808719325 + ] + } }, "T4RudderBat hexCode:8f4ee207 intCode:2404311559": { "id": 2404311559, "info": { "category": "Rudder", - "placements": 2, + "placements": 60, "stats": { - "CPU LOAD": "24 pFLOPS", - "ROBOT RANKING": "25,105.00", - "ARMOR": "5,927", - "LOAD CAPACITY PER WING": "625.2 Kg" + "strCPU": "24 [strPFlops]S", + "strRobotRanking": "25,105.00", + "strHealth": "5,927", + "strCapacity": "625.2 [strKilograms]" }, - "description": "The performance of this rudder matches that of the T8 Rudder, but\nit looks much cooler.", + "description": "The performance of this rudder matches that of the T8 Rudder, but\nit looks much cooler. (2404311559_10|8f4ee207_16)", "size": "T4", "type": "Movement", "active": true, "cpu": 24, - "health": 5927 + "health": 5927, + "ignore_in_weapon_list": true }, "spriteName": "Bat_Rudder", "nameStrKey": "strT4RudderBatName", "mirrorCubeId": "", - "hexId": "8f4ee207" + "hexId": "8f4ee207", + "tree": { + "position_x": 9, + "position_y": 8, + "tech_points": 145, + "neighbours": [], + "requires": [ + 227205318 + ] + } }, "T5Rudder hexCode:9b7d5803 intCode:2608683011": { "id": 2608683011, "info": { "category": "Rudder", - "placements": 2, + "placements": 60, "stats": { - "CPU": "26 pFLOPS", - "ROBOT RANKING": "198,266.00", - "ARMOR": "10,528", - "LOAD CAPACITY PER WING": "760.5 Kg", - "MASS": "15 Kg" + "strCPU": "26 [strPFlops]S", + "strRobotRanking": "198,266.00", + "strHealth": "10,528", + "strCapacity": "760.5 [strKilograms]", + "strMass": "15 [strKilograms]" }, - "description": "The Rudder stabilises aircraft and allows for midflight agility control\nand tight manouvres.", + "description": "The Rudder stabilises aircraft and allows for midflight agility control\nand tight manouvres. (2608683011_10|9b7d5803_16)", "size": "T5", "type": "Movement", "active": true, - "health": 10528 + "health": 10528, + "ignore_in_weapon_list": true }, "spriteName": "Rudder_Huge", "nameStrKey": "strT5RudderName", "mirrorCubeId": "", - "hexId": "9b7d5803" + "hexId": "9b7d5803", + "tree": { + "position_x": 5, + "position_y": 3, + "tech_points": 146, + "neighbours": [ + 3919904737 + ], + "requires": [ + 3919904737 + ] + } }, "T5RudderBat hexCode:ae93c600 intCode:2928920064": { "id": 2928920064, "info": { "category": "Rudder", - "placements": 2, + "placements": 60, "stats": {}, "description": "T5RudderBat (2928920064_10|ae93c600_16) without a description", "size": "T5", "type": "Movement", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Vampire_Bat_Rudder", "nameStrKey": "strT5RudderBatName", "mirrorCubeId": "", - "hexId": "ae93c600" + "hexId": "ae93c600", + "tree": { + "position_x": 10, + "position_y": 8, + "tech_points": 147, + "neighbours": [], + "requires": [ + 227205318 + ] + } }, "T0FrontLaser hexCode:cacbc116 intCode:3402350870": { "id": 3402350870, "info": { "category": "Laser", - "placements": 2, + "placements": 192, "stats": { - "DAMAGE at 160m": "234", - "DAMAGE at 320m": "187", - "ROBOT RANKING": "32.40", - "ARMOR": "575", - "CPU LOAD": "12 pFLOPS", - "MASS": "5 Kg" + "strDamageNearDS": "234", + "strDamageFarDS": "187", + "strRobotRanking": "32.40", + "strHealth": "575", + "strCPU": "12 [strPFlops]S", + "strMass": "5 [strKilograms]" }, - "description": "Front mounted Subatomic Machine Gun. Deals more damage than the T1.", + "description": "Front mounted Subatomic Machine Gun. Deals more damage than the T1. (3402350870_10|cacbc116_16)", "size": "T0", "type": "Weapon", "active": true, "cpu": 12, - "health": 575 + "health": 575, + "ignore_in_weapon_list": false }, "spriteName": "Front_Laser_Tiny", "nameStrKey": "strT0FrontLaserName", "mirrorCubeId": "", "hexId": "cacbc116", "weapon": { - "damage_inflicted": 42 + "damage_inflicted": 42, + "group_fire_scales": [ + 1.0 + ] + }, + "tree": { + "position_x": 11, + "position_y": 8, + "tech_points": 148, + "neighbours": [], + "requires": [ + 227205318 + ] } }, "T1FrontLaser hexCode:94ae23fa intCode:2494440442": { "id": 2494440442, "info": { "category": "Laser", - "placements": 2, + "placements": 192, "stats": { - "DAMAGE at 160m": "753", - "DAMAGE at 320m": "603", - "ROBOT RANKING": "314.93", - "ARMOR": "1801", - "CPU LOAD": "16 pFLOPS", - "MASS": "7.5 Kg" + "strDamageNearDS": "753", + "strDamageFarDS": "603", + "strRobotRanking": "314.93", + "strHealth": "1801", + "strCPU": "16 [strPFlops]S", + "strMass": "7.5 [strKilograms]" }, - "description": "Front mounted Subatomic Machine Gun. Deals more damage than the T3.", + "description": "Front mounted Subatomic Machine Gun. Deals more damage than the T3. (2494440442_10|94ae23fa_16)", "size": "T1", "type": "Weapon", "active": true, "cpu": 16, - "health": 1801 + "health": 1801, + "ignore_in_weapon_list": false }, "spriteName": "Front_Laser_Small", "nameStrKey": "strT1FrontLaserName", "mirrorCubeId": "", "hexId": "94ae23fa", "weapon": { - "damage_inflicted": 420 + "damage_inflicted": 420, + "group_fire_scales": [ + 1.0 + ] + }, + "tree": { + "position_x": 12, + "position_y": 8, + "tech_points": 149, + "neighbours": [], + "requires": [ + 227205318 + ] } }, "T2FrontLaser hexCode:5e7282a1 intCode:1584562849": { "id": 1584562849, "info": { "category": "Laser", - "placements": 2, + "placements": 192, "stats": { - "DAMAGE at 160m": "1,808", - "DAMAGE at 320m": "1,446", - "ROBOT RANKING": "2869.78", - "ARMOR": "4747", - "CPU LOAD": "20 pFLOPS", - "MASS": "10 Kg" + "strDamageNearDS": "1,808", + "strDamageFarDS": "1,446", + "strRobotRanking": "2869.78", + "strHealth": "4747", + "strCPU": "20 [strPFlops]S", + "strMass": "10 [strKilograms]" }, - "description": "Front mounted Subatomic Machine Gun. Deals more damage than the T5.", + "description": "Front mounted Subatomic Machine Gun. Deals more damage than the T5. (1584562849_10|5e7282a1_16)", "size": "T2", "type": "Weapon", "active": true, "cpu": 20, - "health": 4747 + "health": 4747, + "ignore_in_weapon_list": false }, "spriteName": "Front_Laser_Medium", "nameStrKey": "strT2FrontLaserName", "mirrorCubeId": "", "hexId": "5e7282a1", "weapon": { - "damage_inflicted": 4200 + "damage_inflicted": 4200, + "group_fire_scales": [ + 1.0 + ] + }, + "tree": { + "position_x": 13, + "position_y": 8, + "tech_points": 150, + "neighbours": [], + "requires": [ + 227205318 + ] } }, "T3FrontLaser hexCode:9f792627 intCode:2675516967": { "id": 2675516967, "info": { "category": "Laser", - "placements": 2, + "placements": 192, "stats": { - "DAMAGE at 160m": "3,367", - "DAMAGE at 320m": "2,694", - "ROBOT RANKING": "25,104.85", - "ARMOR": "10373", - "CPU LOAD": "24 pFLOPS", - "MASS": "12.5 Kg" + "strDamageNearDS": "3,367", + "strDamageFarDS": "2,694", + "strRobotRanking": "25,104.85", + "strHealth": "10373", + "strCPU": "24 [strPFlops]S", + "strMass": "12.5 [strKilograms]" }, - "description": "Front mounted Subatomic Machine Gun. Deals more damage than the T7.", + "description": "Front mounted Subatomic Machine Gun. Deals more damage than the T7. (2675516967_10|9f792627_16)", "size": "T3", "type": "Weapon", "active": true, "cpu": 24, - "health": 10373 + "health": 10373, + "ignore_in_weapon_list": false }, "spriteName": "Front_Laser_Large", "nameStrKey": "strT3FrontLaserName", "mirrorCubeId": "", "hexId": "9f792627", "weapon": { - "damage_inflicted": 42000 + "damage_inflicted": 42000, + "group_fire_scales": [ + 1.0 + ] + }, + "tree": { + "position_x": 14, + "position_y": 8, + "tech_points": 151, + "neighbours": [], + "requires": [ + 227205318 + ] } }, "T4FrontLaser hexCode:55a5877c intCode:1436911484": { "id": 1436911484, "info": { "category": "Laser", - "placements": 2, + "placements": 192, "stats": { - "DAMAGE at 160m": "4,891", - "DAMAGE at 320m": "3,913", - "ROBOT RANKING": "213,516.73", - "ARMOR": "18423", - "CPU LOAD": "28 pFLOPS", - "MASS": "15 Kg" + "strDamageNearDS": "4,891", + "strDamageFarDS": "3,913", + "strRobotRanking": "213,516.73", + "strHealth": "18423", + "strCPU": "28 [strPFlops]S", + "strMass": "15 [strKilograms]" }, - "description": "Front mounted Subatomic Machine Gun. Deals more damage than the T9.", + "description": "Front mounted Subatomic Machine Gun. Deals more damage than the T9. (1436911484_10|55a5877c_16)", "size": "T4", "type": "Weapon", "active": true, "cpu": 28, - "health": 18423 + "health": 18423, + "ignore_in_weapon_list": false }, "spriteName": "Front_Laser_Huge", "nameStrKey": "strT4FrontLaserName", "mirrorCubeId": "", "hexId": "55a5877c", "weapon": { - "damage_inflicted": 420000 + "damage_inflicted": 420000, + "group_fire_scales": [ + 1.0 + ] + }, + "tree": { + "position_x": 15, + "position_y": 8, + "tech_points": 152, + "neighbours": [], + "requires": [ + 227205318 + ] } }, "T0Laser hexCode:e31663e3 intCode:3809895395": { "id": 3809895395, "info": { "category": "Laser", - "placements": 2, + "placements": 63, "stats": { - "DAMAGE at 160m": "234", - "DAMAGE at 320m": "187", - "ROBOT RANKING": "32.40", - "ARMOR": "575", - "CPU LOAD": "12 pFLOPS", - "MASS": "5 Kg" + "strDamageNearDS": "234", + "strDamageFarDS": "187", + "strRobotRanking": "32.40", + "strHealth": "575", + "strCPU": "12 [strPFlops]S", + "strMass": "5 [strKilograms]" }, - "description": "Top mounted Subatomic Machine Gun. Deals more damage than the T1.", + "description": "Top mounted Subatomic Machine Gun. Deals more damage than the T1. (3809895395_10|e31663e3_16)", "size": "T0", "type": "Weapon", "active": true, "cpu": 12, - "health": 575 + "health": 575, + "ignore_in_weapon_list": false }, "spriteName": "Top_Laser_Tiny", "nameStrKey": "strT0LaserName", "mirrorCubeId": "", "hexId": "e31663e3", "weapon": { - "damage_inflicted": 42 + "damage_inflicted": 42, + "group_fire_scales": [ + 1.0 + ] + }, + "weapon_upgrade": { + "xp": 1.0, + "rating": 0, + "rank": 0, + "power": 0 + }, + "tree": { + "position_x": 6, + "position_y": 3, + "tech_points": 153, + "neighbours": [ + 2608683011 + ], + "requires": [ + 2608683011 + ] } }, "T1Laser hexCode:bd73810f intCode:3178463503": { "id": 3178463503, "info": { "category": "Laser", - "placements": 2, + "placements": 63, "stats": { - "DAMAGE at 160m": "753", - "DAMAGE at 320m": "603", - "ROBOT RANKING": "314.93", - "ARMOR": "1,801", - "CPU LOAD": "16 pFLOPS", - "MASS": "7.5 Kg" + "strDamageNearDS": "753", + "strDamageFarDS": "603", + "strRobotRanking": "314.93", + "strHealth": "1,801", + "strCPU": "16 [strPFlops]S", + "strMass": "7.5 [strKilograms]" }, - "description": "Top mounted Subatomic Machine Gun. Deals more damage than the T3.", + "description": "Top mounted Subatomic Machine Gun. Deals more damage than the T3. (3178463503_10|bd73810f_16)", "size": "T1", "type": "Weapon", "active": true, "cpu": 16, - "health": 1801 + "health": 1801, + "ignore_in_weapon_list": false }, "spriteName": "Top_Laser_Small", "nameStrKey": "strT1LaserName", "mirrorCubeId": "", "hexId": "bd73810f", "weapon": { - "damage_inflicted": 420 + "damage_inflicted": 420, + "group_fire_scales": [ + 1.0 + ] + }, + "weapon_upgrade": { + "xp": 2.0, + "rating": 1, + "rank": 1, + "power": 0 + }, + "tree": { + "position_x": 7, + "position_y": 3, + "tech_points": 154, + "neighbours": [ + 3809895395 + ], + "requires": [ + 3809895395 + ] } }, "T2Laser hexCode:77af2054 intCode:2007965780": { "id": 2007965780, "info": { "category": "Laser", - "placements": 2, + "placements": 63, "stats": { - "DAMAGE at 160m": "1,808", - "DAMAGE at 320m": "1,446", - "ROBOT RANKING": "2,869.78", - "ARMOR": "4,747", - "CPU LOAD": "20 pFLOPS", - "MASS": "10 Kg" + "strDamageNearDS": "1,808", + "strDamageFarDS": "1,446", + "strRobotRanking": "2,869.78", + "strHealth": "4,747", + "strCPU": "20 [strPFlops]S", + "strMass": "10 [strKilograms]" }, - "description": "Top mounted Subatomic Machine Gun. Deals more damage than the T5.", + "description": "Top mounted Subatomic Machine Gun. Deals more damage than the T5. (2007965780_10|77af2054_16)", "size": "T2", "type": "Weapon", "active": true, "cpu": 20, - "health": 4747 + "health": 4747, + "ignore_in_weapon_list": false }, "spriteName": "Top_Laser_Medium", "nameStrKey": "strT2LaserName", "mirrorCubeId": "", "hexId": "77af2054", "weapon": { - "damage_inflicted": 4200 + "damage_inflicted": 4200, + "group_fire_scales": [ + 1.0 + ] + }, + "weapon_upgrade": { + "xp": 3.0, + "rating": 2, + "rank": 2, + "power": 0 + }, + "tree": { + "position_x": 8, + "position_y": 3, + "tech_points": 155, + "neighbours": [ + 3178463503 + ], + "requires": [ + 3178463503 + ] } }, "T3Laser hexCode:b6a484d2 intCode:3064235218": { "id": 3064235218, "info": { "category": "Laser", - "placements": 2, + "placements": 63, "stats": { - "DAMAGE at 160m": "3,367", - "DAMAGE at 320m": "2,694", - "ROBOT RANKING": "25,104.85", - "ARMOR": "10,373", - "CPU LOAD": "24 pFLOPS", - "MASS": "12.5 Kg" + "strDamageNearDS": "3,367", + "strDamageFarDS": "2,694", + "strRobotRanking": "25,104.85", + "strHealth": "10,373", + "strCPU": "24 [strPFlops]S", + "strMass": "12.5 [strKilograms]" }, - "description": "Top mounted Subatomic Machine Gun. Deals more damage than the T7.", + "description": "Top mounted Subatomic Machine Gun. Deals more damage than the T7. (3064235218_10|b6a484d2_16)", "size": "T3", "type": "Weapon", "active": true, "cpu": 24, - "health": 10373 + "health": 10373, + "ignore_in_weapon_list": false }, "spriteName": "Top_Laser_Large", "nameStrKey": "strT3LaserName", "mirrorCubeId": "", "hexId": "b6a484d2", "weapon": { - "damage_inflicted": 42000 + "damage_inflicted": 42000, + "group_fire_scales": [ + 1.0 + ] + }, + "weapon_upgrade": { + "xp": 4.0, + "rating": 3, + "rank": 3, + "power": 0 + }, + "tree": { + "position_x": 9, + "position_y": 3, + "tech_points": 156, + "neighbours": [ + 2007965780 + ], + "requires": [ + 2007965780 + ] } }, "T4Laser hexCode:7c782589 intCode:2088248713": { "id": 2088248713, "info": { "category": "Laser", - "placements": 2, + "placements": 63, "stats": { - "DAMAGE at 160m": "4,891", - "DAMAGE at 320m": "3,913", - "ROBOT RANKING": "213,516.73", - "ARMOR": "18,423", - "CPU LOAD": "28 pFLOPS", - "MASS": "15 Kg" + "strDamageNearDS": "4,891", + "strDamageFarDS": "3,913", + "strRobotRanking": "213,516.73", + "strHealth": "18,423", + "strCPU": "28 [strPFlops]S", + "strMass": "15 [strKilograms]" }, - "description": "Top mounted Subatomic Machine Gun. Deals more damage than the T9.", + "description": "Top mounted Subatomic Machine Gun. Deals more damage than the T9. (2088248713_10|7c782589_16)", "size": "T4", "type": "Weapon", "active": true, "cpu": 28, - "health": 18423 + "health": 18423, + "ignore_in_weapon_list": false }, "spriteName": "Top_Laser_Huge", "nameStrKey": "strT4LaserName", "mirrorCubeId": "", "hexId": "7c782589", "weapon": { - "damage_inflicted": 420000 + "damage_inflicted": 420000, + "group_fire_scales": [ + 1.0 + ] + }, + "weapon_upgrade": { + "xp": 5.0, + "rating": 4, + "rank": 4, + "power": 0 + }, + "tree": { + "position_x": 10, + "position_y": 3, + "tech_points": 157, + "neighbours": [ + 3064235218 + ], + "requires": [ + 3064235218 + ] } }, "T5LaserGolden hexCode:e5946e66 intCode:3851710054": { "id": 3851710054, "info": { "category": "Laser", - "placements": 2, + "placements": 63, "stats": {}, "description": "T5LaserGolden (3851710054_10|e5946e66_16) without a description", "size": "T5", "type": "Weapon", - "active": true + "active": true, + "ignore_in_weapon_list": false }, "spriteName": "Mega_Laser_Golden", "nameStrKey": "strT5LaserGoldenName", "mirrorCubeId": "", "hexId": "e5946e66", "weapon": { - "damage_inflicted": 4200000 + "damage_inflicted": 4200000, + "group_fire_scales": [ + 1.0 + ] + }, + "tree": { + "position_x": 0, + "position_y": 9, + "tech_points": 158, + "neighbours": [], + "requires": [ + 227205318 + ] } }, "T4LaserCarbon6 hexCode:d88a7e09 intCode:3632954889": { "id": 3632954889, "info": { "category": "Laser", - "placements": 2, + "placements": 63, "stats": {}, "description": "T4LaserCarbon6 (3632954889_10|d88a7e09_16) without a description", "size": "T4", "type": "Weapon", - "active": true + "active": true, + "ignore_in_weapon_list": false }, "spriteName": "Top_Laser_Huge_Carbon_6", "nameStrKey": "strT4LaserCarbon6Name", "mirrorCubeId": "", "hexId": "d88a7e09", "weapon": { - "damage_inflicted": 420000 + "damage_inflicted": 420000, + "group_fire_scales": [ + 1.0 + ] + }, + "tree": { + "position_x": 1, + "position_y": 9, + "tech_points": 159, + "neighbours": [], + "requires": [ + 227205318 + ] } }, "T5Laser hexCode:bf457455 intCode:3209000021": { "id": 3209000021, "info": { "category": "Laser", - "placements": 2, + "placements": 63, "stats": { - "DAMAGE at 160m": "10,512", - "DAMAGE at 320m": "8,410", - "ROBOT RANKING": "13,897,651", - "ARMOR": "31,260", - "CPU LOAD": "250 pFLOPS", - "MASS": "50 Kg" + "strDamageNearDS": "10,512", + "strDamageFarDS": "8,410", + "strRobotRanking": "13,897,651", + "strHealth": "31,260", + "strCPU": "250 [strPFlops]S", + "strMass": "50 [strKilograms]" }, - "description": "Massively massively powerful SMG.", + "description": "Massively massively powerful SMG. (3209000021_10|bf457455_16)", "size": "T5", "type": "Weapon", "active": true, "cpu": 250, - "health": 31260 + "health": 31260, + "ignore_in_weapon_list": false }, "spriteName": "Mega_Laser", "nameStrKey": "strT5LaserName", "mirrorCubeId": "", "hexId": "bf457455", "weapon": { - "damage_inflicted": 4200000 + "damage_inflicted": 4200000, + "group_fire_scales": [ + 1.0 + ] + }, + "weapon_upgrade": { + "xp": 6.0, + "rating": 5, + "rank": 5, + "power": 0 + }, + "tree": { + "position_x": 11, + "position_y": 3, + "tech_points": 160, + "neighbours": [ + 2088248713 + ], + "requires": [ + 2088248713 + ] } }, "T5LaserCarbon6 hexCode:477e482f intCode:1199458351": { "id": 1199458351, "info": { "category": "Laser", - "placements": 2, + "placements": 63, "stats": { - "DAMAGE at 160m": "10,512", - "DAMAGE at 320m": "8,410", - "ROBOT RANKING": "13,897,651", - "ARMOR": "31,260", - "CPU LOAD": "250 pFLOPS", - "MASS": "50 Kg" + "strDamageNearDS": "10,512", + "strDamageFarDS": "8,410", + "strRobotRanking": "13,897,651", + "strHealth": "31,260", + "strCPU": "250 [strPFlops]S", + "strMass": "50 [strKilograms]" }, - "description": "Massively massively powerful MSMG.", + "description": "Massively massively powerful MSMG. (1199458351_10|477e482f_16)", "size": "T5", "type": "Weapon", "active": true, "cpu": 250, - "health": 31260 + "health": 31260, + "ignore_in_weapon_list": false }, "spriteName": "Mega_Laser_Carbon_6", "nameStrKey": "strT5LaserCarbon6Name", "mirrorCubeId": "", "hexId": "477e482f", "weapon": { - "damage_inflicted": 4200000 + "damage_inflicted": 4200000, + "group_fire_scales": [ + 1.0 + ] + }, + "tree": { + "position_x": 2, + "position_y": 9, + "tech_points": 161, + "neighbours": [], + "requires": [ + 227205318 + ] } }, "T0Plasma hexCode:9e465554 intCode:2655409492": { "id": 2655409492, "info": { "category": "Plasma", - "placements": 2, + "placements": 63, "stats": {}, "description": "T0Plasma (2655409492_10|9e465554_16) without a description", "size": "T0", "type": "Weapon", - "active": true + "active": true, + "ignore_in_weapon_list": false }, "spriteName": "Plasma_Tiny", "nameStrKey": "strT0PlasmaName", "mirrorCubeId": "", - "hexId": "9e465554" + "hexId": "9e465554", + "weapon": { + "damage_inflicted": 162, + "group_fire_scales": [ + 1.0 + ] + }, + "weapon_upgrade": { + "xp": 1.0, + "rating": 0, + "rank": 0, + "power": 0 + }, + "tree": { + "position_x": 12, + "position_y": 3, + "tech_points": 162, + "neighbours": [ + 3209000021 + ], + "requires": [ + 3209000021 + ] + } }, "T1Plasma hexCode:4d19be26 intCode:1293532710": { "id": 1293532710, "info": { "category": "Plasma", - "placements": 2, + "placements": 63, "stats": { - "DAMAGE": "2,410", - "BLAST": "15.09m", - "ROBOT RANKING": "393.66", - "ARMOR": "1,801", - "CPU LOAD": "20 pFLOPS", - "MASS": "7.5 Kg" + "strDamageDS": "2,410", + "strBlastRadiusDS": "15.09m", + "strRobotRanking": "393.66", + "strHealth": "1,801", + "strCPU": "20 [strPFlops]S", + "strMass": "7.5 [strKilograms]" }, - "description": "An explosive Plasma projectile weapon. More powerful than the T3.\nMultiple cannon will fire together.", + "description": "An explosive Plasma projectile weapon. More powerful than the T3.\nMultiple cannon will fire together. (1293532710_10|4d19be26_16)", "size": "T1", "type": "Weapon", "active": true, "cpu": 20, - "health": 1801 + "health": 1801, + "ignore_in_weapon_list": false }, "spriteName": "Plasma_Small", "nameStrKey": "strT1PlasmaName", "mirrorCubeId": "", - "hexId": "4d19be26" + "hexId": "4d19be26", + "weapon": { + "damage_inflicted": 163, + "group_fire_scales": [ + 1.0 + ] + }, + "weapon_upgrade": { + "xp": 2.0, + "rating": 1, + "rank": 1, + "power": 0 + }, + "tree": { + "position_x": 13, + "position_y": 3, + "tech_points": 163, + "neighbours": [ + 2655409492 + ], + "requires": [ + 2655409492 + ] + } }, "T2Plasma hexCode:91d8a7f4 intCode:2446895092": { "id": 2446895092, "info": { "category": "Plasma", - "placements": 2, + "placements": 63, "stats": { - "DAMAGE": "5,785", - "BLAST": "17.65m", - "ROBOT RANKING": "3,443.74", - "ARMOR": "4,747", - "CPU LOAD": "24 pFLOPS", - "MASS": "10 Kg" + "strDamageDS": "5,785", + "strBlastRadiusDS": "17.65m", + "strRobotRanking": "3,443.74", + "strHealth": "4,747", + "strCPU": "24 [strPFlops]S", + "strMass": "10 [strKilograms]" }, - "description": "An explosive Plasma projectile weapon. More powerful than the T5.\nMultiple cannon will fire together.", + "description": "An explosive Plasma projectile weapon. More powerful than the T5.\nMultiple cannon will fire together. (2446895092_10|91d8a7f4_16)", "size": "T2", "type": "Weapon", "active": true, "cpu": 24, - "health": 4747 + "health": 4747, + "ignore_in_weapon_list": false }, "spriteName": "Plasma_Medium", "nameStrKey": "strT2PlasmaName", "mirrorCubeId": "", - "hexId": "91d8a7f4" + "hexId": "91d8a7f4", + "weapon": { + "damage_inflicted": 164, + "group_fire_scales": [ + 1.0 + ] + }, + "weapon_upgrade": { + "xp": 3.0, + "rating": 2, + "rank": 2, + "power": 0 + }, + "tree": { + "position_x": 14, + "position_y": 3, + "tech_points": 164, + "neighbours": [ + 1293532710 + ], + "requires": [ + 1293532710 + ] + } }, "T3Plasma hexCode:eba668c3 intCode:3953551555": { "id": 3953551555, "info": { "category": "Plasma", - "placements": 2, + "placements": 63, "stats": { - "DAMAGE": "10,775", - "BLAST": "20.20m", - "ROBOT RANKING": "29,288.99", - "ARMOR": "10,373", - "CPU LOAD": "28 pFLOPS", - "MASS": "12.5 Kg" + "strDamageDS": "10,775", + "strBlastRadiusDS": "20.20m", + "strRobotRanking": "29,288.99", + "strHealth": "10,373", + "strCPU": "28 [strPFlops]S", + "strMass": "12.5 [strKilograms]" }, - "description": "An explosive Plasma projectile weapon. More powerful than the T7.\nMultiple cannons will fire together.", + "description": "An explosive Plasma projectile weapon. More powerful than the T7.\nMultiple cannons will fire together. (3953551555_10|eba668c3_16)", "size": "T3", "type": "Weapon", "active": true, "cpu": 28, - "health": 10373 + "health": 10373, + "ignore_in_weapon_list": false }, "spriteName": "Plasma_Large", "nameStrKey": "strT3PlasmaName", "mirrorCubeId": "", - "hexId": "eba668c3" + "hexId": "eba668c3", + "weapon": { + "damage_inflicted": 165, + "group_fire_scales": [ + 1.0 + ] + }, + "weapon_upgrade": { + "xp": 4.0, + "rating": 3, + "rank": 3, + "power": 0 + }, + "tree": { + "position_x": 15, + "position_y": 3, + "tech_points": 165, + "neighbours": [ + 2446895092 + ], + "requires": [ + 2446895092 + ] + } }, "T4Plasma hexCode:37677111 intCode:929526033": { "id": 929526033, "info": { "category": "Plasma", - "placements": 2, + "placements": 63, "stats": { - "DAMAGE": "17,218", - "BLAST": "22.75m", - "ROBOT RANKING": "244,019.12", - "ARMOR": "18,423", - "CPU LOAD": "32 pFLOPS", - "MASS": "15 Kg" + "strDamageDS": "17,218", + "strBlastRadiusDS": "22.75m", + "strRobotRanking": "244,019.12", + "strHealth": "18,423", + "strCPU": "32 [strPFlops]S", + "strMass": "15 [strKilograms]" }, - "description": "The most powerful Plasma Cannon, packing an enormous explosive punch.", + "description": "The most powerful Plasma Cannon, packing an enormous explosive punch. (929526033_10|37677111_16)", "size": "T4", "type": "Weapon", "active": true, "cpu": 32, - "health": 18423 + "health": 18423, + "ignore_in_weapon_list": false }, "spriteName": "Plasma_Huge", "nameStrKey": "strT4PlasmaName", "mirrorCubeId": "", - "hexId": "37677111" + "hexId": "37677111", + "weapon": { + "damage_inflicted": 166, + "group_fire_scales": [ + 1.0 + ] + }, + "weapon_upgrade": { + "xp": 5.0, + "rating": 4, + "rank": 4, + "power": 0 + }, + "tree": { + "position_x": 0, + "position_y": 4, + "tech_points": 166, + "neighbours": [ + 3953551555 + ], + "requires": [ + 3953551555 + ] + } }, "T4PlasmaCarbon6 hexCode:5ef426bf intCode:1593059007": { "id": 1593059007, "info": { "category": "Plasma", - "placements": 2, + "placements": 63, "stats": {}, "description": "T4PlasmaCarbon6 (1593059007_10|5ef426bf_16) without a description", "size": "T4", "type": "Weapon", - "active": true + "active": true, + "ignore_in_weapon_list": false }, "spriteName": "Plasma_Huge_Carbon_6", "nameStrKey": "strT4PlasmaCarbon6Name", "mirrorCubeId": "", - "hexId": "5ef426bf" + "hexId": "5ef426bf", + "tree": { + "position_x": 3, + "position_y": 9, + "tech_points": 167, + "neighbours": [], + "requires": [ + 227205318 + ] + } }, "T5Plasma hexCode:0a381807 intCode:171448327": { "id": 171448327, "info": { "category": "Plasma", - "placements": 2, + "placements": 63, "stats": { - "DAMAGE": "2x 10,331", - "BLAST": "22.75m", - "ROBOT RANKING": "16,677,182", - "ARMOR": "31,260", - "CPU LOAD": "300 pFLOPS", - "MASS": "50 Kg" + "strDamageDS": "2x 10,331", + "strBlastRadiusDS": "22.75m", + "strRobotRanking": "16,677,182", + "strHealth": "31,260", + "strCPU": "300 [strPFlops]S", + "strMass": "50 [strKilograms]" }, - "description": "Massively massively powerful Plasma Cannon that fires two shots per\ncannon.", + "description": "Massively massively powerful Plasma Cannon that fires two shots per\ncannon. (171448327_10|0a381807_16)", "size": "T5", "type": "Weapon", "active": true, "cpu": 300, - "health": 31260 + "health": 31260, + "ignore_in_weapon_list": false }, "spriteName": "Mega_Plasma", "nameStrKey": "strT5PlasmaName", "mirrorCubeId": "", - "hexId": "0a381807" + "hexId": "0a381807", + "weapon": { + "damage_inflicted": 168, + "group_fire_scales": [ + 1.0 + ] + }, + "weapon_upgrade": { + "xp": 6.0, + "rating": 5, + "rank": 5, + "power": 0 + }, + "tree": { + "position_x": 1, + "position_y": 4, + "tech_points": 168, + "neighbours": [ + 929526033 + ], + "requires": [ + 929526033 + ] + } }, "T5PlasmaCarbon6 hexCode:af6ef6c7 intCode:2943284935": { "id": 2943284935, "info": { "category": "Plasma", - "placements": 2, + "placements": 63, "stats": {}, "description": "T5PlasmaCarbon6 (2943284935_10|af6ef6c7_16) without a description", "size": "T5", "type": "Weapon", - "active": true + "active": true, + "ignore_in_weapon_list": false }, "spriteName": "Mega_Plasma_Carbon_6", "nameStrKey": "strT5PlasmaCarbon6Name", "mirrorCubeId": "", - "hexId": "af6ef6c7" + "hexId": "af6ef6c7", + "tree": { + "position_x": 4, + "position_y": 9, + "tech_points": 169, + "neighbours": [], + "requires": [ + 227205318 + ] + } }, "T1Rail hexCode:61c11443 intCode:1640043587": { "id": 1640043587, "info": { "category": "Rail", - "placements": 2, + "placements": 63, "stats": { - "DAMAGE": "4,258", - "ROBOT RANKING": "511.76", - "ARMOR": "1,801", - "CPU LOAD": "20 pFLOPS", - "MASS": "7.5 Kg" + "strDamageDS": "4,258", + "strRobotRanking": "511.76", + "strHealth": "1,801", + "strCPU": "20 [strPFlops]S", + "strMass": "7.5 [strKilograms]" }, - "description": "Very long range and very accurate. Moving reduces accuracy. Push\n'R' to reload.", + "description": "Very long range and very accurate. Moving reduces accuracy. Push\n'R' to reload. (1640043587_10|61c11443_16)", "size": "T1", "type": "Weapon", "active": true, "cpu": 20, - "health": 1801 + "health": 1801, + "ignore_in_weapon_list": false }, "spriteName": "Rail_Small", "nameStrKey": "strT1RailName", "mirrorCubeId": "", - "hexId": "61c11443" + "hexId": "61c11443", + "weapon": { + "damage_inflicted": 170, + "group_fire_scales": [ + 1.0 + ] + }, + "weapon_upgrade": { + "xp": 2.0, + "rating": 1, + "rank": 1, + "power": 0 + }, + "tree": { + "position_x": 2, + "position_y": 4, + "tech_points": 170, + "neighbours": [ + 171448327 + ], + "requires": [ + 171448327 + ] + } }, "T2Rail hexCode:ab1db518 intCode:2870850840": { "id": 2870850840, "info": { "category": "Rail", - "placements": 2, + "placements": 63, "stats": { - "DAMAGE": "10,218", - "ROBOT RANKING": "4,476.86", - "ARMOR": "4,747", - "CPU LOAD": "24 pFLOPS", - "MASS": "10 Kg" + "strDamageDS": "10,218", + "strRobotRanking": "4,476.86", + "strHealth": "4,747", + "strCPU": "24 [strPFlops]S", + "strMass": "10 [strKilograms]" }, - "description": "Deals more damage than the T5. Very long range and very accurate.\nMoving reduces accuracy. Push 'R' to reload.", + "description": "Deals more damage than the T5. Very long range and very accurate.\nMoving reduces accuracy. Push 'R' to reload. (2870850840_10|ab1db518_16)", "size": "T2", "type": "Weapon", "active": true, "cpu": 24, - "health": 4747 + "health": 4747, + "ignore_in_weapon_list": false }, "spriteName": "Rail_Medium", "nameStrKey": "strT2RailName", "mirrorCubeId": "", - "hexId": "ab1db518" + "hexId": "ab1db518", + "weapon": { + "damage_inflicted": 171, + "group_fire_scales": [ + 1.0 + ] + }, + "weapon_upgrade": { + "xp": 3.0, + "rating": 2, + "rank": 2, + "power": 0 + }, + "tree": { + "position_x": 3, + "position_y": 4, + "tech_points": 171, + "neighbours": [ + 1640043587 + ], + "requires": [ + 1640043587 + ] + } }, "T3Rail hexCode:6a16119e intCode:1779831198": { "id": 1779831198, "info": { "category": "Rail", - "placements": 2, + "placements": 63, "stats": { - "DAMAGE": "19,033", - "ROBOT RANKING": "38,075.69", - "ARMOR": "10,373", - "CPU LOAD": "28 pFLOPS", - "MASS": "12.5 Kg" + "strDamageDS": "19,033", + "strRobotRanking": "38,075.69", + "strHealth": "10,373", + "strCPU": "28 [strPFlops]S", + "strMass": "12.5 [strKilograms]" }, - "description": "Deals more damage than the T7. Very long range and very accurate.\nMoving reduces accuracy. Push 'R' to reload.", + "description": "Deals more damage than the T7. Very long range and very accurate.\nMoving reduces accuracy. Push 'R' to reload. (1779831198_10|6a16119e_16)", "size": "T3", "type": "Weapon", "active": true, "cpu": 28, - "health": 10373 + "health": 10373, + "ignore_in_weapon_list": false }, "spriteName": "Rail_Large", "nameStrKey": "strT3RailName", "mirrorCubeId": "", - "hexId": "6a16119e" + "hexId": "6a16119e", + "weapon": { + "damage_inflicted": 172, + "group_fire_scales": [ + 1.0 + ] + }, + "weapon_upgrade": { + "xp": 4.0, + "rating": 3, + "rank": 3, + "power": 0 + }, + "tree": { + "position_x": 4, + "position_y": 4, + "tech_points": 172, + "neighbours": [ + 2870850840 + ], + "requires": [ + 2870850840 + ] + } }, "T4Rail hexCode:a0cab0c5 intCode:2697638085": { "id": 2697638085, "info": { "category": "Rail", - "placements": 2, + "placements": 63, "stats": { - "DAMAGE": "27,647", - "ROBOT RANKING": "317,224.86", - "ARMOR": "18,423", - "CPU LOAD": "32 pFLOPS", - "MASS": "15 Kg" + "strDamageDS": "27,647", + "strRobotRanking": "317,224.86", + "strHealth": "18,423", + "strCPU": "32 [strPFlops]S", + "strMass": "15 [strKilograms]" }, - "description": "Deals more damage than the T9. Very long range and very accurate.\nMoving reduces accuracy. Push 'R' to reload.", + "description": "Deals more damage than the T9. Very long range and very accurate.\nMoving reduces accuracy. Push 'R' to reload. (2697638085_10|a0cab0c5_16)", "size": "T4", "type": "Weapon", "active": true, "cpu": 32, - "health": 18423 + "health": 18423, + "ignore_in_weapon_list": false }, "spriteName": "Rail_Huge", "nameStrKey": "strT4RailName", "mirrorCubeId": "", - "hexId": "a0cab0c5" + "hexId": "a0cab0c5", + "weapon": { + "damage_inflicted": 173, + "group_fire_scales": [ + 1.0 + ] + }, + "weapon_upgrade": { + "xp": 5.0, + "rating": 4, + "rank": 4, + "power": 0 + }, + "tree": { + "position_x": 5, + "position_y": 4, + "tech_points": 173, + "neighbours": [ + 1779831198 + ], + "requires": [ + 1779831198 + ] + } }, "T5Rail hexCode:7c2d3fb6 intCode:2083340214": { "id": 2083340214, "info": { "category": "Rail", - "placements": 2, + "placements": 63, "stats": {}, "description": "T5Rail (2083340214_10|7c2d3fb6_16) without a description", "size": "T5", "type": "Weapon", - "active": true + "active": true, + "ignore_in_weapon_list": false }, "spriteName": "Rail_Mega", "nameStrKey": "strT5RailName", "mirrorCubeId": "", - "hexId": "7c2d3fb6" + "hexId": "7c2d3fb6", + "weapon": { + "damage_inflicted": 174, + "group_fire_scales": [ + 1.0 + ] + }, + "weapon_upgrade": { + "xp": 6.0, + "rating": 5, + "rank": 5, + "power": 0 + }, + "tree": { + "position_x": 6, + "position_y": 4, + "tech_points": 174, + "neighbours": [ + 2697638085 + ], + "requires": [ + 2697638085 + ] + } }, "T2Nano hexCode:6904833f intCode:1761903423": { "id": 1761903423, "info": { "category": "Nano", - "placements": 2, + "placements": 63, "stats": { - "CPU": "20 pFLOPS", - "ROBOT RANKING": "2,869.78", - "ARMOR": "4,747", - "Damage Rate": "1,808 DPS", - "Heal Rate": "1,226 HPS", - "MASS": "10 Kg" + "strCPU": "20 [strPFlops]S", + "strRobotRanking": "2,869.78", + "strHealth": "4,747", + "strWeaponDamageRateDS": "1,808 DPS", + "strHealRate": "1,226 HPS", + "strMass": "10 [strKilograms]" }, - "description": "A beam of nano disruption which can both cause damage to enemies\nand re-generate allies. Alternate fire can auto target up to six allied targets\nat once.", + "description": "A beam of nano disruption which can both cause damage to enemies\nand re-generate allies. Alternate fire can auto target up to six allied targets\nat once. (1761903423_10|6904833f_16)", "size": "T2", "type": "Weapon", "active": true, - "health": 4747 + "health": 4747, + "ignore_in_weapon_list": false }, "spriteName": "Nano_Medium", "nameStrKey": "strT2NanoName", "mirrorCubeId": "", - "hexId": "6904833f" + "hexId": "6904833f", + "weapon": { + "damage_inflicted": 175, + "group_fire_scales": [ + 1.0 + ] + }, + "weapon_upgrade": { + "xp": 3.0, + "rating": 2, + "rank": 2, + "power": 0 + }, + "tree": { + "position_x": 7, + "position_y": 4, + "tech_points": 175, + "neighbours": [ + 2083340214 + ], + "requires": [ + 2083340214 + ] + } }, "T3Nano hexCode:63a40d03 intCode:1671695619": { "id": 1671695619, "info": { "category": "Nano", - "placements": 2, + "placements": 63, "stats": { - "CPU": "24 pFLOPS", - "ROBOT RANKING": "25,104.85", - "ARMOR": "10,373", - "Damage Rate": "3,367 DPS", - "Heal Rate": "2,284 HPS", - "MASS": "12.5 Kg" + "strCPU": "24 [strPFlops]S", + "strRobotRanking": "25,104.85", + "strHealth": "10,373", + "strWeaponDamageRateDS": "3,367 DPS", + "strHealRate": "2,284 HPS", + "strMass": "12.5 [strKilograms]" }, - "description": "A beam of nano disruption which can both cause damage to enemies\nand re-generate allies. Alternate fire can auto target up to six allied targets\nat once.", + "description": "A beam of nano disruption which can both cause damage to enemies\nand re-generate allies. Alternate fire can auto target up to six allied targets\nat once. (1671695619_10|63a40d03_16)", "size": "T3", "type": "Weapon", "active": true, - "health": 10373 + "health": 10373, + "ignore_in_weapon_list": false }, "spriteName": "Nano_Large", "nameStrKey": "strT3NanoName", "mirrorCubeId": "", - "hexId": "63a40d03" + "hexId": "63a40d03", + "weapon": { + "damage_inflicted": 176, + "group_fire_scales": [ + 1.0 + ] + }, + "weapon_upgrade": { + "xp": 4.0, + "rating": 3, + "rank": 3, + "power": 0 + }, + "tree": { + "position_x": 8, + "position_y": 4, + "tech_points": 176, + "neighbours": [ + 1761903423 + ], + "requires": [ + 1761903423 + ] + } }, "T4Nano hexCode:8cea733d intCode:2364175165": { "id": 2364175165, "info": { "category": "Nano", - "placements": 2, + "placements": 63, "stats": { - "CPU": "28 pFLOPS", - "ROBOT RANKING": "213,516.73", - "ARMOR": "18,423", - "Damage Rate": "4,891 DPS", - "Heal Rate": "4,147 HPS", - "MASS": "15 Kg" + "strCPU": "28 [strPFlops]S", + "strRobotRanking": "213,516.73", + "strHealth": "18,423", + "strWeaponDamageRateDS": "4,891 DPS", + "strHealRate": "4,147 HPS", + "strMass": "15 [strKilograms]" }, - "description": "A beam of nano disruption which can both cause damage to enemies\nand re-generate allies. Alternate fire can auto target up to six allied targets\nat once.", + "description": "A beam of nano disruption which can both cause damage to enemies\nand re-generate allies. Alternate fire can auto target up to six allied targets\nat once. (2364175165_10|8cea733d_16)", "size": "T4", "type": "Weapon", "active": true, - "health": 18423 + "health": 18423, + "ignore_in_weapon_list": false }, "spriteName": "Nano_Huge", "nameStrKey": "strT4NanoName", "mirrorCubeId": "", - "hexId": "8cea733d" + "hexId": "8cea733d", + "weapon": { + "damage_inflicted": 177, + "group_fire_scales": [ + 1.0 + ] + }, + "weapon_upgrade": { + "xp": 5.0, + "rating": 4, + "rank": 4, + "power": 0 + }, + "tree": { + "position_x": 9, + "position_y": 4, + "tech_points": 177, + "neighbours": [ + 1671695619 + ], + "requires": [ + 1671695619 + ] + } }, "T4Aeroflak hexCode:eb500d40 intCode:3947892032": { "id": 3947892032, "info": { "category": "Aeroflak", - "placements": 62, + "placements": 63, "stats": {}, "description": "T4Aeroflak (3947892032_10|eb500d40_16) without a description", "size": "T4", "type": "Weapon", - "active": true + "active": true, + "ignore_in_weapon_list": false }, "spriteName": "Flak_Huge", "nameStrKey": "strT4AeroflakName", "mirrorCubeId": "", - "hexId": "eb500d40" + "hexId": "eb500d40", + "weapon": { + "damage_inflicted": 178, + "group_fire_scales": [ + 1.0 + ] + }, + "weapon_upgrade": { + "xp": 5.0, + "rating": 4, + "rank": 4, + "power": 0 + }, + "tree": { + "position_x": 10, + "position_y": 4, + "tech_points": 178, + "neighbours": [ + 2364175165 + ], + "requires": [ + 2364175165 + ] + } }, "T5Aeroflak hexCode:046328f5 intCode:73607413": { "id": 73607413, "info": { "category": "Aeroflak", - "placements": 2, + "placements": 63, "stats": {}, "description": "T5Aeroflak (73607413_10|046328f5_16) without a description", "size": "T5", "type": "Weapon", - "active": true + "active": true, + "ignore_in_weapon_list": false }, "spriteName": "Aeroflak", "nameStrKey": "strT5AeroflakName", "mirrorCubeId": "", - "hexId": "046328f5" + "hexId": "046328f5", + "weapon": { + "damage_inflicted": 179, + "group_fire_scales": [ + 1.0 + ] + }, + "weapon_upgrade": { + "xp": 6.0, + "rating": 5, + "rank": 5, + "power": 0 + }, + "tree": { + "position_x": 11, + "position_y": 4, + "tech_points": 179, + "neighbours": [ + 3947892032 + ], + "requires": [ + 3947892032 + ] + } }, "T3Seeker hexCode:02deb667 intCode:48150119": { "id": 48150119, "info": { "category": "Seeker", - "placements": 62, + "placements": 63, "stats": {}, "description": "T3Seeker (48150119_10|02deb667_16) without a description", "size": "T3", "type": "Weapon", - "active": true + "active": true, + "ignore_in_weapon_list": false }, "spriteName": "Seeker", "nameStrKey": "strT3SeekerName", "mirrorCubeId": "", - "hexId": "02deb667" + "hexId": "02deb667", + "weapon": { + "damage_inflicted": 180, + "group_fire_scales": [ + 1.0 + ] + }, + "weapon_upgrade": { + "xp": 4.0, + "rating": 3, + "rank": 3, + "power": 0 + }, + "tree": { + "position_x": 12, + "position_y": 4, + "tech_points": 180, + "neighbours": [ + 73607413 + ], + "requires": [ + 73607413 + ] + } }, "T4Seeker hexCode:14e875fd intCode:350778877": { "id": 350778877, "info": { "category": "Seeker", - "placements": 62, + "placements": 63, "stats": {}, "description": "T4Seeker (350778877_10|14e875fd_16) without a description", "size": "T4", "type": "Weapon", - "active": true + "active": true, + "ignore_in_weapon_list": false }, "spriteName": "Lock_On_Missile_Launcher_Huge", "nameStrKey": "strT4SeekerName", "mirrorCubeId": "", - "hexId": "14e875fd" + "hexId": "14e875fd", + "weapon": { + "damage_inflicted": 181, + "group_fire_scales": [ + 1.0 + ] + }, + "weapon_upgrade": { + "xp": 5.0, + "rating": 4, + "rank": 4, + "power": 0 + }, + "tree": { + "position_x": 13, + "position_y": 4, + "tech_points": 181, + "neighbours": [ + 48150119 + ], + "requires": [ + 48150119 + ] + } }, "T5Seeker hexCode:903b4f3d intCode:2419806013": { "id": 2419806013, "info": { "category": "Seeker", - "placements": 2, + "placements": 63, "stats": {}, "description": "T5Seeker (2419806013_10|903b4f3d_16) without a description", "size": "T5", "type": "Weapon", - "active": true + "active": true, + "ignore_in_weapon_list": false }, "spriteName": "Lock_On_Missile_Launcher", "nameStrKey": "strT5SeekerName", "mirrorCubeId": "", - "hexId": "903b4f3d" + "hexId": "903b4f3d", + "weapon": { + "damage_inflicted": 182, + "group_fire_scales": [ + 1.0 + ] + }, + "weapon_upgrade": { + "xp": 6.0, + "rating": 5, + "rank": 5, + "power": 0 + }, + "tree": { + "position_x": 14, + "position_y": 4, + "tech_points": 182, + "neighbours": [ + 350778877 + ], + "requires": [ + 350778877 + ] + } }, "T4Ion hexCode:d3149701 intCode:3541341953": { "id": 3541341953, "info": { "category": "Ion", - "placements": 62, + "placements": 63, "stats": {}, "description": "T4Ion (3541341953_10|d3149701_16) without a description", "size": "T4", "type": "Weapon", - "active": true + "active": true, + "ignore_in_weapon_list": false }, "spriteName": "Ion_Destabiliser", "nameStrKey": "strT4IonName", "mirrorCubeId": "", - "hexId": "d3149701" + "hexId": "d3149701", + "weapon": { + "damage_inflicted": 183, + "group_fire_scales": [ + 1.0 + ] + }, + "weapon_upgrade": { + "xp": 5.0, + "rating": 4, + "rank": 4, + "power": 0 + }, + "tree": { + "position_x": 15, + "position_y": 4, + "tech_points": 183, + "neighbours": [ + 2419806013 + ], + "requires": [ + 2419806013 + ] + } }, "T5Ion hexCode:4694c17c intCode:1184153980": { "id": 1184153980, "info": { "category": "Ion", - "placements": 2, + "placements": 63, "stats": {}, "description": "T5Ion (1184153980_10|4694c17c_16) without a description", "size": "T5", "type": "Weapon", - "active": true + "active": true, + "ignore_in_weapon_list": false }, "spriteName": "Ion_Distorter", "nameStrKey": "strT5IonName", "mirrorCubeId": "", - "hexId": "4694c17c" + "hexId": "4694c17c", + "weapon": { + "damage_inflicted": 184, + "group_fire_scales": [ + 1.0 + ] + }, + "weapon_upgrade": { + "xp": 6.0, + "rating": 5, + "rank": 5, + "power": 0 + }, + "tree": { + "position_x": 0, + "position_y": 5, + "tech_points": 184, + "neighbours": [ + 3541341953 + ], + "requires": [ + 3541341953 + ] + } }, "T5IonCardLife hexCode:88ce2835 intCode:2295212085": { "id": 2295212085, "info": { "category": "Ion", - "placements": 2, + "placements": 63, "stats": {}, "description": "T5IonCardLife (2295212085_10|88ce2835_16) without a description", "size": "T5", "type": "Weapon", - "active": true + "active": true, + "ignore_in_weapon_list": false }, "spriteName": "T5_Ion_Cardlife", "nameStrKey": "strT5IonCardLifeName", "mirrorCubeId": "", - "hexId": "88ce2835" + "hexId": "88ce2835", + "tree": { + "position_x": 5, + "position_y": 9, + "tech_points": 185, + "neighbours": [], + "requires": [ + 227205318 + ] + } }, "T4Chaingun hexCode:4e910d6c intCode:1318129004": { "id": 1318129004, "info": { "category": "Chaingun", - "placements": 62, + "placements": 63, "stats": {}, "description": "T4Chaingun (1318129004_10|4e910d6c_16) without a description", "size": "T4", "type": "Weapon", - "active": true + "active": true, + "ignore_in_weapon_list": false }, "spriteName": "ChaingunSplitter", "nameStrKey": "strT4ChaingunName", "mirrorCubeId": "", - "hexId": "4e910d6c" + "hexId": "4e910d6c", + "weapon": { + "damage_inflicted": 186, + "group_fire_scales": [ + 1.0 + ] + }, + "weapon_upgrade": { + "xp": 5.0, + "rating": 4, + "rank": 4, + "power": 0 + }, + "tree": { + "position_x": 1, + "position_y": 5, + "tech_points": 186, + "neighbours": [ + 1184153980 + ], + "requires": [ + 1184153980 + ] + } }, "T5Chaingun hexCode:6b0a6196 intCode:1795842454": { "id": 1795842454, "info": { "category": "Chaingun", - "placements": 2, + "placements": 63, "stats": {}, "description": "T5Chaingun (1795842454_10|6b0a6196_16) without a description", "size": "T5", "type": "Weapon", - "active": true + "active": true, + "ignore_in_weapon_list": false }, "spriteName": "ChaingunShredder", "nameStrKey": "strT5ChaingunName", "mirrorCubeId": "", - "hexId": "6b0a6196" + "hexId": "6b0a6196", + "weapon": { + "damage_inflicted": 187, + "group_fire_scales": [ + 1.0 + ] + }, + "weapon_upgrade": { + "xp": 6.0, + "rating": 5, + "rank": 5, + "power": 0 + }, + "tree": { + "position_x": 2, + "position_y": 5, + "tech_points": 187, + "neighbours": [ + 1318129004 + ], + "requires": [ + 1318129004 + ] + } }, "T5Mortar hexCode:7067cb41 intCode:1885850433": { "id": 1885850433, "info": { "category": "Mortar", - "placements": 2, + "placements": 3, "stats": {}, "description": "T5Mortar (1885850433_10|7067cb41_16) without a description", "size": "T5", "type": "Weapon", - "active": true + "active": true, + "ignore_in_weapon_list": false }, "spriteName": "Mortar_Mega", "nameStrKey": "strT5MortarName", "mirrorCubeId": "", - "hexId": "7067cb41" + "hexId": "7067cb41", + "weapon": { + "damage_inflicted": 188, + "group_fire_scales": [ + 1.0 + ] + }, + "weapon_upgrade": { + "xp": 6.0, + "rating": 5, + "rank": 5, + "power": 0 + }, + "tree": { + "position_x": 3, + "position_y": 5, + "tech_points": 188, + "neighbours": [ + 1795842454 + ], + "requires": [ + 1795842454 + ] + } }, "T2Tesla hexCode:7842f73c intCode:2017654588": { "id": 2017654588, "info": { "category": "Tesla", - "placements": 2, + "placements": 63, "stats": { - "MASS": "12.5 Kg", - "ARMOR": "4,060", - "CPU LOAD": "20 pFLOP", - "ROBOT RANKING": "23,012.78", - "DAMAGE": "28,910" + "strMass": "12.5 [strKilograms]", + "strHealth": "4,060", + "strCPU": "20 [strPFlops]", + "strRobotRanking": "23,012.78", + "strDamageDS": "28,910" }, - "description": "A Melee weapon that packs a powerful punch.", + "description": "A Melee weapon that packs a powerful punch. (2017654588_10|7842f73c_16)", "size": "T2", "type": "Weapon", "active": true, "cpu": 20, - "health": 4060 + "health": 4060, + "ignore_in_weapon_list": false }, "spriteName": "Tesla_Medium", "nameStrKey": "strT2TeslaName", "mirrorCubeId": "", - "hexId": "7842f73c" + "hexId": "7842f73c", + "weapon": { + "damage_inflicted": 189, + "group_fire_scales": [ + 1.0 + ] + }, + "weapon_upgrade": { + "xp": 3.0, + "rating": 2, + "rank": 2, + "power": 0 + }, + "tree": { + "position_x": 4, + "position_y": 5, + "tech_points": 189, + "neighbours": [ + 1885850433 + ], + "requires": [ + 1885850433 + ] + } }, "T3Tesla hexCode:cf5f3638 intCode:3479123512": { "id": 3479123512, "info": { "category": "Tesla", - "placements": 2, + "placements": 63, "stats": { - "MASS": "15 Kg", - "ARMOR": "5,561", - "CPU LOAD": "22 pFLOP", - "ROBOT RANKING": "67,783.09", - "DAMAGE": "38,020" + "strMass": "15 [strKilograms]", + "strHealth": "5,561", + "strCPU": "22 [strPFlops]", + "strRobotRanking": "67,783.09", + "strDamageDS": "38,020" }, - "description": "A Melee weapon that packs a powerful punch.", + "description": "A Melee weapon that packs a powerful punch. (3479123512_10|cf5f3638_16)", "size": "T3", "type": "Weapon", "active": true, "cpu": 22, - "health": 5561 + "health": 5561, + "ignore_in_weapon_list": false }, "spriteName": "Tesla_Large", "nameStrKey": "strT3TeslaName", "mirrorCubeId": "", - "hexId": "cf5f3638" + "hexId": "cf5f3638", + "weapon": { + "damage_inflicted": 190, + "group_fire_scales": [ + 1.0 + ] + }, + "weapon_upgrade": { + "xp": 4.0, + "rating": 3, + "rank": 3, + "power": 0 + }, + "tree": { + "position_x": 5, + "position_y": 5, + "tech_points": 190, + "neighbours": [ + 2017654588 + ], + "requires": [ + 2017654588 + ] + } }, "T4Tesla hexCode:a121e82b intCode:2703353899": { "id": 2703353899, "info": { "category": "Tesla", - "placements": 2, + "placements": 63, "stats": { - "MASS": "15 Kg", - "ARMOR": "7,211", - "CPU LOAD": "24 pFLOP", - "ROBOT RANKING": "198,265.53", - "DAMAGE": "47,400" + "strMass": "15 [strKilograms]", + "strHealth": "7,211", + "strCPU": "24 [strPFlops]", + "strRobotRanking": "198,265.53", + "strDamageDS": "47,400" }, - "description": "A Melee weapon that packs a powerful punch.", + "description": "A Melee weapon that packs a powerful punch. (2703353899_10|a121e82b_16)", "size": "T4", "type": "Weapon", "active": true, "cpu": 24, - "health": 7211 + "health": 7211, + "ignore_in_weapon_list": false }, "spriteName": "Tesla_Huge", "nameStrKey": "strT4TeslaName", "mirrorCubeId": "", - "hexId": "a121e82b" + "hexId": "a121e82b", + "weapon": { + "damage_inflicted": 191, + "group_fire_scales": [ + 1.0 + ] + }, + "weapon_upgrade": { + "xp": 5.0, + "rating": 4, + "rank": 4, + "power": 0 + }, + "tree": { + "position_x": 6, + "position_y": 5, + "tech_points": 191, + "neighbours": [ + 3479123512 + ], + "requires": [ + 3479123512 + ] + } }, "T5EnergyModule hexCode:64e33e30 intCode:1692614192": { "id": 1692614192, "info": { "category": "EnergyModule", - "placements": 2, + "placements": 63, "stats": { - "MASS": "5 Kg", - "CPU LOAD": "0 pFLOPS", - "ROBOT RANKING": "0.00" + "strMass": "5 [strKilograms]", + "strCPU": "0 [strPFlops]S", + "strRobotRanking": "0.00" }, - "description": "You pilot your Megabot from this seat. The Mega seat also increases\nyour maximum CPU.", + "description": "You pilot your Megabot from this seat. The Mega seat also increases\nyour maximum CPU. (1692614192_10|64e33e30_16)", "size": "T5", "type": "Module", "active": true, - "cpu": 0 + "cpu": 0, + "ignore_in_weapon_list": true }, "spriteName": "Power_Booster", "nameStrKey": "strT5EnergyModuleName", "mirrorCubeId": "", - "hexId": "64e33e30" + "hexId": "64e33e30", + "tree": { + "position_x": 7, + "position_y": 5, + "tech_points": 192, + "neighbours": [ + 2703353899 + ], + "requires": [ + 2703353899 + ] + } }, "T5ShieldModule hexCode:c285b585 intCode:3263542661": { "id": 3263542661, "info": { "category": "ShieldModule", - "placements": 2, + "placements": 63, "stats": {}, "description": "T5ShieldModule (3263542661_10|c285b585_16) without a description", "size": "T5", "type": "Module", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Disc_Shield_Module", "nameStrKey": "strT5ShieldModuleName", "mirrorCubeId": "", - "hexId": "c285b585" + "hexId": "c285b585", + "tree": { + "position_x": 8, + "position_y": 5, + "tech_points": 193, + "neighbours": [ + 1692614192 + ], + "requires": [ + 1692614192 + ] + } }, "T5BlinkModule hexCode:eda88952 intCode:3987245394": { "id": 3987245394, "info": { "category": "BlinkModule", - "placements": 2, + "placements": 63, "stats": {}, "description": "T5BlinkModule (3987245394_10|eda88952_16) without a description", "size": "T5", "type": "Module", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Teleport_Module", "nameStrKey": "strT5BlinkModuleName", "mirrorCubeId": "", - "hexId": "eda88952" + "hexId": "eda88952", + "tree": { + "position_x": 9, + "position_y": 5, + "tech_points": 194, + "neighbours": [ + 3263542661 + ], + "requires": [ + 3263542661 + ] + } }, "T5GhostModule hexCode:fc266bcd intCode:4230376397": { "id": 4230376397, "info": { "category": "GhostModule", - "placements": 2, + "placements": 63, "stats": {}, "description": "T5GhostModule (4230376397_10|fc266bcd_16) without a description", "size": "T5", "type": "Module", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Cloak_Module", "nameStrKey": "strT5GhostModuleName", "mirrorCubeId": "", - "hexId": "fc266bcd" + "hexId": "fc266bcd", + "tree": { + "position_x": 10, + "position_y": 5, + "tech_points": 195, + "neighbours": [ + 3987245394 + ], + "requires": [ + 3987245394 + ] + } }, "T5EmpModule hexCode:273fbcf0 intCode:658488560": { "id": 658488560, "info": { "category": "EmpModule", - "placements": 2, + "placements": 63, "stats": {}, "description": "T5EmpModule (658488560_10|273fbcf0_16) without a description", "size": "T5", "type": "Module", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "EMP_Module", "nameStrKey": "strT5EmpModuleName", "mirrorCubeId": "", - "hexId": "273fbcf0" + "hexId": "273fbcf0", + "tree": { + "position_x": 11, + "position_y": 5, + "tech_points": 196, + "neighbours": [ + 4230376397 + ], + "requires": [ + 4230376397 + ] + } }, "T5WindowmakerModule hexCode:148241ee intCode:344080878": { "id": 344080878, "info": { "category": "WindowmakerModule", - "placements": 2, + "placements": 63, "stats": {}, "description": "T5WindowmakerModule (344080878_10|148241ee_16) without a description", "size": "T5", "type": "Module", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Radar_Module", "nameStrKey": "strT5WindowmakerModuleName", "mirrorCubeId": "", - "hexId": "148241ee" + "hexId": "148241ee", + "tree": { + "position_x": 12, + "position_y": 5, + "tech_points": 197, + "neighbours": [ + 658488560 + ], + "requires": [ + 658488560 + ] + } }, "ElectroshieldL hexCode:4b5abaa6 intCode:1264237222": { "id": 1264237222, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "ElectroshieldL (1264237222_10|4b5abaa6_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Electroshield_Left", "nameStrKey": "strElectroshieldLName", @@ -3795,12 +5596,13 @@ "id": 2965095316, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "ElectroshieldR (2965095316_10|b0bbc394_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Electroshield_Right", "nameStrKey": "strElectroshieldRName", @@ -3811,12 +5613,13 @@ "id": 2457663915, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "ElectroshieldAL (2457663915_10|927cf9ab_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Electroshield_A_Left", "nameStrKey": "strElectroshieldALName", @@ -3827,12 +5630,13 @@ "id": 1771929753, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "ElectroshieldAR (1771929753_10|699d8099_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Electroshield_A_Right", "nameStrKey": "strElectroshieldARName", @@ -3843,12 +5647,13 @@ "id": 627128495, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "ElectroshieldBL (627128495_10|256138af_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Electroshield_B_Left", "nameStrKey": "strElectroshieldBLName", @@ -3859,12 +5664,13 @@ "id": 3732947357, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "ElectroshieldBR (3732947357_10|de80419d_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Electroshield_B_Right", "nameStrKey": "strElectroshieldBRName", @@ -3875,12 +5681,13 @@ "id": 540114865, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "ElectroshieldCL (540114865_10|20317fb1_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Electroshield_C_Left", "nameStrKey": "strElectroshieldCLName", @@ -3891,12 +5698,13 @@ "id": 3687843459, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "ElectroshieldCR (3687843459_10|dbd00683_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Electroshield_C_Right", "nameStrKey": "strElectroshieldCRName", @@ -3907,12 +5715,13 @@ "id": 2536292021, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "ElectroshieldDL (2536292021_10|972cbeb5_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Electroshield_D_Left", "nameStrKey": "strElectroshieldDLName", @@ -3923,12 +5732,13 @@ "id": 1825425287, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "ElectroshieldDR (1825425287_10|6ccdc787_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Electroshield_D_Right", "nameStrKey": "strElectroshieldDRName", @@ -3939,19 +5749,19 @@ "id": 3248328684, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU": "36 pFLOPS", - "ROBOT RANKING": "1,913.19", - "ARMOR": "513", - "SHIELD": "5,126", - "MASS": "10 Kg" + "strCPU": "36 [strPFlops]S", + "strRobotRanking": "1,913.19", + "strHealth": "513", + "strMass": "10 [strKilograms]" }, - "description": "A powerful defensive item which utilizes an electrical shield for\ndefence, strong against high powered weapons", + "description": "A powerful defensive item which utilizes an electrical shield for\ndefence, strong against high powered weapons (3248328684_10|c19d8fec_16)", "size": "T3", "type": "NotAFunctionalItem", "active": true, - "health": 513 + "health": 513, + "ignore_in_weapon_list": true }, "spriteName": "Football_Plate_Left", "nameStrKey": "strT3ElectroShieldDLFootballName", @@ -3962,19 +5772,19 @@ "id": 3152416924, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU": "36 pFLOPS", - "ROBOT RANKING": "1,913.19", - "ARMOR": "513", - "SHIELD": "5,126", - "MASS": "10 Kg" + "strCPU": "36 [strPFlops]S", + "strRobotRanking": "1,913.19", + "strHealth": "513", + "strMass": "10 [strKilograms]" }, - "description": "A powerful defensive item which utilizes an electrical shield for\ndefence, strong against high powered weapons", + "description": "A powerful defensive item which utilizes an electrical shield for\ndefence, strong against high powered weapons (3152416924_10|bbe6109c_16)", "size": "T3", "type": "NotAFunctionalItem", "active": true, - "health": 513 + "health": 513, + "ignore_in_weapon_list": true }, "spriteName": "Football_Plate_Right", "nameStrKey": "strT3ElectroShieldDRFootballName", @@ -3985,19 +5795,19 @@ "id": 726724318, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU": "36 pFLOPS", - "ROBOT RANKING": "1,913.19", - "ARMOR": "513", - "SHIELD": "5,126", - "MASS": "10 Kg" + "strCPU": "36 [strPFlops]S", + "strRobotRanking": "1,913.19", + "strHealth": "513", + "strMass": "10 [strKilograms]" }, - "description": "A powerful defensive item which utilizes an electrical shield for\ndefence, strong against high powered weapons", + "description": "A powerful defensive item which utilizes an electrical shield for\ndefence, strong against high powered weapons (726724318_10|2b50eede_16)", "size": "T3", "type": "NotAFunctionalItem", "active": true, - "health": 513 + "health": 513, + "ignore_in_weapon_list": true }, "spriteName": "Spiked_Plate_Left", "nameStrKey": "strT3ElectroShieldDLSpikedName", @@ -4008,19 +5818,19 @@ "id": 1361801646, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU": "36 pFLOPS", - "ROBOT RANKING": "1,913.19", - "ARMOR": "513", - "SHIELD": "5,126", - "MASS": "10 Kg" + "strCPU": "36 [strPFlops]S", + "strRobotRanking": "1,913.19", + "strHealth": "513", + "strMass": "10 [strKilograms]" }, - "description": "A powerful defensive item which utilizes an electrical shield for\ndefence, strong against high powered weapons", + "description": "A powerful defensive item which utilizes an electrical shield for\ndefence, strong against high powered weapons (1361801646_10|512b71ae_16)", "size": "T3", "type": "NotAFunctionalItem", "active": true, - "health": 513 + "health": 513, + "ignore_in_weapon_list": true }, "spriteName": "Spiked_Plate_Right", "nameStrKey": "strT3ElectroShieldDRSpikedName", @@ -4031,12 +5841,13 @@ "id": 1309343160, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "ElectroshieldEL (1309343160_10|4e0afdb8_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Electroshield_E_Left", "nameStrKey": "strElectroshieldELName", @@ -4047,12 +5858,13 @@ "id": 3052110986, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "ElectroshieldER (3052110986_10|b5eb848a_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Electroshield_E_Right", "nameStrKey": "strElectroshieldERName", @@ -4063,12 +5875,13 @@ "id": 4179049660, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "ElectroshieldFL (4179049660_10|f9173cbc_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Electroshield_F_Left", "nameStrKey": "strElectroshieldFLName", @@ -4079,12 +5892,13 @@ "id": 49694094, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "ElectroshieldFR (49694094_10|02f6458e_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Electroshield_F_Right", "nameStrKey": "strElectroshieldFRName", @@ -4095,12 +5909,13 @@ "id": 1152021380, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "ElectroshieldGL (1152021380_10|44aa7384_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Electroshield_G_Left", "nameStrKey": "strElectroshieldGLName", @@ -4111,12 +5926,13 @@ "id": 3209366198, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "ElectroshieldGR (3209366198_10|bf4b0ab6_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Electroshield_G_Right", "nameStrKey": "strElectroshieldGRName", @@ -4127,12 +5943,13 @@ "id": 4088902272, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "ElectroshieldHL (4088902272_10|f3b7b280_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Electroshield_H_Left", "nameStrKey": "strElectroshieldHLName", @@ -4143,12 +5960,13 @@ "id": 139905970, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "ElectroshieldHR (139905970_10|0856cbb2_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Electroshield_H_Right", "nameStrKey": "strElectroshieldHRName", @@ -4159,20 +5977,19 @@ "id": 3823106277, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU": "56 pFLOPS", - "ROBOT RANKING": "427,033.46", - "ARMOR": "1,026", - "SHIELD": "24,420", - "MASS": "83 Kg", - "OVERCLOCK": "Recharges more quickly with a reduced cooldown wait time." + "strCPU": "56 [strPFlops]S", + "strRobotRanking": "427,033.46", + "strHealth": "1,026", + "strMass": "83 [strKilograms]" }, - "description": "A tough lightweight shield that self-recharges after taking damage.", + "description": "A tough lightweight shield that self-recharges after taking damage. (3823106277_10|e3dff8e5_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, - "health": 1026 + "health": 1026, + "ignore_in_weapon_list": true }, "spriteName": "Electroshield_I_Left", "nameStrKey": "strElectroshieldILName", @@ -4183,20 +6000,19 @@ "id": 1889152405, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU": "56pFLOPS", - "ROBOT RANKING": "427,033.46", - "ARMOR": "1,026", - "SHIELD": "24,420", - "MASS": "83 Kg", - "OVERCLOCK": "Recharges more quickly with a reduced cooldown wait time." + "strCPU": "56[strPFlops]S", + "strRobotRanking": "427,033.46", + "strHealth": "1,026", + "strMass": "83 [strKilograms]" }, - "description": "A tough lightweight shield that self-recharges after taking damage.", + "description": "A tough lightweight shield that self-recharges after taking damage. (1889152405_10|709a2d95_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, - "health": 1026 + "health": 1026, + "ignore_in_weapon_list": true }, "spriteName": "Electroshield_I_Right", "nameStrKey": "strElectroshieldIRName", @@ -4207,20 +6023,19 @@ "id": 3001609712, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU": "200 pFLOPS", - "ROBOT RANKING": "11,118,121", - "ARMOR": "1,436", - "SHIELD": "34,188", - "MASS": "135 Kg", - "OVERCLOCK": "Recharges more quickly with a reduced cooldown wait time." + "strCPU": "200 [strPFlops]S", + "strRobotRanking": "11,118,121", + "strHealth": "1,436", + "strMass": "135 [strKilograms]" }, - "description": "A Massive Massive Electroplate", + "description": "A Massive Massive Electroplate (3001609712_10|b2e8edf0_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, - "health": 1436 + "health": 1436, + "ignore_in_weapon_list": true }, "spriteName": "Electroshield_J_Left", "nameStrKey": "strElectroshieldJLName", @@ -4231,20 +6046,19 @@ "id": 3365106304, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU": "200 pFLOPS", - "ROBOT RANKING": "11,118,121", - "ARMOR": "1,436", - "SHIELD": "34,188", - "MASS": "135 Kg", - "OVERCLOCK": "Recharges more quickly with a reduced cooldown wait time." + "strCPU": "200 [strPFlops]S", + "strRobotRanking": "11,118,121", + "strHealth": "1,436", + "strMass": "135 [strKilograms]" }, - "description": "A Massive Massive Electroplate", + "description": "A Massive Massive Electroplate (3365106304_10|c8937280_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, - "health": 1436 + "health": 1436, + "ignore_in_weapon_list": true }, "spriteName": "Electroshield_J_Right", "nameStrKey": "strElectroshieldJRName", @@ -4255,20 +6069,19 @@ "id": 991790322, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU": "200 pFLOPS", - "ROBOT RANKING": "11,118,121", - "ARMOR": "1,436", - "SHIELD": "34,188", - "MASS": "169 Kg", - "OVERCLOCK": "Recharges more quickly with a reduced cooldown wait time." + "strCPU": "200 [strPFlops]S", + "strRobotRanking": "11,118,121", + "strHealth": "1,436", + "strMass": "169 [strKilograms]" }, - "description": "A Massive Massive Electroplate", + "description": "A Massive Massive Electroplate (991790322_10|3b1d84f2_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, - "health": 1436 + "health": 1436, + "ignore_in_weapon_list": true }, "spriteName": "Electroshield_K_Left", "nameStrKey": "strElectroshieldKLName", @@ -4279,20 +6092,19 @@ "id": 1097210754, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU": "200 pFLOPS", - "ROBOT RANKING": "11,118,121", - "ARMOR": "1,436", - "SHIELD": "34,188", - "MASS": "169 Kg", - "OVERCLOCK": "Recharges more quickly with a reduced cooldown wait time." + "strCPU": "200 [strPFlops]S", + "strRobotRanking": "11,118,121", + "strHealth": "1,436", + "strMass": "169 [strKilograms]" }, - "description": "A Massive Massive Electroplate", + "description": "A Massive Massive Electroplate (1097210754_10|41661b82_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, - "health": 1436 + "health": 1436, + "ignore_in_weapon_list": true }, "spriteName": "Electroshield_K_Right", "nameStrKey": "strElectroshieldKRName", @@ -4303,12 +6115,13 @@ "id": 1301942811, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "BronzeLeagueBadge (1301942811_10|4d9a121b_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Bronze_League_Bade", "nameStrKey": "strBronzeLeagueBadgeName", @@ -4319,12 +6132,13 @@ "id": 4157599523, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "SilverLeagueBadge (4157599523_10|f7cfef23_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Silver_League_Badge", "nameStrKey": "strSilverLeagueBadgeName", @@ -4335,12 +6149,13 @@ "id": 1893098069, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "GoldLeagueBadge (1893098069_10|70d66255_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Gold_League_Badge", "nameStrKey": "strGoldLeagueBadgeName", @@ -4351,12 +6166,13 @@ "id": 608517870, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "DiamondLeagueBadge (608517870_10|24453eee_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Diamond_League_Badge", "nameStrKey": "strDiamondLeagueBadgeName", @@ -4367,12 +6183,14 @@ "id": 2046961989, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "ProtoniumLeagueBadge (2046961989_10|7a022945_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "protonium": true, + "ignore_in_weapon_list": true }, "spriteName": "Protonium_League_Badge", "nameStrKey": "strProtoniumLeagueBadgeName", @@ -4383,12 +6201,14 @@ "id": 1988022506, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "ProtoniumLeagueFiveStarsBadge (1988022506_10|767ed0ea_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "protonium": true, + "ignore_in_weapon_list": true }, "spriteName": "Protonium_League_Five_Stars_Badge", "nameStrKey": "strProtoniumLeagueFiveStarsBadgeName", @@ -4399,12 +6219,13 @@ "id": 1704793982, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "VigilantEyeL (1704793982_10|659d177e_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Vigilant_Eye_Left", "nameStrKey": "strVigilantEyeLName", @@ -4415,12 +6236,13 @@ "id": 3558508089, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "VigilantEyeR (3558508089_10|d41a8639_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Vigilant_Eye_Right", "nameStrKey": "strVigilantEyeRName", @@ -4431,12 +6253,13 @@ "id": 767825476, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "CatEyeL (767825476_10|2dc41644_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Cat_Eye_Left", "nameStrKey": "strCatEyeLName", @@ -4447,12 +6270,13 @@ "id": 683945560, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "CatEyeR (683945560_10|28c42e58_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Cat_Eye_Right", "nameStrKey": "strCatEyeRName", @@ -4463,12 +6287,13 @@ "id": 1609561971, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "CyborgEye (1609561971_10|5feff773_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Cyborg_Eye", "nameStrKey": "strCyborgEyeName", @@ -4479,12 +6304,13 @@ "id": 108680691, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "SpikePin (108680691_10|067a55f3_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Spike_Pin", "nameStrKey": "strSpikePinName", @@ -4495,12 +6321,13 @@ "id": 955529870, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "SpikeNeedle (955529870_10|38f43a8e_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Spike_Needle", "nameStrKey": "strSpikeNeedleName", @@ -4511,19 +6338,20 @@ "id": 688123941, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "A Cosmetic Spike which is used to make fierce looking Robots", + "description": "A Cosmetic Spike which is used to make fierce looking Robots (688123941_10|2903f025_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Spike_Dagger", "nameStrKey": "strSpikeDaggerName", @@ -4534,12 +6362,13 @@ "id": 1991524976, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "SpikeClaw (1991524976_10|76b44270_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Spike_Claw", "nameStrKey": "strSpikeClawName", @@ -4549,20 +6378,21 @@ "VaporTrailSingle hexCode:d738f0a1 intCode:3610833057": { "id": 3610833057, "info": { - "category": "Rail", - "placements": 2, + "category": "NotAFunctionalItem", + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOP", - "ROBOT RATING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "A cosmetic vapor trail to leave a cool looking trail wherever you\ndrive.", + "description": "A cosmetic vapor trail to leave a cool looking trail wherever you\ndrive. (3610833057_10|d738f0a1_16)", "size": "NoTier", - "type": "Weapon", + "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Vapor_Trail_Single", "nameStrKey": "strVaporTrailSingleName", @@ -4572,20 +6402,21 @@ "VaporTrailTwin hexCode:0e1eb3ac intCode:236893100": { "id": 236893100, "info": { - "category": "Rail", - "placements": 2, + "category": "NotAFunctionalItem", + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOP", - "ROBOT RATING": "0.00", - "ARMOR": "88", - "MASS": "7.5 Kg" + "strCPU": "1 [strPFlops]", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "7.5 [strKilograms]" }, - "description": "Leave a twin trail and a longer trail than the L1.", + "description": "Leave a twin trail and a longer trail than the L1. (236893100_10|0e1eb3ac_16)", "size": "NoTier", - "type": "Weapon", + "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Vapor_Trail_Twin", "nameStrKey": "strVaporTrailTwinName", @@ -4596,19 +6427,20 @@ "id": 2782198650, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOP", - "ROBOT RATING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Get your Robot name on the side of your Robot with this banner.", + "description": "Get your Robot name on the side of your Robot with this banner. (2782198650_10|a5d4fb7a_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Robot_Name_Banner", "nameStrKey": "strRobotNameBannerName", @@ -4619,20 +6451,20 @@ "id": 1367205243, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "MASS": "5 Kg", - "LIGHT OUTPUT": "7000 lm", - "CPU LOAD": "25 pFLOPS", - "ROBOT RANKING": "25.00", - "ARMOR": "120" + "strMass": "5 [strKilograms]", + "strCPU": "25 [strPFlops]S", + "strRobotRanking": "25.00", + "strHealth": "120" }, - "description": "Casts light forwards. Very useful on dark planets or when the sun\ngoes down.", + "description": "Casts light forwards. Very useful on dark planets or when the sun\ngoes down. (1367205243_10|517de57b_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 25, - "health": 120 + "health": 120, + "ignore_in_weapon_list": true }, "spriteName": "Headlamp", "nameStrKey": "strHeadlampName", @@ -4643,19 +6475,20 @@ "id": 2820370110, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "ARMOR": "88", - "CPU LOAD": "1 pFLOP", - "ROBOT RANKING": "0.00", - "MASS": "5 Kg" + "strHealth": "88", + "strCPU": "1 [strPFlops]", + "strRobotRanking": "0.00", + "strMass": "5 [strKilograms]" }, - "description": "A visual display for the current height of your robot.", + "description": "A visual display for the current height of your robot. (2820370110_10|a81b6ebe_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Altimeter", "nameStrKey": "strAltimeterName", @@ -4666,19 +6499,20 @@ "id": 3531325242, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "ARMOR": "88", - "CPU LOAD": "1 pFLOP", - "ROBOT RANKING": "0.00", - "MASS": "5 Kg" + "strHealth": "88", + "strCPU": "1 [strPFlops]", + "strRobotRanking": "0.00", + "strMass": "5 [strKilograms]" }, - "description": "A visual display for the current speed of your robot.", + "description": "A visual display for the current speed of your robot. (3531325242_10|d27bbf3a_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Speedometer", "nameStrKey": "strSpeedometerName", @@ -4689,19 +6523,20 @@ "id": 4175295691, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOP", - "ROBOT RATING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "A cosmetic badge with a country flag on it for the side of your Robot.", + "description": "A cosmetic badge with a country flag on it for the side of your Robot. (4175295691_10|f8ddf4cb_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_FlagUnitedKingdom", "nameStrKey": "strUKHoloflagName", @@ -4712,19 +6547,20 @@ "id": 3559676835, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOP", - "ROBOT RATING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "A cosmetic badge with a country flag on it for the side of your Robot.", + "description": "A cosmetic badge with a country flag on it for the side of your Robot. (3559676835_10|d42c5ba3_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_FlagUSA", "nameStrKey": "strUSAHoloflagName", @@ -4735,19 +6571,20 @@ "id": 4065608086, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOP", - "ROBOT RATING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "A cosmetic badge with a country flag on it for the side of your Robot.", + "description": "A cosmetic badge with a country flag on it for the side of your Robot. (4065608086_10|f2544196_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_FlagRussia", "nameStrKey": "strRussiaHoloflagName", @@ -4758,19 +6595,20 @@ "id": 2020064218, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOP", - "ROBOT RATING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "A cosmetic badge with a country flag on it for the side of your Robot.", + "description": "A cosmetic badge with a country flag on it for the side of your Robot. (2020064218_10|7867bbda_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_FlagJapan", "nameStrKey": "strJapanHoloflagName", @@ -4781,19 +6619,20 @@ "id": 2730691972, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOP", - "ROBOT RATING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "A cosmetic badge with a country flag on it for the side of your Robot.", + "description": "A cosmetic badge with a country flag on it for the side of your Robot. (2730691972_10|a2c30d84_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_FlagPoland", "nameStrKey": "strPolandHoloflagName", @@ -4804,19 +6643,20 @@ "id": 2596479965, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOP", - "ROBOT RATING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "A cosmetic badge with a country flag on it for the side of your Robot.", + "description": "A cosmetic badge with a country flag on it for the side of your Robot. (2596479965_10|9ac323dd_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_FlagGermany", "nameStrKey": "strGermanyHoloflagName", @@ -4827,19 +6667,20 @@ "id": 1385335421, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOP", - "ROBOT RATING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "A cosmetic badge with a country flag on it for the side of your Robot.", + "description": "A cosmetic badge with a country flag on it for the side of your Robot. (1385335421_10|52928a7d_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_FlagCanada", "nameStrKey": "strCanadaHoloflagName", @@ -4850,19 +6691,20 @@ "id": 68277216, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOP", - "ROBOT RATING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "A cosmetic badge with a country flag on it for the side of your Robot.", + "description": "A cosmetic badge with a country flag on it for the side of your Robot. (68277216_10|0411d3e0_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_FlagUkraine", "nameStrKey": "strUkraineHoloflagName", @@ -4873,19 +6715,20 @@ "id": 3330651823, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOP", - "ROBOT RATING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "A cosmetic badge with a country flag on it for the side of your Robot.", + "description": "A cosmetic badge with a country flag on it for the side of your Robot. (3330651823_10|c685b6af_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_FlagKazakstan", "nameStrKey": "strKazakhstanHoloflagName", @@ -4896,19 +6739,20 @@ "id": 1768151340, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOP", - "ROBOT RATING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "A cosmetic badge with a country flag on it for the side of your Robot.", + "description": "A cosmetic badge with a country flag on it for the side of your Robot. (1768151340_10|6963d92c_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_FlagBelarus", "nameStrKey": "strBelarusHoloflagName", @@ -4919,19 +6763,20 @@ "id": 4166201860, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOP", - "ROBOT RATING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "A cosmetic badge with a country flag on it for the side of your Robot.", + "description": "A cosmetic badge with a country flag on it for the side of your Robot. (4166201860_10|f8533204_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_FlagItaly", "nameStrKey": "strItalyHoloflagName", @@ -4942,12 +6787,13 @@ "id": 1796059677, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "IcelandHoloflag (1796059677_10|6b0db21d_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Cube_FlagIceland", "nameStrKey": "strIcelandHoloflagName", @@ -4958,19 +6804,20 @@ "id": 3447406366, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOP", - "ROBOT RATING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "A cosmetic badge with a country flag on it for the side of your Robot.", + "description": "A cosmetic badge with a country flag on it for the side of your Robot. (3447406366_10|cd7b3f1e_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_FlagIreland", "nameStrKey": "strIrelandHoloflagName", @@ -4981,19 +6828,20 @@ "id": 664490215, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOP", - "ROBOT RATING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "A cosmetic badge with a country flag on it for the side of your Robot.", + "description": "A cosmetic badge with a country flag on it for the side of your Robot. (664490215_10|279b50e7_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_FlagAustralian", "nameStrKey": "strAustraliaHoloflagName", @@ -5004,19 +6852,20 @@ "id": 3114896263, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOP", - "ROBOT RATING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "A cosmetic badge with a country flag on it for the side of your Robot.", + "description": "A cosmetic badge with a country flag on it for the side of your Robot. (3114896263_10|b9a98b87_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_FlagSpanish", "nameStrKey": "strSpainHoloflagName", @@ -5027,19 +6876,20 @@ "id": 2243089188, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOP", - "ROBOT RATING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "A cosmetic badge with a country flag on it for the side of your Robot.", + "description": "A cosmetic badge with a country flag on it for the side of your Robot. (2243089188_10|85b2d324_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_FlagBrazil", "nameStrKey": "strBrazilHoloflagName", @@ -5050,19 +6900,20 @@ "id": 88051662, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOP", - "ROBOT RATING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "A cosmetic badge with a country flag on it for the side of your Robot.", + "description": "A cosmetic badge with a country flag on it for the side of your Robot. (88051662_10|053f8fce_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_FlagHolland", "nameStrKey": "strNetherlandsHoloflagName", @@ -5073,12 +6924,13 @@ "id": 1798659636, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "BelgiumHoloFlag (1798659636_10|6b355e34_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Cube_FlagBelgium", "nameStrKey": "strBelgiumHoloFlagName", @@ -5089,19 +6941,20 @@ "id": 354715741, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOP", - "ROBOT RATING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "A cosmetic badge with a country flag on it for the side of your Robot.", + "description": "A cosmetic badge with a country flag on it for the side of your Robot. (354715741_10|1524885d_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_FlagArgentina", "nameStrKey": "strArgentinaHoloflagName", @@ -5112,19 +6965,20 @@ "id": 1786715320, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOP", - "ROBOT RATING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "A cosmetic badge with a country flag on it for the side of your Robot.", + "description": "A cosmetic badge with a country flag on it for the side of your Robot. (1786715320_10|6a7f1cb8_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_FlagSweden", "nameStrKey": "strSwedenHoloflagName", @@ -5135,19 +6989,20 @@ "id": 3910121366, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOP", - "ROBOT RATING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "A cosmetic badge with a country flag on it for the side of your Robot.", + "description": "A cosmetic badge with a country flag on it for the side of your Robot. (3910121366_10|e90fb796_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_FlagChina", "nameStrKey": "strChinaHoloflagName", @@ -5158,19 +7013,20 @@ "id": 2373812955, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOP", - "ROBOT RATING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "A cosmetic badge with a country flag on it for the side of your Robot.", + "description": "A cosmetic badge with a country flag on it for the side of your Robot. (2373812955_10|8d7d82db_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_FlagFrance", "nameStrKey": "strFranceHoloflagName", @@ -5181,19 +7037,20 @@ "id": 460733827, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOP", - "ROBOT RATING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "A cosmetic badge with a country flag on it for the side of your Robot.", + "description": "A cosmetic badge with a country flag on it for the side of your Robot. (460733827_10|1b763d83_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_FlagSouthKorea", "nameStrKey": "strSouthKoreaHoloflagName", @@ -5204,12 +7061,13 @@ "id": 2855651676, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "NewZealandHoloFlag (2855651676_10|aa35c95c_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Cube_FlagNewZealand", "nameStrKey": "strNewZealandHoloFlagName", @@ -5220,12 +7078,13 @@ "id": 932603502, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "DanishHoloFlag (932603502_10|3796666e_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Cube_FlagDanish", "nameStrKey": "strDanishHoloFlagName", @@ -5236,12 +7095,13 @@ "id": 4070927930, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "TurkishHoloFlag (4070927930_10|f2a56e3a_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Cube_FlagTurkish", "nameStrKey": "strTurkishHoloFlagName", @@ -5252,12 +7112,13 @@ "id": 1020482017, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "OverwolfHoloflag (1020482017_10|3cd351e1_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Cube_FlagOverwolf", "nameStrKey": "strOverwolfHoloflagName", @@ -5268,19 +7129,20 @@ "id": 1958111892, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOP", - "ROBOT RATING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "An awesome holographic flag with the Robocraft logo on it.", + "description": "An awesome holographic flag with the Robocraft logo on it. (1958111892_10|74b66a94_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_FlagRobocraft", "nameStrKey": "strRobocraftHoloflagName", @@ -5291,19 +7153,20 @@ "id": 1039436321, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "A cosmetic badge with the Curse flag on it for the side of your Robot.", + "description": "A cosmetic badge with the Curse flag on it for the side of your Robot. (1039436321_10|3df48a21_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_FlagCurse", "nameStrKey": "strCurseHoloFlagName", @@ -5314,19 +7177,20 @@ "id": 3024755361, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "A cosmetic badge with the HumbleBundle flag on it for the side of\nyour Robot.", + "description": "A cosmetic badge with the HumbleBundle flag on it for the side of\nyour Robot. (3024755361_10|b44a1aa1_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_FlagHumbleBundlet", "nameStrKey": "strHumbleBundleHoloFlagName", @@ -5337,12 +7201,13 @@ "id": 1607707925, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "AbleGamersCharityHoloflag (1607707925_10|5fd3ad15_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Cube_AbleGamers", "nameStrKey": "strAbleGamersCharityHoloflagName", @@ -5353,12 +7218,13 @@ "id": 4079824960, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "YogscastHoloflag (4079824960_10|f32d3040_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Yogscast_Holoflag", "nameStrKey": "strYogscastHoloflagName", @@ -5369,12 +7235,13 @@ "id": 862329300, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "ChronoGGHoloflag (862329300_10|336619d4_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Cube_FlagChronogg", "nameStrKey": "strChronoGGHoloflagName", @@ -5385,12 +7252,13 @@ "id": 4124816651, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "PirateHoloflag (4124816651_10|f5dbb50b_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Pirate_Flag", "nameStrKey": "strPirateHoloflagName", @@ -5401,12 +7269,13 @@ "id": 1042028710, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "IntelHoloflag (1042028710_10|3e1c18a6_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Rainbow_Flag", "nameStrKey": "strIntelHoloflagName", @@ -5417,12 +7286,13 @@ "id": 2345098755, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "AlienwareHoloflag (2345098755_10|8bc75e03_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Alienware_flag", "nameStrKey": "strAlienwareHoloflagName", @@ -5433,19 +7303,20 @@ "id": 4200145444, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOP", - "ROBOT RATING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Show your support for Robocraft and the dev team with this Freejam\nbadge.", + "description": "Show your support for Robocraft and the dev team with this Freejam\nbadge. (4200145444_10|fa592224_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_FlagDevSupporter", "nameStrKey": "strDevSupporterHoloflagName", @@ -5456,19 +7327,20 @@ "id": 3370765914, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOP", - "ROBOT RATING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "A special show of support for Robocraft and the dev team with this\nGold Freejam badge.", + "description": "A special show of support for Robocraft and the dev team with this\nGold Freejam badge. (3370765914_10|c8e9ce5a_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_FlagGoldDevSupporter", "nameStrKey": "strGoldDevSupporterHoloflagName", @@ -5479,12 +7351,13 @@ "id": 3996493866, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "3YearsHoloflag (3996493866_10|ee35a82a_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "3_Years_Holoflag", "nameStrKey": "str3YearsHoloflagName", @@ -5495,12 +7368,13 @@ "id": 507555577, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "4YearsHoloflag (507555577_10|1e40aef9_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "4_Years_Holoflag", "nameStrKey": "str4YearsHoloflagName", @@ -5511,19 +7385,20 @@ "id": 1762483815, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Part of a set that forms a cosmetic American Footbal mask for your\nRobot.", + "description": "Part of a set that forms a cosmetic American Footbal mask for your\nRobot. (1762483815_10|690d5e67_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_Football_Guard_L", "nameStrKey": "strFootballGuardLName", @@ -5534,19 +7409,20 @@ "id": 326549783, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Part of a set that forms a cosmetic American Footbal mask for your\nRobot.", + "description": "Part of a set that forms a cosmetic American Footbal mask for your\nRobot. (326549783_10|1376c117_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_Football_Guard_R", "nameStrKey": "strFootballGuardRName", @@ -5557,19 +7433,20 @@ "id": 670637166, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Part of a set that forms a cosmetic American Footbal mask for your\nRobot.", + "description": "Part of a set that forms a cosmetic American Footbal mask for your\nRobot. (670637166_10|27f91c6e_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_Football_Face_L", "nameStrKey": "strFootballFaceLName", @@ -5580,19 +7457,20 @@ "id": 1568834334, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Part of a set that forms a cosmetic American Footbal mask for your\nRobot.", + "description": "Part of a set that forms a cosmetic American Footbal mask for your\nRobot. (1568834334_10|5d82831e_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_Football_Face_R", "nameStrKey": "strFootballFaceRName", @@ -5603,19 +7481,20 @@ "id": 438539744, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Part of a set that forms a cosmetic American Footbal mask for your\nRobot.", + "description": "Part of a set that forms a cosmetic American Footbal mask for your\nRobot. (438539744_10|1a2395e0_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_Football_Helmet_L", "nameStrKey": "strFootballHelmetLName", @@ -5626,19 +7505,20 @@ "id": 1616382608, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Part of a set that forms a cosmetic American Footbal mask for your\nRobot.", + "description": "Part of a set that forms a cosmetic American Footbal mask for your\nRobot. (1616382608_10|60580a90_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_Football_Helmet_R", "nameStrKey": "strFootballHelmetRName", @@ -5649,19 +7529,20 @@ "id": 451055140, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Part of a set that forms a cosmetic Mech mask for your Robot.", + "description": "Part of a set that forms a cosmetic Mech mask for your Robot. (451055140_10|1ae28e24_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Mech_7_Jaw_L", "nameStrKey": "strMech7JawLName", @@ -5672,19 +7553,20 @@ "id": 1620644180, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Part of a set that forms a cosmetic Mech mask for your Robot.", + "description": "Part of a set that forms a cosmetic Mech mask for your Robot. (1620644180_10|60991154_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Mech_7_Jaw_R", "nameStrKey": "strMech7JawRName", @@ -5695,19 +7577,20 @@ "id": 3561288328, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Part of a set that forms a cosmetic Mech mask for your Robot.", + "description": "Part of a set that forms a cosmetic Mech mask for your Robot. (3561288328_10|d444f288_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Mech_7_Nose_L", "nameStrKey": "strMech7NoseLName", @@ -5718,19 +7601,20 @@ "id": 2923392504, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Part of a set that forms a cosmetic Mech mask for your Robot.", + "description": "Part of a set that forms a cosmetic Mech mask for your Robot. (2923392504_10|ae3f6df8_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Mech_7_Nose_R", "nameStrKey": "strMech7NoseRName", @@ -5741,19 +7625,20 @@ "id": 2479898264, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Part of a set that forms a cosmetic Mech mask for your Robot.", + "description": "Part of a set that forms a cosmetic Mech mask for your Robot. (2479898264_10|93d03e98_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Mech_7_Side_L", "nameStrKey": "strMech7EarLName", @@ -5764,19 +7649,20 @@ "id": 3920339432, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Part of a set that forms a cosmetic Mech mask for your Robot.", + "description": "Part of a set that forms a cosmetic Mech mask for your Robot. (3920339432_10|e9aba1e8_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Mech_7_Side_R", "nameStrKey": "strMech7EarRName", @@ -5787,19 +7673,20 @@ "id": 2906446214, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Part of a set that forms a cosmetic Sabretooth mask for your Robot.", + "description": "Part of a set that forms a cosmetic Sabretooth mask for your Robot. (2906446214_10|ad3cd986_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Sabre_Jaw_L", "nameStrKey": "strSabretoothJawLName", @@ -5810,19 +7697,20 @@ "id": 3611772662, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Part of a set that forms a cosmetic Sabretooth mask for your Robot.", + "description": "Part of a set that forms a cosmetic Sabretooth mask for your Robot. (3611772662_10|d74746f6_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Sabre_Jaw_R", "nameStrKey": "strSabretoothJawRName", @@ -5833,19 +7721,20 @@ "id": 1217647354, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Part of a set that forms a cosmetic Sabretooth mask for your Robot.", + "description": "Part of a set that forms a cosmetic Sabretooth mask for your Robot. (1217647354_10|4893d2fa_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Sabre_Face_L", "nameStrKey": "strSabretoothFaceLName", @@ -5856,19 +7745,20 @@ "id": 854085002, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Part of a set that forms a cosmetic Sabretooth mask for your Robot.", + "description": "Part of a set that forms a cosmetic Sabretooth mask for your Robot. (854085002_10|32e84d8a_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Sabre_Face_R", "nameStrKey": "strSabretoothFaceRName", @@ -5879,19 +7769,20 @@ "id": 604924218, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Part of a set that forms a cosmetic Sabretooth mask for your Robot.", + "description": "Part of a set that forms a cosmetic Sabretooth mask for your Robot. (604924218_10|240e693a_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Sabre_Ear_L", "nameStrKey": "strSabretoothEarLName", @@ -5902,19 +7793,20 @@ "id": 1584789066, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Part of a set that forms a cosmetic Sabretooth mask for your Robot.", + "description": "Part of a set that forms a cosmetic Sabretooth mask for your Robot. (1584789066_10|5e75f64a_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Sabre_Ear_R", "nameStrKey": "strSabretoothEarRName", @@ -5925,19 +7817,20 @@ "id": 4155139139, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Part of a set that forms a cosmetic Rhino mask for your Robot.", + "description": "Part of a set that forms a cosmetic Rhino mask for your Robot. (4155139139_10|f7aa6443_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Rhino_8_Ear_L", "nameStrKey": "strRhino8EarLName", @@ -5948,19 +7841,20 @@ "id": 2379348787, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Part of a set that forms a cosmetic Rhino mask for your Robot.", + "description": "Part of a set that forms a cosmetic Rhino mask for your Robot. (2379348787_10|8dd1fb33_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Rhino_8_Ear_R", "nameStrKey": "strRhino8EarRName", @@ -5971,19 +7865,20 @@ "id": 2123945215, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Part of a set that forms a cosmetic Rhino mask for your Robot.", + "description": "Part of a set that forms a cosmetic Rhino mask for your Robot. (2123945215_10|7e98d4ff_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Rhino_8_Jaw_L", "nameStrKey": "strRhino8JawLName", @@ -5994,19 +7889,20 @@ "id": 82004879, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Part of a set that forms a cosmetic Rhino mask for your Robot.", + "description": "Part of a set that forms a cosmetic Rhino mask for your Robot. (82004879_10|04e34b8f_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Rhino_8_Jaw_R", "nameStrKey": "strRhino8JawRName", @@ -6017,19 +7913,20 @@ "id": 1554012392, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Part of a set that forms a cosmetic Rhino mask for your Robot.", + "description": "Part of a set that forms a cosmetic Rhino mask for your Robot. (1554012392_10|5ca058e8_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Rhino_8_Face_L", "nameStrKey": "strRhino8NoseLName", @@ -6040,19 +7937,20 @@ "id": 651937688, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Part of a set that forms a cosmetic Rhino mask for your Robot.", + "description": "Part of a set that forms a cosmetic Rhino mask for your Robot. (651937688_10|26dbc798_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Rhino_8_Face_R", "nameStrKey": "strRhino8NoseRName", @@ -6063,12 +7961,13 @@ "id": 38268230, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "EagleNeckL (38268230_10|0247ed46_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Eagle_Neck_L", "nameStrKey": "strEagleNeckLName", @@ -6079,12 +7978,13 @@ "id": 2017227318, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "EagleNeckR (2017227318_10|783c7236_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Eagle_Neck_R", "nameStrKey": "strEagleNeckRName", @@ -6095,12 +7995,13 @@ "id": 2829693731, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "EagleFeathersL (2829693731_10|a8a9b323_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Eagle_Feathers_L", "nameStrKey": "strEagleFeathersLName", @@ -6111,12 +8012,13 @@ "id": 3536989267, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "EagleFeathersR (3536989267_10|d2d22c53_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Eagle_Feathers_R", "nameStrKey": "strEagleFeathersRName", @@ -6127,12 +8029,13 @@ "id": 1797279669, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "EagleFaceL (1797279669_10|6b204fb5_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Eagle_Face_L", "nameStrKey": "strEagleFaceLName", @@ -6143,12 +8046,13 @@ "id": 291229893, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "EagleFaceR (291229893_10|115bd0c5_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Eagle_Face_R", "nameStrKey": "strEagleFaceRName", @@ -6159,12 +8063,13 @@ "id": 699401910, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "AlienwareMaskEarL (699401910_10|29b006b6_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Alienware_Mask_Ear_L", "nameStrKey": "strAlienwareMaskEarLName", @@ -6175,12 +8080,13 @@ "id": 3136672710, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "AlienwareMaskEarR (3136672710_10|baf5d3c6_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Alienware_Mask_Ear_R", "nameStrKey": "strAlienwareMaskEarRName", @@ -6191,12 +8097,13 @@ "id": 3969591264, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "AlienwareMaskHeadL (3969591264_10|ec9b27e0_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Alienware_Mask_Head_L", "nameStrKey": "strAlienwareMaskHeadLName", @@ -6207,12 +8114,13 @@ "id": 2145317520, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "AlienwareMaskHeadR (2145317520_10|7fdef290_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Alienware_Mask_Head_R", "nameStrKey": "strAlienwareMaskHeadRName", @@ -6223,12 +8131,13 @@ "id": 1314825875, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "AlienwareMaskJawL (1314825875_10|4e5ea693_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Alienware_Mask_Jaw_L", "nameStrKey": "strAlienwareMaskJawLName", @@ -6239,12 +8148,13 @@ "id": 3709563875, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "AlienwareMaskJawR (3709563875_10|dd1b73e3_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Alienware_Mask_Jaw_R", "nameStrKey": "strAlienwareMaskJawRName", @@ -6255,12 +8165,13 @@ "id": 1390502124, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "NinjaMaskBandanaL (1390502124_10|52e160ec_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Ninja_Bandana_L", "nameStrKey": "strNinjaMaskBandanaLName", @@ -6271,12 +8182,13 @@ "id": 3248797084, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "NinjaMaskBandanaR (3248797084_10|c1a4b59c_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Ninja_Bandana_R", "nameStrKey": "strNinjaMaskBandanaRName", @@ -6287,12 +8199,13 @@ "id": 989441293, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "NinjaMaskHeadL (989441293_10|3af9ad0d_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Ninja_Head_L", "nameStrKey": "strNinjaMaskHeadLName", @@ -6303,12 +8216,13 @@ "id": 2847701117, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "NinjaMaskHeadR (2847701117_10|a9bc787d_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Ninja_Head_R", "nameStrKey": "strNinjaMaskHeadRName", @@ -6319,12 +8233,13 @@ "id": 2503490917, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "NinjaMaskL (2503490917_10|95383d65_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Ninja_Mask_L", "nameStrKey": "strNinjaMaskLName", @@ -6335,12 +8250,13 @@ "id": 108914709, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "NinjaMaskR (108914709_10|067de815_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Ninja_Mask_R", "nameStrKey": "strNinjaMaskRName", @@ -6351,19 +8267,20 @@ "id": 2075163291, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Part of a set that form a cosmetic Halloween mask for your Robot.", + "description": "Part of a set that form a cosmetic Halloween mask for your Robot. (2075163291_10|7bb07a9b_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_Skull_Eye_L", "nameStrKey": "strScaryMaskEyesLName", @@ -6374,19 +8291,20 @@ "id": 30139883, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Part of a set that form a cosmetic Halloween mask for your Robot.", + "description": "Part of a set that form a cosmetic Halloween mask for your Robot. (30139883_10|01cbe5eb_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_Skull_Eye_R", "nameStrKey": "strScaryMaskEyesRName", @@ -6397,19 +8315,20 @@ "id": 2915102202, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Part of a set that form a cosmetic Halloween mask for your Robot.", + "description": "Part of a set that form a cosmetic Halloween mask for your Robot. (2915102202_10|adc0edfa_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_Skull_Horn_L", "nameStrKey": "strScaryMaskHornLName", @@ -6420,19 +8339,20 @@ "id": 3619385994, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Part of a set that form a cosmetic Halloween mask for your Robot.", + "description": "Part of a set that form a cosmetic Halloween mask for your Robot. (3619385994_10|d7bb728a_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_Skull_Horn_R", "nameStrKey": "strScaryMaskHornRName", @@ -6443,19 +8363,20 @@ "id": 665365647, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Part of a set that form a cosmetic Halloween mask for your Robot.", + "description": "Part of a set that form a cosmetic Halloween mask for your Robot. (665365647_10|27a8ac8f_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_Skull_Jaw_L", "nameStrKey": "strScaryMaskJawLName", @@ -6466,19 +8387,20 @@ "id": 1574122495, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Part of a set that form a cosmetic Halloween mask for your Robot.", + "description": "Part of a set that form a cosmetic Halloween mask for your Robot. (1574122495_10|5dd333ff_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_Skull_Jaw_R", "nameStrKey": "strScaryMaskJawRName", @@ -6489,19 +8411,20 @@ "id": 4200383087, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Part of a set that form a cosmetic Wolf mask for your Robot.", + "description": "Part of a set that form a cosmetic Wolf mask for your Robot. (4200383087_10|fa5cc26f_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_Overwolf_Ear_L", "nameStrKey": "strOverWolfEarLName", @@ -6512,19 +8435,20 @@ "id": 2150063391, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Part of a set that form a cosmetic Wolf mask for your Robot.", + "description": "Part of a set that form a cosmetic Wolf mask for your Robot. (2150063391_10|80275d1f_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_Overwolf_Ear_R", "nameStrKey": "strOverWolfEarRName", @@ -6535,19 +8459,20 @@ "id": 3060186489, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Part of a set that form a cosmetic Wolf mask for your Robot.", + "description": "Part of a set that form a cosmetic Wolf mask for your Robot. (3060186489_10|b666bd79_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_Overwolf_Nose_L", "nameStrKey": "strOverWolfEyeLName", @@ -6558,19 +8483,20 @@ "id": 3424461321, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Part of a set that form a cosmetic Wolf mask for your Robot.", + "description": "Part of a set that form a cosmetic Wolf mask for your Robot. (3424461321_10|cc1d2209_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_Overwolf_Nose_R", "nameStrKey": "strOverWolfEyeRName", @@ -6581,19 +8507,20 @@ "id": 1936618195, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Part of a set that form a cosmetic Wolf mask for your Robot.", + "description": "Part of a set that form a cosmetic Wolf mask for your Robot. (1936618195_10|736e72d3_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_Overwolf_Jaw_L", "nameStrKey": "strOverWolfJawLName", @@ -6604,19 +8531,20 @@ "id": 152432035, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Part of a set that form a cosmetic Wolf mask for your Robot.", + "description": "Part of a set that form a cosmetic Wolf mask for your Robot. (152432035_10|0915eda3_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_Overwolf_Jaw_R", "nameStrKey": "strOverWolfJawRName", @@ -6627,19 +8555,20 @@ "id": 1268201954, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Part of a set that forms a cosmetic Yogscast mask for your Robot.", + "description": "Part of a set that forms a cosmetic Yogscast mask for your Robot. (1268201954_10|4b9739e2_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_Honeydew_Horns_L", "nameStrKey": "strHoneydewHornsLName", @@ -6650,19 +8579,20 @@ "id": 837592722, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Part of a set that forms a cosmetic Yogscast mask for your Robot.", + "description": "Part of a set that forms a cosmetic Yogscast mask for your Robot. (837592722_10|31eca692_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_Honeydew_Horns_R", "nameStrKey": "strHoneydewHornsRName", @@ -6673,19 +8603,20 @@ "id": 1108501665, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Part of a set that forms a cosmetic Yogscast mask for your Robot.", + "description": "Part of a set that forms a cosmetic Yogscast mask for your Robot. (1108501665_10|421264a1_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_Honeydew_Face_L", "nameStrKey": "strHoneydewFaceLName", @@ -6696,19 +8627,20 @@ "id": 946469841, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Part of a set that forms a cosmetic Yogscast mask for your Robot.", + "description": "Part of a set that forms a cosmetic Yogscast mask for your Robot. (946469841_10|3869fbd1_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_Honeydew_Face_R", "nameStrKey": "strHoneydewFaceRName", @@ -6719,19 +8651,20 @@ "id": 1839067602, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Part of a set that forms a cosmetic Yogscast mask for your Robot.", + "description": "Part of a set that forms a cosmetic Yogscast mask for your Robot. (1839067602_10|6d9df1d2_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_Honeydew_Beard_L", "nameStrKey": "strHoneydewBeardLName", @@ -6742,19 +8675,20 @@ "id": 400977570, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": { - "CPU LOAD": "1 pFLOPS", - "ROBOT RANKING": "0.00", - "ARMOR": "88", - "MASS": "5 Kg" + "strCPU": "1 [strPFlops]S", + "strRobotRanking": "0.00", + "strHealth": "88", + "strMass": "5 [strKilograms]" }, - "description": "Part of a set that forms a cosmetic Yogscast mask for your Robot.", + "description": "Part of a set that forms a cosmetic Yogscast mask for your Robot. (400977570_10|17e66ea2_16)", "size": "NoTier", "type": "NotAFunctionalItem", "active": true, "cpu": 1, - "health": 88 + "health": 88, + "ignore_in_weapon_list": true }, "spriteName": "Cube_Honeydew_Beard_R", "nameStrKey": "strHoneydewBeardRName", @@ -6765,12 +8699,13 @@ "id": 1354711861, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "CockpitFrontL (1354711861_10|50bf4335_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Cockpit_Front_L", "nameStrKey": "strCockpitFrontLName", @@ -6781,12 +8716,13 @@ "id": 717544517, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "CockpitFrontR (717544517_10|2ac4dc45_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Cockpit_Front_R", "nameStrKey": "strCockpitFrontRName", @@ -6797,12 +8733,13 @@ "id": 2711624874, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "CockpitMidL (2711624874_10|a1a01caa_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Cockpit_Mid_L", "nameStrKey": "strCockpitMidLName", @@ -6813,12 +8750,13 @@ "id": 3688596442, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "CockpitMidR (3688596442_10|dbdb83da_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Cockpit_Mid_R", "nameStrKey": "strCockpitMidRName", @@ -6829,12 +8767,13 @@ "id": 2530225659, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "CockpitTopL (2530225659_10|96d02dfb_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Cockpit_Top_L", "nameStrKey": "strCockpitTopLName", @@ -6845,12 +8784,13 @@ "id": 3970675339, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "CockpitTopR (3970675339_10|ecabb28b_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Cockpit_Top_R", "nameStrKey": "strCockpitTopRName", @@ -6866,7 +8806,9 @@ "description": "ProtoniumCrystal (3950293873_10|eb74b371_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "protonium": true, + "ignore_in_weapon_list": true }, "spriteName": "CubeThumb_LightChassis_Cube", "nameStrKey": "strProtoniumCrystalName", @@ -6877,12 +8819,13 @@ "id": 2771514423, "info": { "category": "NotAFunctionalItem", - "placements": 0, + "placements": 63, "stats": {}, "description": "Equalizer (2771514423_10|a531f437_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "CubeThumb_LightChassis_Cube", "nameStrKey": "strEqualizerName", @@ -6893,12 +8836,14 @@ "id": 606866102, "info": { "category": "NotAFunctionalItem", - "placements": 0, + "placements": 63, "stats": {}, "description": "ProtoniumClasp (606866102_10|242c0ab6_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "protonium": true, + "ignore_in_weapon_list": true }, "spriteName": "CubeThumb_LightChassis_Cube", "nameStrKey": "strProtoniumClaspName", @@ -6908,13 +8853,14 @@ "FusionTower hexCode:eb87104b intCode:3951497291": { "id": 3951497291, "info": { - "category": "Ion", - "placements": 0, + "category": "NotAFunctionalItem", + "placements": 63, "stats": {}, "description": "FusionTower (3951497291_10|eb87104b_16) without a description", "size": "NoTier", - "type": "Weapon", - "active": true + "type": "NotAFunctionalItem", + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "CubeThumb_LightChassis_Cube", "nameStrKey": "strFusionTowerName", @@ -6925,12 +8871,13 @@ "id": 2843561040, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "PilotSeatCray (2843561040_10|a97d4c50_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "RC_Cube_PilotSeat_Cray", "nameStrKey": "strPilotSeatCrayName", @@ -6941,12 +8888,13 @@ "id": 1427441647, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "PilotSeatGene (1427441647_10|551507ef_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "RC_Cube_PilotSeat_Gene", "nameStrKey": "strPilotSeatGeneName", @@ -6957,12 +8905,13 @@ "id": 2325944783, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "PilotSeatMega (2325944783_10|8aa319cf_16) without a description", "size": "T5", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "RC_Cube_PilotSeat_Mega", "nameStrKey": "strPilotSeatMegaName", @@ -6973,12 +8922,13 @@ "id": 2743059293, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "PilotSeatRetro (2743059293_10|a37fc35d_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "RC_Cube_PilotSeat_Retro", "nameStrKey": "strPilotSeatRetroName", @@ -6989,12 +8939,13 @@ "id": 2484686408, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "BubbleBlower (2484686408_10|94194e48_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Bubble_Machine", "nameStrKey": "strBubbleBlowerName", @@ -7005,12 +8956,13 @@ "id": 346272734, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "Balloon (346272734_10|14a3b3de_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Balloon", "nameStrKey": "strBalloonName", @@ -7021,12 +8973,13 @@ "id": 3210649465, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "5YearsHoloflag (3210649465_10|bf5e9f79_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "5_Years_Holoflag", "nameStrKey": "str5YearsHoloflagName", @@ -7037,12 +8990,13 @@ "id": 799302218, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "TrexHeadL (799302218_10|2fa4624a_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "TRex_Mask_Head_L", "nameStrKey": "strTrexHeadLName", @@ -7053,12 +9007,13 @@ "id": 981970925, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "TrexHeadR (981970925_10|3a87afed_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "TRex_Mask_Head_R", "nameStrKey": "strTrexHeadRName", @@ -7069,12 +9024,13 @@ "id": 4069461414, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "TrexNoseL (4069461414_10|f28f0da6_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "TRex_Mask_Nose_L", "nameStrKey": "strTrexNoseLName", @@ -7085,12 +9041,13 @@ "id": 669458802, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "TrexNoseR (669458802_10|27e72172_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "TRex_Mask_Nose_R", "nameStrKey": "strTrexNoseRName", @@ -7101,12 +9058,13 @@ "id": 3618891370, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "TrexJawL (3618891370_10|d7b3e66a_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "TRex_Mask_Jaw_L", "nameStrKey": "strTrexJawLName", @@ -7117,12 +9075,13 @@ "id": 3670645745, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "TrexJawR (3670645745_10|dac99bf1_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "TRex_Mask_Jaw_R", "nameStrKey": "strTrexJawRName", @@ -7133,12 +9092,13 @@ "id": 1551110695, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "SilverLeagueBadgeArena (1551110695_10|5c741227_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "LeagueBadge_Arena_Silver", "nameStrKey": "strSilverLeagueBadgeArenaName", @@ -7149,12 +9109,13 @@ "id": 2514755079, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "GoldLeagueBadgeArena (2514755079_10|95e41e07_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "LeagueBadge_Arena_Gold", "nameStrKey": "strGoldLeagueBadgeArenaName", @@ -7165,12 +9126,13 @@ "id": 988387568, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "BronzeLeagueBadgeArena (988387568_10|3ae998f0_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "LeagueBadge_Arena_Bronze", "nameStrKey": "strBronzeLeagueBadgeArenaName", @@ -7181,12 +9143,13 @@ "id": 757806708, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "TopHundredHoloflag (757806708_10|2d2b3674_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Cube_FlagTopHundred", "nameStrKey": "strTopHundredHoloflagName", @@ -7197,172 +9160,273 @@ "id": 3546777424, "info": { "category": "Wheel", - "placements": 2, + "placements": 12, "stats": {}, "description": "T5SteeringWheelGolden (3546777424_10|d3678750_16) without a description", "size": "T5", "type": "Movement", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "T5_Wheel_Gold", "nameStrKey": "strT5SteeringWheelGoldenName", "mirrorCubeId": "", - "hexId": "d3678750" + "hexId": "d3678750", + "tree": { + "position_x": 6, + "position_y": 9, + "tech_points": 375, + "neighbours": [], + "requires": [ + 227205318 + ] + } }, "T5WheelGolden hexCode:896e4bf0 intCode:2305706992": { "id": 2305706992, "info": { "category": "Wheel", - "placements": 2, + "placements": 12, "stats": {}, "description": "T5WheelGolden (2305706992_10|896e4bf0_16) without a description", "size": "T5", "type": "Movement", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "T5_Wheel_Gold", "nameStrKey": "strT5WheelGoldenName", "mirrorCubeId": "", - "hexId": "896e4bf0" + "hexId": "896e4bf0", + "tree": { + "position_x": 7, + "position_y": 9, + "tech_points": 376, + "neighbours": [], + "requires": [ + 227205318 + ] + } }, "T5MechLegGolden hexCode:da2d6fc5 intCode:3660410821": { "id": 3660410821, "info": { "category": "MechLeg", - "placements": 2, + "placements": 3, "stats": {}, "description": "T5MechLegGolden (3660410821_10|da2d6fc5_16) without a description", "size": "T5", "type": "Movement", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "T5_Mech_Leg_Gold", "nameStrKey": "strT5MechLegGoldenName", "mirrorCubeId": "", - "hexId": "da2d6fc5" + "hexId": "da2d6fc5", + "tree": { + "position_x": 8, + "position_y": 9, + "tech_points": 377, + "neighbours": [], + "requires": [ + 227205318 + ] + } }, "T5HoverGolden hexCode:842bef5f intCode:2217471839": { "id": 2217471839, "info": { "category": "Hover", - "placements": 2, + "placements": 60, "stats": {}, "description": "T5HoverGolden (2217471839_10|842bef5f_16) without a description", "size": "T5", "type": "Movement", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "T5_Hover_Gold", "nameStrKey": "strT5HoverGoldenName", "mirrorCubeId": "", - "hexId": "842bef5f" + "hexId": "842bef5f", + "tree": { + "position_x": 9, + "position_y": 9, + "tech_points": 378, + "neighbours": [], + "requires": [ + 227205318 + ] + } }, "T5PlasmaGolden hexCode:d6414849 intCode:3594602569": { "id": 3594602569, "info": { "category": "Plasma", - "placements": 2, + "placements": 63, "stats": {}, "description": "T5PlasmaGolden (3594602569_10|d6414849_16) without a description", "size": "T5", "type": "Weapon", - "active": true + "active": true, + "ignore_in_weapon_list": false }, "spriteName": "T5_Plasma_Gold", "nameStrKey": "strT5PlasmaGoldenName", "mirrorCubeId": "", - "hexId": "d6414849" + "hexId": "d6414849", + "tree": { + "position_x": 10, + "position_y": 9, + "tech_points": 379, + "neighbours": [], + "requires": [ + 227205318 + ] + } }, "T5RailGolden hexCode:1aa4bbc9 intCode:447003593": { "id": 447003593, "info": { "category": "Rail", - "placements": 2, + "placements": 63, "stats": {}, "description": "T5RailGolden (447003593_10|1aa4bbc9_16) without a description", "size": "T5", "type": "Weapon", - "active": true + "active": true, + "ignore_in_weapon_list": false }, "spriteName": "T5_Rail_Gold", "nameStrKey": "strT5RailGoldenName", "mirrorCubeId": "", - "hexId": "1aa4bbc9" + "hexId": "1aa4bbc9", + "tree": { + "position_x": 11, + "position_y": 9, + "tech_points": 380, + "neighbours": [], + "requires": [ + 227205318 + ] + } }, "T5IonGolden hexCode:064beff8 intCode:105639928": { "id": 105639928, "info": { "category": "Ion", - "placements": 2, + "placements": 63, "stats": {}, "description": "T5IonGolden (105639928_10|064beff8_16) without a description", "size": "T5", "type": "Weapon", - "active": true + "active": true, + "ignore_in_weapon_list": false }, "spriteName": "T5_Ion_Gold", "nameStrKey": "strT5IonGoldenName", "mirrorCubeId": "", - "hexId": "064beff8" + "hexId": "064beff8", + "tree": { + "position_x": 12, + "position_y": 9, + "tech_points": 381, + "neighbours": [], + "requires": [ + 227205318 + ] + } }, "T5ChaingunGolden hexCode:0b9b436b intCode:194724715": { "id": 194724715, "info": { "category": "Chaingun", - "placements": 2, + "placements": 63, "stats": {}, "description": "T5ChaingunGolden (194724715_10|0b9b436b_16) without a description", "size": "T5", "type": "Weapon", - "active": true + "active": true, + "ignore_in_weapon_list": false }, "spriteName": "T5_Chaingun_Gold", "nameStrKey": "strT5ChaingunGoldenName", "mirrorCubeId": "", - "hexId": "0b9b436b" + "hexId": "0b9b436b", + "tree": { + "position_x": 13, + "position_y": 9, + "tech_points": 382, + "neighbours": [], + "requires": [ + 227205318 + ] + } }, "T5SeekerGolden hexCode:e46fd273 intCode:3832533619": { "id": 3832533619, "info": { "category": "Seeker", - "placements": 2, + "placements": 63, "stats": {}, "description": "T5SeekerGolden (3832533619_10|e46fd273_16) without a description", "size": "T5", "type": "Weapon", - "active": true + "active": true, + "ignore_in_weapon_list": false }, "spriteName": "T5_Seeker_Gold", "nameStrKey": "strT5SeekerGoldenName", "mirrorCubeId": "", - "hexId": "e46fd273" + "hexId": "e46fd273", + "tree": { + "position_x": 14, + "position_y": 9, + "tech_points": 383, + "neighbours": [], + "requires": [ + 227205318 + ] + } }, "T5MortarGolden hexCode:8682358a intCode:2256680330": { "id": 2256680330, "info": { "category": "Mortar", - "placements": 2, + "placements": 3, "stats": {}, "description": "T5MortarGolden (2256680330_10|8682358a_16) without a description", "size": "T5", "type": "Weapon", - "active": true + "active": true, + "ignore_in_weapon_list": false }, "spriteName": "T5_Mortar_Gold", "nameStrKey": "strT5MortarGoldenName", "mirrorCubeId": "", - "hexId": "8682358a" + "hexId": "8682358a", + "tree": { + "position_x": 15, + "position_y": 9, + "tech_points": 384, + "neighbours": [], + "requires": [ + 227205318 + ] + } }, "StrutArcShort hexCode:fab28b91 intCode:4206005137": { "id": 4206005137, "info": { "category": "NotAFunctionalItem", - "placements": 0, + "placements": 63, "stats": {}, "description": "StrutArcShort (4206005137_10|fab28b91_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Strut_Arc_Short", "nameStrKey": "strStrutArcShortName", @@ -7373,12 +9437,13 @@ "id": 3903776284, "info": { "category": "NotAFunctionalItem", - "placements": 0, + "placements": 63, "stats": {}, "description": "StrutRampShort (3903776284_10|e8aee61c_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Strut_Ramp_Short", "nameStrKey": "strStrutRampShortName", @@ -7389,12 +9454,13 @@ "id": 149580437, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "ExhaustBlower (149580437_10|08ea6a95_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Exhaust_Blower", "nameStrKey": "strExhaustBlowerName", @@ -7405,12 +9471,13 @@ "id": 3489925411, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "ExhaustStackL (3489925411_10|d0040923_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Exhaust_Stack_L", "nameStrKey": "strExhaustStackLName", @@ -7421,12 +9488,13 @@ "id": 1679554409, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "ExhaustStackR (1679554409_10|641bf769_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Exhaust_Stack_R", "nameStrKey": "strExhaustStackRName", @@ -7442,7 +9510,8 @@ "description": "NeonCube (150161008_10|08f34670_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Neon_Cube", "nameStrKey": "strNeonCubeName", @@ -7453,12 +9522,13 @@ "id": 1183051379, "info": { "category": "NotAFunctionalItem", - "placements": 54, + "placements": 63, "stats": {}, "description": "NeonEdge (1183051379_10|4683ee73_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Neon_Edge", "nameStrKey": "strNeonEdgeName", @@ -7469,12 +9539,13 @@ "id": 2623263862, "info": { "category": "NotAFunctionalItem", - "placements": 54, + "placements": 63, "stats": {}, "description": "NeonEdgeRound (2623263862_10|9c5bd476_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Neon_Edge_Round", "nameStrKey": "strNeonEdgeRoundName", @@ -7485,12 +9556,13 @@ "id": 3324063519, "info": { "category": "NotAFunctionalItem", - "placements": 54, + "placements": 63, "stats": {}, "description": "NeonEdgeSlope (3324063519_10|c6212f1f_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Neon_Edge_Slope", "nameStrKey": "strNeonEdgeSlopeName", @@ -7501,12 +9573,13 @@ "id": 2333317284, "info": { "category": "NotAFunctionalItem", - "placements": 22, + "placements": 63, "stats": {}, "description": "NeonCorner (2333317284_10|8b1398a4_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Neon_Corner", "nameStrKey": "strNeonCornerName", @@ -7517,12 +9590,13 @@ "id": 3195590950, "info": { "category": "NotAFunctionalItem", - "placements": 22, + "placements": 63, "stats": {}, "description": "NeonCornerRound (3195590950_10|be78d926_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Neon_Corner_Round", "nameStrKey": "strNeonCornerRoundName", @@ -7533,12 +9607,13 @@ "id": 3825345103, "info": { "category": "NotAFunctionalItem", - "placements": 22, + "placements": 63, "stats": {}, "description": "NeonCornerSlope (3825345103_10|e402224f_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Neon_Corner_Slope", "nameStrKey": "strNeonCornerSlopeName", @@ -7554,7 +9629,8 @@ "description": "NeonInner (1616217456_10|60558570_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Neon_Inner", "nameStrKey": "strNeonInnerName", @@ -7570,7 +9646,8 @@ "description": "NeonInnerRound (1774712137_10|69c7f549_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Neon_Inner_Round", "nameStrKey": "strNeonInnerRoundName", @@ -7586,7 +9663,8 @@ "description": "NeonInnerSlope (868027936_10|33bd0e20_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Neon_Inner_Slope", "nameStrKey": "strNeonInnerSlopeName", @@ -7597,12 +9675,13 @@ "id": 3447434946, "info": { "category": "NotAFunctionalItem", - "placements": 22, + "placements": 63, "stats": {}, "description": "NeonPyramid (3447434946_10|cd7baec2_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Neon_Pyramid", "nameStrKey": "strNeonPyramidName", @@ -7613,12 +9692,13 @@ "id": 552682446, "info": { "category": "NotAFunctionalItem", - "placements": 22, + "placements": 63, "stats": {}, "description": "NeonCone (552682446_10|20f143ce_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Neon_Cone", "nameStrKey": "strNeonConeName", @@ -7628,13 +9708,14 @@ "VaporTrailSingleFirework hexCode:6be74731 intCode:1810319153": { "id": 1810319153, "info": { - "category": "Rail", - "placements": 2, + "category": "NotAFunctionalItem", + "placements": 63, "stats": {}, "description": "VaporTrailSingleFirework (1810319153_10|6be74731_16) without a description", "size": "NoTier", - "type": "Weapon", - "active": true + "type": "NotAFunctionalItem", + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Vapor_Trail_Single_Firework", "nameStrKey": "strVaporTrailSingleFireworkName", @@ -7644,13 +9725,14 @@ "VaporTrailSingleSnowflake hexCode:c4933c16 intCode:3297983510": { "id": 3297983510, "info": { - "category": "Rail", - "placements": 2, + "category": "NotAFunctionalItem", + "placements": 63, "stats": {}, "description": "VaporTrailSingleSnowflake (3297983510_10|c4933c16_16) without a description", "size": "NoTier", - "type": "Weapon", - "active": true + "type": "NotAFunctionalItem", + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Vapor_Trail_Single_Snowflake", "nameStrKey": "strVaporTrailSingleSnowflakeName", @@ -7661,12 +9743,13 @@ "id": 138993629, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "PresentSmall (138993629_10|0848dfdd_16) without a description", "size": "T1", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Present_Small", "nameStrKey": "strPresentSmallName", @@ -7677,12 +9760,13 @@ "id": 568116457, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "PresentLarge (568116457_10|21dcc4e9_16) without a description", "size": "T3", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Present_Large", "nameStrKey": "strPresentLargeName", @@ -7693,12 +9777,13 @@ "id": 2183972675, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "FairyLight (2183972675_10|822cc743_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Fairy_Light", "nameStrKey": "strFairyLightName", @@ -7709,12 +9794,13 @@ "id": 216301182, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "2019Holoflag (216301182_10|0ce47e7e_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "2019_Holoflag", "nameStrKey": "str2019HoloflagName", @@ -7725,12 +9811,13 @@ "id": 2412453676, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "CandyCaneHoloflag (2412453676_10|8fcb1f2c_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Candy_Cane_Holoflag", "nameStrKey": "strCandyCaneHoloflagName", @@ -7741,12 +9828,13 @@ "id": 2990880144, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "SantaCrayHoloflag (2990880144_10|b2453590_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Santa_Cray_Holoflag", "nameStrKey": "strSantaCrayHoloflagName", @@ -7757,12 +9845,13 @@ "id": 3058601525, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "RoboPassSeason1Holoflag (3058601525_10|b64e8e35_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "RoboPass_Season_1_Holoflag", "nameStrKey": "strRoboPassSeason1HoloflagName", @@ -7773,12 +9862,13 @@ "id": 327459709, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "SnowflakeHoloflag (327459709_10|1384a37d_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Snowflake_Holoflag", "nameStrKey": "strSnowflakeHoloflagName", @@ -7789,28 +9879,39 @@ "id": 3437168371, "info": { "category": "Seeker", - "placements": 2, + "placements": 63, "stats": {}, "description": "T5SeekerFirework (3437168371_10|ccdf06f3_16) without a description", "size": "T5", "type": "Weapon", - "active": true + "active": true, + "ignore_in_weapon_list": false }, "spriteName": "T5_Seeker_Firework_Steam", "nameStrKey": "strT5SeekerFireworkName", "mirrorCubeId": "", - "hexId": "ccdf06f3" + "hexId": "ccdf06f3", + "tree": { + "position_x": 0, + "position_y": 10, + "tech_points": 412, + "neighbours": [], + "requires": [ + 227205318 + ] + } }, "6YearsHoloflag hexCode:9739f6fe intCode:2537158398": { "id": 2537158398, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "6YearsHoloflag (2537158398_10|9739f6fe_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "6_Years_Holoflag", "nameStrKey": "str6YearsHoloflagName", @@ -7821,12 +9922,13 @@ "id": 2707915966, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "FlipperSmall (2707915966_10|a16784be_16) without a description", "size": "T1", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Flipper_Small", "nameStrKey": "strFlipperSmallName", @@ -7837,12 +9939,13 @@ "id": 3083647184, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "FlipperMedium (3083647184_10|b7ccb8d0_16) without a description", - "size": "T2", + "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Flipper_Medium", "nameStrKey": "strFlipperMediumName", @@ -7853,12 +9956,13 @@ "id": 2297667466, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "FlipperLarge (2297667466_10|88f39f8a_16) without a description", "size": "T3", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Flipper_Large", "nameStrKey": "strFlipperLargeName", @@ -7869,12 +9973,13 @@ "id": 198393630, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "JammerSmall (198393630_10|0bd33f1e_16) without a description", "size": "T1", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Radar_Jammer_Small", "nameStrKey": "strJammerSmallName", @@ -7885,12 +9990,13 @@ "id": 3106939802, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "JammerMedium (3106939802_10|b930239a_16) without a description", - "size": "T2", + "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Radar_Jammer_Medium", "nameStrKey": "strJammerMediumName", @@ -7901,12 +10007,13 @@ "id": 575087658, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "JammerLarge (575087658_10|2247242a_16) without a description", "size": "T3", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Radar_Jammer_Large", "nameStrKey": "strJammerLargeName", @@ -7917,12 +10024,13 @@ "id": 3782348815, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "RadarSmall (3782348815_10|e172100f_16) without a description", "size": "T1", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Radar_Small", "nameStrKey": "strRadarSmallName", @@ -7933,12 +10041,13 @@ "id": 2115785469, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "RadarMedium (2115785469_10|7e1c52fd_16) without a description", - "size": "T2", + "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Radar_Medium", "nameStrKey": "strRadarMediumName", @@ -7949,12 +10058,13 @@ "id": 3370519355, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "RadarLarge (3370519355_10|c8e60b3b_16) without a description", "size": "T3", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Radar_Large", "nameStrKey": "strRadarLargeName", @@ -7965,12 +10075,13 @@ "id": 2330463949, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "ReceiverSmall (2330463949_10|8ae80ecd_16) without a description", "size": "T1", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Receiver_Small", "nameStrKey": "strReceiverSmallName", @@ -7981,12 +10092,13 @@ "id": 2312945847, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "ReceiverMedium (2312945847_10|89dcc0b7_16) without a description", - "size": "T2", + "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Receiver_Medium", "nameStrKey": "strReceiverMediumName", @@ -7997,12 +10109,13 @@ "id": 2742818297, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "ReceiverLarge (2742818297_10|a37c15f9_16) without a description", "size": "T3", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Receiver_Large", "nameStrKey": "strReceiverLargeName", @@ -8012,13 +10125,14 @@ "VaporTrailSingleFlower hexCode:bafaf616 intCode:3137009174": { "id": 3137009174, "info": { - "category": "Rail", - "placements": 2, + "category": "NotAFunctionalItem", + "placements": 63, "stats": {}, "description": "VaporTrailSingleFlower (3137009174_10|bafaf616_16) without a description", "size": "NoTier", - "type": "Weapon", - "active": true + "type": "NotAFunctionalItem", + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Vapor_Trail_Single_Flower", "nameStrKey": "strVaporTrailSingleFlowerName", @@ -8029,12 +10143,13 @@ "id": 3950939011, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "RodSpring (3950939011_10|eb7e8b83_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Rod_Spring", "nameStrKey": "strRodSpringName", @@ -8045,12 +10160,13 @@ "id": 2828600518, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "RodShortSpring (2828600518_10|a89904c6_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Rod_Short_Spring", "nameStrKey": "strRodShortSpringName", @@ -8061,12 +10177,13 @@ "id": 1051732041, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "RodLongSpring (1051732041_10|3eb02849_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Rod_Long_Spring", "nameStrKey": "strRodLongSpringName", @@ -8077,12 +10194,13 @@ "id": 1061758673, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "PilotSeatBunny (1061758673_10|3f4926d1_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "RC_Cube_PilotSeat_Bunny", "nameStrKey": "strPilotSeatBunnyName", @@ -8098,7 +10216,8 @@ "description": "RetroCube (183067052_10|0ae961ac_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Retro_Cube", "nameStrKey": "strRetroCubeName", @@ -8109,12 +10228,13 @@ "id": 1150929327, "info": { "category": "NotAFunctionalItem", - "placements": 54, + "placements": 63, "stats": {}, "description": "RetroEdge (1150929327_10|4499c9af_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Retro_Edge", "nameStrKey": "strRetroEdgeName", @@ -8125,12 +10245,13 @@ "id": 1387792676, "info": { "category": "NotAFunctionalItem", - "placements": 22, + "placements": 63, "stats": {}, "description": "RetroCorner (1387792676_10|52b80924_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Retro_Corner", "nameStrKey": "strRetroCornerName", @@ -8146,7 +10267,8 @@ "description": "RetroInner (3985049715_10|ed870873_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Retro_Inner", "nameStrKey": "strRetroInnerName", @@ -8157,28 +10279,39 @@ "id": 3087866254, "info": { "category": "Mortar", - "placements": 2, + "placements": 3, "stats": {}, "description": "MortarEggLauncher (3087866254_10|b80d198e_16) without a description", - "size": "NoTier", + "size": "T5", "type": "Weapon", - "active": true + "active": true, + "ignore_in_weapon_list": false }, "spriteName": "T5_Mortar_Egg", "nameStrKey": "strMortarEggLauncherName", "mirrorCubeId": "", - "hexId": "b80d198e" + "hexId": "b80d198e", + "tree": { + "position_x": 1, + "position_y": 10, + "tech_points": 435, + "neighbours": [], + "requires": [ + 227205318 + ] + } }, "RoboPassSeason2Holoflag hexCode:cb5bae82 intCode:3411783298": { "id": 3411783298, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "RoboPassSeason2Holoflag (3411783298_10|cb5bae82_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "RoboPass_Season_2_Holoflag", "nameStrKey": "strRoboPassSeason2HoloflagName", @@ -8189,12 +10322,13 @@ "id": 2663263630, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "BunnyHoloflag (2663263630_10|9ebe2d8e_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Bunny_Holoflag", "nameStrKey": "strBunnyHoloflagName", @@ -8205,12 +10339,13 @@ "id": 3131616996, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "EasterEggHoloflag (3131616996_10|baa8aee4_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "EasterEgg_Holoflag", "nameStrKey": "strEasterEggHoloflagName", @@ -8221,12 +10356,13 @@ "id": 3266439135, "info": { "category": "NotAFunctionalItem", - "placements": 2, + "placements": 63, "stats": {}, "description": "FlowersHoloflag (3266439135_10|c2b1e7df_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Flower_Holoflag", "nameStrKey": "strFlowersHoloflagName", @@ -8237,12 +10373,13 @@ "id": 1319987665, "info": { "category": "NotAFunctionalItem", - "placements": 0, + "placements": 63, "stats": {}, "description": "StrutDiagonal3DLShort (1319987665_10|4ead69d1_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Strut_Diagonal_3D_Short_Left", "nameStrKey": "strStrutDiagonal3DLShortName", @@ -8253,12 +10390,13 @@ "id": 3923036903, "info": { "category": "NotAFunctionalItem", - "placements": 0, + "placements": 63, "stats": {}, "description": "StrutDiagonal3DRShort (3923036903_10|e9d4cae7_16) without a description", "size": "NoTier", "type": "NotAFunctionalItem", - "active": true + "active": true, + "ignore_in_weapon_list": true }, "spriteName": "Strut_Diagonal_3D_Short_Right", "nameStrKey": "strStrutDiagonal3DRShortName", diff --git a/rc_services_room/src/cli.rs b/rc_services_room/src/cli.rs index 965bd3b..d5ee461 100644 --- a/rc_services_room/src/cli.rs +++ b/rc_services_room/src/cli.rs @@ -18,6 +18,10 @@ pub struct CliArgs { /// Assets root #[arg(long, default_value_t = {"../assets/robocraft".to_string()})] pub assets: String, + + /// User data root + #[arg(long, default_value_t = {"../data/robocraft".to_string()})] + pub data: String, } impl CliArgs { diff --git a/rc_services_room/src/data/cube_list.rs b/rc_services_room/src/data/cube_list.rs index ebf16e8..12646e5 100644 --- a/rc_services_room/src/data/cube_list.rs +++ b/rc_services_room/src/data/cube_list.rs @@ -1,6 +1,6 @@ #![allow(dead_code)] use std::collections::HashMap; -use polariton::operation::Typed; +use polariton::operation::{Dict, Typed}; pub struct CubeInfo { pub cpu: u32, @@ -40,7 +40,12 @@ impl CubeInfo { (Typed::Str("LeagueUnlockIndex".into()), Typed::Int(self.league_unlock_index)), (Typed::Str("DisplayStats".into()), { let items: Vec<(Typed, Typed)> = self.stats.iter().map(|(key, val)| (Typed::::Str(key.into()), val.to_owned())).collect(); - Typed::HashMap(items.into()) + //Typed::HashMap(items.into()) + Typed::Dict(Dict { + key_ty: polariton::serdes::TypePrefix::Str, + val_ty: polariton::serdes::TypePrefix::Any, + items, + }) }), (Typed::Str("Description".into()), Typed::Str(self.description.clone().into())), (Typed::Str("ItemSize".into()), Typed::Int(self.size as i32)), diff --git a/rc_services_room/src/data/garage_bay.rs b/rc_services_room/src/data/garage_bay.rs index f7e508b..a8cda42 100644 --- a/rc_services_room/src/data/garage_bay.rs +++ b/rc_services_room/src/data/garage_bay.rs @@ -24,7 +24,7 @@ pub struct GarageSlotInfo { } impl GarageSlotInfo { - pub fn as_transmissible(&self) -> Typed { + pub fn as_transmissible(&self) -> Typed { Typed::HashMap(vec![ (Typed::Str("name".into()), Typed::Str(self.name.clone().into())), (Typed::Str("numberCubes".into()), Typed::Int(self.cubes as i32)), @@ -71,7 +71,7 @@ pub struct ControlOptions { } impl ControlOptions { - pub fn as_transmissible(&self) -> Typed { + pub fn as_transmissible(&self) -> Typed { Typed::Arr(Arr { ty: TypePrefix::Bool, // bool items: vec![ diff --git a/rc_services_room/src/data/tech_tree.rs b/rc_services_room/src/data/tech_tree.rs index b07eba1..7827f64 100644 --- a/rc_services_room/src/data/tech_tree.rs +++ b/rc_services_room/src/data/tech_tree.rs @@ -11,7 +11,7 @@ pub struct TechTreeNode { } impl TechTreeNode { - pub fn as_transmissible(&self) -> Typed { + pub fn as_transmissible(&self) -> Typed { Typed::HashMap(vec![ (Typed::Str("mainCubeId".into()), Typed::Str(hex::encode(self.main_cube_id.to_be_bytes()).into())), (Typed::Str("positionX".into()), Typed::Int(self.position_x)), @@ -26,7 +26,7 @@ impl TechTreeNode { ].into()) } - pub fn as_transmissible_key_val(&self) -> (Typed, Typed) { + pub fn as_transmissible_key_val(&self) -> (Typed, Typed) { (Typed::Str(hex::encode(self.main_cube_id.to_be_bytes()).into()), self.as_transmissible()) } } diff --git a/rc_services_room/src/data/weapon_list.rs b/rc_services_room/src/data/weapon_list.rs index e4d28aa..fc5a622 100644 --- a/rc_services_room/src/data/weapon_list.rs +++ b/rc_services_room/src/data/weapon_list.rs @@ -115,7 +115,10 @@ impl WeaponData { if !self.group_fire_scales.is_empty() { let typed_arr: Vec> = self.group_fire_scales.iter().map(|x| Typed::Float(*x)).collect(); - out.push((Typed::Str("groupFireScales".into()), Typed::ObjArr(typed_arr.into()))); + out.push((Typed::Str("groupFireScales".into()), Typed::Arr(polariton::operation::Arr { + ty: polariton::serdes::TypePrefix::Float, + items: typed_arr, + }))); } self.mana_cost.map(|x| out.push((Typed::Str("manaCost".into()), Typed::Float(x)))); diff --git a/rc_services_room/src/data/weapon_upgrade.rs b/rc_services_room/src/data/weapon_upgrade.rs index 23eda99..fd8cba7 100644 --- a/rc_services_room/src/data/weapon_upgrade.rs +++ b/rc_services_room/src/data/weapon_upgrade.rs @@ -12,7 +12,7 @@ pub struct WeaponUpgradeInfo { } impl WeaponUpgradeInfo { - pub fn as_transmissible(&self) -> Typed { + pub fn as_transmissible(&self) -> Typed { Typed::Dict(Dict { key_ty: TypePrefix::Str, // str val_ty: TypePrefix::Any, // obj diff --git a/rc_services_room/src/main.rs b/rc_services_room/src/main.rs index e918477..ceb4094 100644 --- a/rc_services_room/src/main.rs +++ b/rc_services_room/src/main.rs @@ -12,10 +12,11 @@ use tokio::net; use polariton::packet::{Data, Message, Packet, StandardMessage}; use polariton::operation::{OperationResponse, Typed}; -pub type UserTy = std::sync::RwLock; +pub type UserTy = std::sync::RwLock>; pub struct InitConfig { - pub cubes: persist::config::CubeConfig, + pub cubes: persist::config::ConfigImpl, + pub users: std::sync::Arc, } #[tokio::main] @@ -24,8 +25,11 @@ async fn main() -> std::io::Result<()> { let args = cli::CliArgs::get(); log::debug!("Got cli args {:?}", args); + let cubes = persist::config::ConfigImpl::load(&args.assets).expect("Bad config data"); + let users = std::sync::Arc::new(persist::user::UserImpl::load(&args.data, &cubes).expect("Bad user data")); let init_ctx = InitConfig { - cubes: persist::config::CubeConfig::load(&args.assets).expect("Bad cube config data"), + cubes, + users, }; let server = polariton_server::Server::new(operations::handler(&init_ctx)); @@ -37,17 +41,17 @@ async fn main() -> std::io::Result<()> { #[cfg(not(debug_assertions))] loop { let (socket, address) = listener.accept().await?; - tokio::spawn(process_socket(socket, address, &server)); + tokio::spawn(process_socket(socket, address, &server, &init_ctx)); } #[cfg(debug_assertions)] { let (socket, address) = listener.accept().await?; - process_socket(socket, address, &server).await; + process_socket(socket, address, &server, &init_ctx).await; Ok(()) } } -async fn process_socket(mut socket: net::TcpStream, address: std::net::SocketAddr, server: &polariton_server::Server) { +async fn process_socket(mut socket: net::TcpStream, address: std::net::SocketAddr, server: &polariton_server::Server, init_ctx: &InitConfig) { log::debug!("Accepting connection from address {}", address); let enc = match do_connect_handshake(&mut socket).await { Some(x) => x, @@ -56,7 +60,7 @@ async fn process_socket(mut socket: net::TcpStream, address: std::net::SocketAdd return; } }; - let user_state = state::UserState::new(); + let user_state = std::sync::RwLock::new(state::UserState::<()>::new(init_ctx.users.clone())); server.handle_async(socket, user_state, enc, Default::default()).await; log::debug!("Goodbye connection from address {}", address); } diff --git a/rc_services_room/src/operations/client_config.rs b/rc_services_room/src/operations/client_config.rs index 3f96176..505f7b8 100644 --- a/rc_services_room/src/operations/client_config.rs +++ b/rc_services_room/src/operations/client_config.rs @@ -21,8 +21,8 @@ pub(super) fn client_config_provider() -> SimpleFunc<34, crate::UserTy, impl (Fn shield_hps: 2_000, request_review_level: 10_000, critical_ratio: 10.0, - cross_promo_image: "https://git.ngni.us/TODO".to_owned(), // TODO - cross_promo_link: "https://git.ngni.us/OpenJam/servers".to_owned(), + cross_promo_image: "https://git.ngram.ca/assets/img/logo.png".to_owned(), + cross_promo_link: "https://git.ngram.ca/OpenJam/servers".to_owned(), }.as_transmissible()) ].into(), })); diff --git a/rc_services_room/src/operations/cube_inventory.rs b/rc_services_room/src/operations/cube_inventory.rs index 9ed3f36..a344b7e 100644 --- a/rc_services_room/src/operations/cube_inventory.rs +++ b/rc_services_room/src/operations/cube_inventory.rs @@ -1,17 +1,17 @@ use polariton_server::operations::SimpleFunc; use polariton::{operation::{Dict, ParameterTable, Typed}, serdes::TypePrefix}; +use crate::persist::config::ConfigProvider; const PARAM_KEY: u8 = 16; -pub(super) fn cube_inv_provider() -> SimpleFunc<16, crate::UserTy, impl (Fn(ParameterTable, &crate::UserTy) -> Result) + Sync + Sync> { - SimpleFunc::new(|params, _| { +pub(super) fn cube_inv_provider(cubes: &crate::persist::config::ConfigImpl) -> SimpleFunc<16, crate::UserTy, impl (Fn(ParameterTable, &crate::UserTy) -> Result) + Sync + Sync> { + let cube_ids = >::ids(cubes); + SimpleFunc::new(move |params, _| { let mut params = params.to_dict(); params.insert(PARAM_KEY, Typed::Dict(Dict { key_ty: TypePrefix::Int, // int val_ty: TypePrefix::Int, // int - items: vec![ - (Typed::Int(0), Typed::Int(99)), - ] })); + items: cube_ids.iter().map(|id| (Typed::Int(*id as _), Typed::Int(1))).collect()})); Ok(params.into()) }) } diff --git a/rc_services_room/src/operations/cube_list.rs b/rc_services_room/src/operations/cube_list.rs index 42f0415..de43d90 100644 --- a/rc_services_room/src/operations/cube_list.rs +++ b/rc_services_room/src/operations/cube_list.rs @@ -1,14 +1,10 @@ -//use std::collections::HashMap; - use polariton_server::operations::Immediate; -//use polariton::{operation::{Dict, ParameterTable, Typed}, serdes::TypePrefix}; - -//use crate::data::cube_list::*; +use crate::persist::config::ConfigProvider; const PARAM_KEY: u8 = 1; //const DEFAULT_CUBE_ID: u32 = 227205318; -pub(super) fn cube_list_provider(cubes: &crate::persist::config::CubeConfig) -> Immediate<2, crate::UserTy> { +pub(super) fn cube_list_provider(cubes: &crate::persist::config::ConfigImpl) -> Immediate<2, crate::UserTy> { Immediate::new(|| { let mut params = std::collections::HashMap::with_capacity(2); params.insert(PARAM_KEY, cubes.cube_list()); diff --git a/rc_services_room/src/operations/garage_bay_uuid.rs b/rc_services_room/src/operations/garage_bay_uuid.rs index fbe9495..3a1aff0 100644 --- a/rc_services_room/src/operations/garage_bay_uuid.rs +++ b/rc_services_room/src/operations/garage_bay_uuid.rs @@ -4,9 +4,11 @@ use polariton::operation::{ParameterTable, Typed}; const PARAM_KEY: u8 = 54; pub(super) fn garage_id_provider() -> SimpleFunc<177, crate::UserTy, impl (Fn(ParameterTable, &crate::UserTy) -> Result) + Sync + Sync> { - SimpleFunc::new(|params, _| { + SimpleFunc::new(|params, user: &crate::UserTy| { + let lock = user.read().unwrap(); + let user_info = lock.user()?; let mut params = params.to_dict(); - params.insert(PARAM_KEY, Typed::Str(format!("{}_{}", 12345, 54321).into())); + params.insert(PARAM_KEY, Typed::Str(user_info.selected_garage_uuid().into())); Ok(params.into()) }) } diff --git a/rc_services_room/src/operations/garage_slots.rs b/rc_services_room/src/operations/garage_slots.rs index 56c254e..0cc9d73 100644 --- a/rc_services_room/src/operations/garage_slots.rs +++ b/rc_services_room/src/operations/garage_slots.rs @@ -1,47 +1,19 @@ -use polariton::serdes::TypePrefix; use polariton_server::operations::SimpleFunc; -use polariton::operation::{ParameterTable, Typed, Dict}; - -use crate::data::garage_bay::*; -use crate::data::weapon_list::ItemCategory; +use polariton::operation::{ParameterTable, Typed}; const SLOTS_PARAM_KEY: u8 = 44; const SELECTED_SLOT_PARAM_KEY: u8 = 43; const SLOT_ORDER_PARAM_KEY: u8 = 58; pub(super) fn garage_slot_provider() -> SimpleFunc<40, crate::UserTy, impl (Fn(ParameterTable, &crate::UserTy) -> Result) + Sync + Sync> { - SimpleFunc::new(|params, _| { + SimpleFunc::new(|params, user: &crate::UserTy| { + let lock = user.read().unwrap(); + let user_info = lock.user()?; let mut params = params.to_dict(); - params.insert(SLOTS_PARAM_KEY, Typed::Dict(Dict { - key_ty: TypePrefix::Int, // int - val_ty: TypePrefix::HashMap, // hashmap - items: vec![ - (Typed::Int(0), GarageSlotInfo { - name: "Reverse-engineer great success! slot_name".to_owned(), - cubes: 1, - crf_id: 0, - was_rated: false, - movement_categories: vec![ItemCategory::Wheel], - uuid: (2,4), - thumbnail_version: 0, - total_robot_cpu: 1, - total_cosmetic_cpu: 0, - total_robot_ranking: 1, - bay_cpu: 2_000, - tutorial_robot: false, - starter_robot_index: -1, - control_type: ControlType::Camera, - control_options: ControlOptions { vertical_strafing: false, sideways_driving: false, tracks_turn_on_spot: false, }, - mastery_level: 1, - bay_skin_id: "RC_MothershipSkin_Neptune_01".to_owned(), // TODO get the rest of the names - weapon_order: vec![0], - }.as_transmissible()) - ], - })); - params.insert(SELECTED_SLOT_PARAM_KEY, Typed::Int(0)); - params.insert(SLOT_ORDER_PARAM_KEY, Typed::ObjArr(vec![ - Typed::Int(0), - ].into())); + let all_slots = user_info.all_slots_by_id(); + params.insert(SLOTS_PARAM_KEY, all_slots.slot_info); + params.insert(SELECTED_SLOT_PARAM_KEY, Typed::Int(user_info.selected_garage_slot() as _)); + params.insert(SLOT_ORDER_PARAM_KEY, all_slots.slot_order); Ok(params.into()) }) } diff --git a/rc_services_room/src/operations/machine.rs b/rc_services_room/src/operations/machine.rs index 8f9e3c2..dfee371 100644 --- a/rc_services_room/src/operations/machine.rs +++ b/rc_services_room/src/operations/machine.rs @@ -1,9 +1,6 @@ use polariton_server::operations::SimpleFunc; use polariton::operation::{ParameterTable, Typed}; -use crate::data::weapon_list::ItemCategory; -use crate::data::garage_bay::*; - const SLOT_PARAM_KEY: u8 = 45; // uint const DATA_PARAM_KEY: u8 = 49; // byte arr const CUBES_COUNT_PARAM_KEY: u8 = 51; // int @@ -14,20 +11,68 @@ const CONTROL_OPTIONS_PARAM_KEY: u8 = 60; // bool arr const MASTERY_LEVEL_PARAM_KEY: u8 = 18; // int pub(super) fn garage_machine_provider() -> SimpleFunc<43, crate::UserTy, impl (Fn(ParameterTable, &crate::UserTy) -> Result) + Sync + Sync> { - SimpleFunc::new(|params, _| { + SimpleFunc::new(|params, user: &crate::UserTy| { let mut params = params.to_dict(); - if let Some(garage_slot) = params.get(&SLOT_PARAM_KEY) { + let lock = user.read().unwrap(); + let user_info = lock.user()?; + if let Some(Typed::Int(garage_slot)) = params.get(&SLOT_PARAM_KEY) { log::debug!("Got machine request for slot {:?}", garage_slot); + let machine = user_info.slot_by_id(*garage_slot)?; + params.insert(DATA_PARAM_KEY, machine.data); + params.insert(CUBES_COUNT_PARAM_KEY, machine.cube_count); + params.insert(WEAPON_ORDER_PARAM_KEY, machine.weapon_order); + params.insert(MOVEMENT_CATEGORIES_PARAM_KEY, machine.movement_categories); + params.insert(CONTROL_TYPE_PARAM_KEY, machine.control_type); + params.insert(CONTROL_OPTIONS_PARAM_KEY, machine.control_options); + params.insert(MASTERY_LEVEL_PARAM_KEY, machine.mastery_level); } else { - params.insert(SLOT_PARAM_KEY, Typed::Int(0)); + params.insert(SLOT_PARAM_KEY, Typed::Int(user_info.selected_garage_slot() as _)); } - params.insert(DATA_PARAM_KEY, Typed::Bytes(vec![0u8, 0u8, 0u8, 0u8].into())); // first 4 bytes are i32 for length of rest of data - params.insert(CUBES_COUNT_PARAM_KEY, Typed::Int(1)); - params.insert(WEAPON_ORDER_PARAM_KEY, Typed::IntArr(vec![0].into())); - params.insert(MOVEMENT_CATEGORIES_PARAM_KEY, Typed::IntArr(vec![ItemCategory::Wheel.but_bigger()].into())); - params.insert(CONTROL_TYPE_PARAM_KEY, Typed::Int(ControlType::Camera as _)); - params.insert(CONTROL_OPTIONS_PARAM_KEY, ControlOptions { vertical_strafing: false, sideways_driving: false, tracks_turn_on_spot: false, }.as_transmissible()); - params.insert(MASTERY_LEVEL_PARAM_KEY, Typed::Int(0)); Ok(params.into()) }) } + +const ERROR_PARAM_KEY: u8 = 47; // int +//const UUID_PARAM_KEY: u8 = 54; // str +const COMPRESSED_ROBOT_DATA_PARAM_KEY: u8 = 46; // byte arr +const COMPRESSED_COLOUR_DATA_PARAM_KEY: u8 = 33; // byte arr + +const INVALID_ROBOT_ERR: i16 = 140; + +pub(super) fn garage_machine_save_provider() -> SimpleFunc<41, crate::UserTy, impl (Fn(ParameterTable, &crate::UserTy) -> Result) + Sync + Sync> { + SimpleFunc::new(|params, user: &crate::UserTy| { + log::debug!("machine save params: {:?}", params); + let mut params = params.to_dict(); + if let Some(Typed::Int(slot_index)) = params.remove(&SLOT_PARAM_KEY) { + if let Some(Typed::Bytes(robot_data)) = params.remove(&COMPRESSED_ROBOT_DATA_PARAM_KEY) { + if let Some(Typed::Bytes(colour_data)) = params.remove(&COMPRESSED_COLOUR_DATA_PARAM_KEY) { + if let Some(Typed::Arr(weapon_order)) = params.remove(&WEAPON_ORDER_PARAM_KEY) { + let weapon_order_filtered: Vec<_> = weapon_order.items.into_iter().filter_map(|ty| if let Typed::Int(i) = ty { Some(i) } else { None }).collect(); + let lock = user.read().unwrap(); + let user_info = lock.user()?; + let vehicle_data = crate::persist::user::VehicleData { + id: slot_index, + robot_data: robot_data.vec, + colour_data: colour_data.vec, + weapon_order: weapon_order_filtered, + }; + user_info.save_slot(vehicle_data)?; + let mut params_out = std::collections::HashMap::with_capacity(1); + params_out.insert(ERROR_PARAM_KEY, Typed::Int(0)); + return Ok(params_out.into()); + } else { + log::warn!("weapon order is not this type (or does not exist)"); + } + } else { + log::warn!("colour data is not this type (or does not exist)"); + } + } else { + log::warn!("robot data is not this type (or does not exist)"); + } + } else { + log::warn!("slot is not this type (or does not exist)"); + } + Err(INVALID_ROBOT_ERR) + }) +} + diff --git a/rc_services_room/src/operations/machine_colour.rs b/rc_services_room/src/operations/machine_colour.rs index ebc37a6..48a48f2 100644 --- a/rc_services_room/src/operations/machine_colour.rs +++ b/rc_services_room/src/operations/machine_colour.rs @@ -6,14 +6,18 @@ const SLOT_PARAM_KEY: u8 = 31; // int const DATA_PARAM_KEY: u8 = 33; // byte arr pub(super) fn garage_machine_colour_provider() -> SimpleFunc<33, crate::UserTy, impl (Fn(ParameterTable, &crate::UserTy) -> Result) + Sync + Sync> { - SimpleFunc::new(|params, _| { + SimpleFunc::new(|params, user: &crate::UserTy| { let mut params = params.to_dict(); - if let Some(garage_slot) = params.get(&SLOT_PARAM_KEY) { + let lock = user.read().unwrap(); + let user_info = lock.user()?; + if let Some(Typed::Int(garage_slot)) = params.get(&SLOT_PARAM_KEY) { log::debug!("Got machine colour request for slot {:?}", garage_slot); + let machine = user_info.slot_by_id(*garage_slot)?; + params.insert(DATA_PARAM_KEY, machine.colour_data); } else { - params.insert(SLOT_PARAM_KEY, Typed::Int(0)); + params.insert(SLOT_PARAM_KEY, Typed::Int(user_info.selected_garage_slot() as _)); } - params.insert(DATA_PARAM_KEY, Typed::Bytes(vec![0u8, 0u8, 0u8, 0u8].into())); // first 4 bytes are i32 for length of rest of data + Ok(params.into()) }) } diff --git a/rc_services_room/src/operations/mod.rs b/rc_services_room/src/operations/mod.rs index 2e6feea..8836d51 100644 --- a/rc_services_room/src/operations/mod.rs +++ b/rc_services_room/src/operations/mod.rs @@ -104,7 +104,7 @@ pub fn handler(init_ctx: &crate::InitConfig) -> OperationsHandler .without_state(taunts_config::taunts_config_provider()) .without_state(all_customisations_info::all_customisations_provider()) .without_state(tech_points::tech_points_provider()) - .without_state(cube_inventory::cube_inv_provider()) + .without_state(cube_inventory::cube_inv_provider(&init_ctx.cubes)) .without_state(player_level::player_level_info_provider()) .without_state(balance_info::balance_wallet_provider()) .without_state(premium_duration::premium_remaining_provider()) @@ -122,12 +122,12 @@ pub fn handler(init_ctx: &crate::InitConfig) -> OperationsHandler .without_state(garage_upgrades::garage_upgrades_provider()) .without_state(game_event_params::event_system_params_provider()) .without_state(garage_bay_uuid::garage_id_provider()) - .without_state(tech_tree_data::tech_tree_layout_provider()) + .without_state(tech_tree_data::tech_tree_layout_provider(&init_ctx.cubes)) .without_state(item_shop_bundles::item_bundle_provider()) .without_state(robot_customisations::bay_customisations_provider()) .without_state(player_data::player_data_provider()) .without_state(player_robopass::player_robopass_season_provider()) - .without_state(weapon_upgrades::weapons_upgrade_provider()) + .without_state(weapon_upgrades::weapons_upgrade_provider(&init_ctx.cubes)) .without_state(polariton_server::operations::Ack::<172, _>::default()) // custom game change robot tier (param 67 is tier) .without_state(player_rank::rank_provider()) .without_state(player_rank::rank_static_provider()) @@ -158,5 +158,7 @@ pub fn handler(init_ctx: &crate::InitConfig) -> OperationsHandler .without_state(building_xp::building_xp_save_provider()) .without_state(robot_sanction::all_robot_sanctions_provider()) .without_state(reconnect_game::available_reconnect_provider()) - //.without_state(polariton_server::operations::Ack::<70, _>::default()) + .without_state(machine::garage_machine_save_provider()) + .without_state(polariton_server::operations::Ack::<32, _>::default()) // TODO handle SaveMachineColorRequest instead of ignoring it + .without_state(polariton_server::operations::Ack::<45, _>::default()) // TODO handle UpdateThumbnailVersionRequest instead of ignoring it } diff --git a/rc_services_room/src/operations/movement_stats.rs b/rc_services_room/src/operations/movement_stats.rs index ae4ca7b..4e0203e 100644 --- a/rc_services_room/src/operations/movement_stats.rs +++ b/rc_services_room/src/operations/movement_stats.rs @@ -1,14 +1,10 @@ //use polariton::serdes::TypePrefix; use polariton_server::operations::Immediate; -//use polariton::operation::{ParameterTable, Typed, Dict}; - -//use crate::data::movement_list::*; -//use crate::data::cube_list::ItemTier; -//use crate::data::weapon_list::ItemCategory; +use crate::persist::config::ConfigProvider; const PARAM_KEY: u8 = 1; -pub(super) fn movement_config_provider(cubes: &crate::persist::config::CubeConfig) -> Immediate<62, crate::UserTy> { +pub(super) fn movement_config_provider(cubes: &crate::persist::config::ConfigImpl) -> Immediate<62, crate::UserTy> { Immediate::new(|| { let mut params = std::collections::HashMap::with_capacity(2); params.insert(PARAM_KEY, cubes.movement_list()); diff --git a/rc_services_room/src/operations/tech_tree_data.rs b/rc_services_room/src/operations/tech_tree_data.rs index fd246a6..0bba717 100644 --- a/rc_services_room/src/operations/tech_tree_data.rs +++ b/rc_services_room/src/operations/tech_tree_data.rs @@ -1,14 +1,17 @@ -use polariton_server::operations::SimpleFunc; -use polariton::{operation::{Dict, ParameterTable, Typed}, serdes::TypePrefix}; - -use crate::data::tech_tree::*; +use polariton_server::operations::Immediate; +use crate::persist::config::ConfigProvider; const PARAM_KEY: u8 = 210; -pub(super) fn tech_tree_layout_provider() -> SimpleFunc<183, crate::UserTy, impl (Fn(ParameterTable, &crate::UserTy) -> Result) + Sync + Sync> { - SimpleFunc::new(|params, _| { - let mut params = params.to_dict(); - params.insert(PARAM_KEY, Typed::Dict(Dict { +pub(super) fn tech_tree_layout_provider(cubes: &crate::persist::config::ConfigImpl) -> Immediate<183, crate::UserTy> { + Immediate::new(|| { + let mut params = std::collections::HashMap::with_capacity(2); + params.insert(PARAM_KEY, cubes.tech_tree_nodes(&vec![ + 227205318, + 227917916, + 1931676396, + ].into_iter().collect())); + /*params.insert(PARAM_KEY, Typed::Dict(Dict { key_ty: TypePrefix::Str, // str val_ty: TypePrefix::HashMap, // hashmap items: vec![ @@ -17,12 +20,12 @@ pub(super) fn tech_tree_layout_provider() -> SimpleFunc<183, crate::UserTy, impl position_x: 0, position_y: 0, is_unlocked: true, - is_unlockable: true, + is_unlockable: false, tech_points: 1, neighbours: Vec::default(), }.as_transmissible_key_val(), ], - })); - Ok(params.into()) + }));*/ + params.into() }) } diff --git a/rc_services_room/src/operations/user_perms.rs b/rc_services_room/src/operations/user_perms.rs index d4a4ff9..4d91df6 100644 --- a/rc_services_room/src/operations/user_perms.rs +++ b/rc_services_room/src/operations/user_perms.rs @@ -6,11 +6,13 @@ const DEV_PARAM_KEY: u8 = 11; const ADM_PARAM_KEY: u8 = 12; pub(super) fn user_rights_provider() -> SimpleFunc<14, crate::UserTy, impl (Fn(ParameterTable, &crate::UserTy) -> Result) + Sync + Sync> { - SimpleFunc::new(|params, _| { + SimpleFunc::new(|params, user: &crate::UserTy| { + let lock = user.read().unwrap(); + let user_info = lock.user()?; let mut params = params.to_dict(); - params.insert(MOD_PARAM_KEY, Typed::Bool(false.into())); - params.insert(DEV_PARAM_KEY, Typed::Bool(false.into())); - params.insert(ADM_PARAM_KEY, Typed::Bool(false.into())); + params.insert(MOD_PARAM_KEY, Typed::Bool(user_info.is_mod())); + params.insert(DEV_PARAM_KEY, Typed::Bool(user_info.is_dev())); + params.insert(ADM_PARAM_KEY, Typed::Bool(user_info.is_admin())); Ok(params.into()) }) } diff --git a/rc_services_room/src/operations/weapon_stats.rs b/rc_services_room/src/operations/weapon_stats.rs index 87a3543..c002c42 100644 --- a/rc_services_room/src/operations/weapon_stats.rs +++ b/rc_services_room/src/operations/weapon_stats.rs @@ -1,13 +1,9 @@ -//use polariton::serdes::TypePrefix; use polariton_server::operations::Immediate; -//use polariton::operation::{Typed, Dict}; - -//use crate::data::weapon_list::*; -//use crate::data::cube_list::ItemTier; +use crate::persist::config::ConfigProvider; const PARAM_KEY: u8 = 57; -pub(super) fn weapon_config_provider(cubes: &crate::persist::config::CubeConfig) -> Immediate<47, crate::UserTy> { +pub(super) fn weapon_config_provider(cubes: &crate::persist::config::ConfigImpl) -> Immediate<47, crate::UserTy> { Immediate::new(|| { let mut params = std::collections::HashMap::with_capacity(2); params.insert(PARAM_KEY, cubes.weapon_list()); diff --git a/rc_services_room/src/operations/weapon_upgrades.rs b/rc_services_room/src/operations/weapon_upgrades.rs index 4a55278..4706f83 100644 --- a/rc_services_room/src/operations/weapon_upgrades.rs +++ b/rc_services_room/src/operations/weapon_upgrades.rs @@ -1,23 +1,12 @@ -use polariton_server::operations::SimpleFunc; -use polariton::operation::{ParameterTable, Typed}; - -use crate::data::weapon_upgrade::*; +use polariton_server::operations::Immediate; +use crate::persist::config::ConfigProvider; const PARAM_KEY: u8 = 38; -pub(super) fn weapons_upgrade_provider() -> SimpleFunc<82, crate::UserTy, impl (Fn(ParameterTable, &crate::UserTy) -> Result) + Sync + Sync> { - SimpleFunc::new(|params, _| { - let mut params = params.to_dict(); - params.insert(PARAM_KEY, Typed::ObjArr(vec![ - WeaponUpgradeInfo { - tier: crate::data::cube_list::ItemTier::T0, - type_: crate::data::weapon_list::ItemCategory::Laser, - xp: 4.2, - rating: 1, - rank: 1, - power: 1, - }.as_transmissible(), - ].into())); - Ok(params.into()) +pub(super) fn weapons_upgrade_provider(cubes: &crate::persist::config::ConfigImpl) -> Immediate<82, crate::UserTy> { + Immediate::new(|| { + let mut params = std::collections::HashMap::with_capacity(2); + params.insert(PARAM_KEY, cubes.weapon_upgrade_list()); + params.into() }) } diff --git a/rc_services_room/src/operations/weapon_xp_static.rs b/rc_services_room/src/operations/weapon_xp_static.rs index 21395aa..8f7236f 100644 --- a/rc_services_room/src/operations/weapon_xp_static.rs +++ b/rc_services_room/src/operations/weapon_xp_static.rs @@ -34,6 +34,106 @@ pub(super) fn weapon_xp_provider() -> SimpleFunc<129, crate::UserTy, impl (Fn(Pa ], }), ].into())), + (Typed::Int(ItemTier::T1 as _), Typed::ObjArr(vec![ + Typed::Dict(Dict { + key_ty: TypePrefix::Str, + val_ty: TypePrefix::Any, + items: vec![ + (Typed::Str("xp".into()), Typed::Int(1_000)), + (Typed::Str("costRobits".into()), Typed::Int(1_000)), + (Typed::Str("damageMultiplier".into()), Typed::Float(1.1)), + ], + }), + Typed::Dict(Dict { + key_ty: TypePrefix::Str, + val_ty: TypePrefix::Any, + items: vec![ + (Typed::Str("xp".into()), Typed::Int(2_000)), + (Typed::Str("costRobits".into()), Typed::Int(2_000)), + (Typed::Str("damageMultiplier".into()), Typed::Float(1.2)), + ], + }), + ].into())), + (Typed::Int(ItemTier::T2 as _), Typed::ObjArr(vec![ + Typed::Dict(Dict { + key_ty: TypePrefix::Str, + val_ty: TypePrefix::Any, + items: vec![ + (Typed::Str("xp".into()), Typed::Int(1_000)), + (Typed::Str("costRobits".into()), Typed::Int(1_000)), + (Typed::Str("damageMultiplier".into()), Typed::Float(1.1)), + ], + }), + Typed::Dict(Dict { + key_ty: TypePrefix::Str, + val_ty: TypePrefix::Any, + items: vec![ + (Typed::Str("xp".into()), Typed::Int(2_000)), + (Typed::Str("costRobits".into()), Typed::Int(2_000)), + (Typed::Str("damageMultiplier".into()), Typed::Float(1.2)), + ], + }), + ].into())), + (Typed::Int(ItemTier::T3 as _), Typed::ObjArr(vec![ + Typed::Dict(Dict { + key_ty: TypePrefix::Str, + val_ty: TypePrefix::Any, + items: vec![ + (Typed::Str("xp".into()), Typed::Int(1_000)), + (Typed::Str("costRobits".into()), Typed::Int(1_000)), + (Typed::Str("damageMultiplier".into()), Typed::Float(1.1)), + ], + }), + Typed::Dict(Dict { + key_ty: TypePrefix::Str, + val_ty: TypePrefix::Any, + items: vec![ + (Typed::Str("xp".into()), Typed::Int(2_000)), + (Typed::Str("costRobits".into()), Typed::Int(2_000)), + (Typed::Str("damageMultiplier".into()), Typed::Float(1.2)), + ], + }), + ].into())), + (Typed::Int(ItemTier::T4 as _), Typed::ObjArr(vec![ + Typed::Dict(Dict { + key_ty: TypePrefix::Str, + val_ty: TypePrefix::Any, + items: vec![ + (Typed::Str("xp".into()), Typed::Int(1_000)), + (Typed::Str("costRobits".into()), Typed::Int(1_000)), + (Typed::Str("damageMultiplier".into()), Typed::Float(1.1)), + ], + }), + Typed::Dict(Dict { + key_ty: TypePrefix::Str, + val_ty: TypePrefix::Any, + items: vec![ + (Typed::Str("xp".into()), Typed::Int(2_000)), + (Typed::Str("costRobits".into()), Typed::Int(2_000)), + (Typed::Str("damageMultiplier".into()), Typed::Float(1.2)), + ], + }), + ].into())), + (Typed::Int(ItemTier::T5 as _), Typed::ObjArr(vec![ + Typed::Dict(Dict { + key_ty: TypePrefix::Str, + val_ty: TypePrefix::Any, + items: vec![ + (Typed::Str("xp".into()), Typed::Int(1_000)), + (Typed::Str("costRobits".into()), Typed::Int(1_000)), + (Typed::Str("damageMultiplier".into()), Typed::Float(1.1)), + ], + }), + Typed::Dict(Dict { + key_ty: TypePrefix::Str, + val_ty: TypePrefix::Any, + items: vec![ + (Typed::Str("xp".into()), Typed::Int(2_000)), + (Typed::Str("costRobits".into()), Typed::Int(2_000)), + (Typed::Str("damageMultiplier".into()), Typed::Float(1.2)), + ], + }), + ].into())), ], })), ].into())); diff --git a/rc_services_room/src/persist/config/cubes_json.rs b/rc_services_room/src/persist/config/cubes_json.rs new file mode 100644 index 0000000..99577e6 --- /dev/null +++ b/rc_services_room/src/persist/config/cubes_json.rs @@ -0,0 +1,156 @@ +use std::collections::HashMap; + +use serde::{Serialize, Deserialize}; + +use polariton::operation::{Typed, Dict}; +use polariton::serdes::TypePrefix; + +use super::super::{MovementCategoryData, MovementData, Cube, ItemCategory, ItemTier}; + +const CUBE_CONFIG_FILENAME: &str = "cubes.json"; + +#[derive(Serialize, Deserialize, Debug)] +pub struct CubeConfig { + cubes: HashMap, + movement: HashMap, + lerp_value: f32, +} + +impl CubeConfig { + pub fn load(root: impl AsRef) -> std::io::Result { + let file = std::fs::File::open(root.as_ref().join(CUBE_CONFIG_FILENAME))?; + let buffered = std::io::BufReader::new(file); + let result = serde_json::from_reader(buffered)?; + Ok(result) + } +} + +impl super::ConfigProvider for CubeConfig { + fn cube_list(&self) -> Typed { + Typed::Dict(Dict { + key_ty: TypePrefix::Str, + val_ty: TypePrefix::HashMap, + items: self.cubes.values().map(|cube| { + let cube_d: crate::data::cube_list::CubeInfo = cube.info.clone().into(); + cube_d.as_transmissible_key_val(cube.id) + }).collect(), + }) + } + + fn movement_list(&self) -> Typed { + let mut movements_stats = HashMap::>::new(); + for cube in self.cubes.values() { + if let Some(movement_data) = &cube.movement { + let category_map = if let Some(x) = movements_stats.get_mut(&cube.info.category) { + x + } else { + movements_stats.insert(cube.info.category, HashMap::new()); + movements_stats.get_mut(&cube.info.category).unwrap() + }; + category_map.insert(cube.info.size, movement_data.to_owned()); + } + } + let mut movement_cat_stats = Vec::with_capacity(self.movement.len()); + for (k, v) in self.movement.iter() { + let stats: Vec<_> = if let Some(stats) = movements_stats.get(&k) { + stats.iter().map(|(k, v)| (k.to_owned(), v.to_owned())).collect() + } else { + Vec::default() + }; + let key: crate::data::weapon_list::ItemCategory = k.to_owned().into(); + let key_typed = Typed::::Str(key.as_str().into()); + + let value_data = v.to_owned().into_data(stats); + movement_cat_stats.push((key_typed, value_data.as_transmissible())); + } + Typed::Dict(Dict { + key_ty: TypePrefix::Str, + val_ty: TypePrefix::HashMap, + items: vec![ + (Typed::Str("Global".into()), Typed::HashMap(vec![ + (Typed::Str("lerpValue".into()), Typed::Float(self.lerp_value)), + ].into())), + (Typed::Str("Movements".into()), Typed::HashMap(movement_cat_stats.into())), + ], + }) + } + + fn weapon_list(&self) -> Typed { + let mut weapon_stats = HashMap::new(); + for cube in self.cubes.values() { + if let Some(weapon_data) = &cube.weapon { + let category_map = if let Some(x) = weapon_stats.get_mut(&cube.info.category) { + x + } else { + weapon_stats.insert(cube.info.category, HashMap::new()); + weapon_stats.get_mut(&cube.info.category).unwrap() + }; + category_map.insert(cube.info.size, weapon_data.to_owned()); + } + } + let mut weapons_vec: Vec<(Typed, Typed)> = Vec::with_capacity(weapon_stats.len()); + for (k, v) in weapon_stats { + let cat_data: crate::data::weapon_list::ItemCategory = k.into(); + let mut tiers_vec = Vec::with_capacity(v.len()); + for (k, v) in v { + let tier_data: crate::data::cube_list::ItemTier = k.into(); + let val_data: crate::data::weapon_list::WeaponData = v.into(); + tiers_vec.push((Typed::Str(tier_data.as_str().into()), val_data.as_transmissible())); + } + weapons_vec.push((Typed::Str(cat_data.as_str().into()), Typed::HashMap(tiers_vec.into()))); + } + Typed::Dict(Dict { + key_ty: TypePrefix::Str, + val_ty: TypePrefix::HashMap, + items: weapons_vec, + }) + } + + fn weapon_upgrade_list(&self) -> Typed { + let mut seen_keys = std::collections::HashSet::new(); + let mut weapon_upgrades = Vec::new(); + for cube in self.cubes.values() { + if let Some(weapon_up) = &cube.weapon_upgrade { + let key = (cube.info.category, cube.info.size); + if seen_keys.contains(&key) { + log::warn!("Weapon upgrade info for {:?} already exists, skipping", key); + } else { + seen_keys.insert(key); + let weapon_upgrade_data = weapon_up.to_owned().into_data(cube.info.size, cube.info.category); + weapon_upgrades.push(weapon_upgrade_data.as_transmissible()); + } + } + } + Typed::ObjArr(weapon_upgrades.into()) + } + + fn tech_tree_nodes(&self, unlocked_cubes: &std::collections::HashSet) -> Typed { + let mut seen_cubes = std::collections::HashSet::with_capacity(self.cubes.len()); + let mut needed_cubes = std::collections::HashSet::with_capacity(self.cubes.len()); + let mut typed_nodes = Vec::new(); + for cube in self.cubes.values() { + if let Some(tree_data) = &cube.tree { + let is_unlocked = unlocked_cubes.contains(&cube.id); + let is_unlockable = tree_data.requires.iter().all(|id| unlocked_cubes.contains(id)); + tree_data.neighbours.iter().for_each(|id| { needed_cubes.insert(*id); }); + seen_cubes.insert(cube.id); + let node_data = tree_data.to_owned().into_data(cube.id, is_unlocked, is_unlockable); + typed_nodes.push(node_data.as_transmissible_key_val()); + } + } + for needed_cube_id in needed_cubes { + if !seen_cubes.contains(&needed_cube_id) { + log::warn!("Tech tree needs cube {} but it doesn't have tree info", needed_cube_id); + } + } + Typed::Dict(Dict { + key_ty: TypePrefix::Str, + val_ty: TypePrefix::HashMap, + items: typed_nodes, + }) + } + + fn ids(&self) -> Vec { + self.cubes.values().map(|cube| cube.id).collect() + } +} diff --git a/rc_services_room/src/persist/config/mod.rs b/rc_services_room/src/persist/config/mod.rs index 0d6d630..769ca75 100644 --- a/rc_services_room/src/persist/config/mod.rs +++ b/rc_services_room/src/persist/config/mod.rs @@ -1,9 +1,13 @@ -mod cubes; -pub use cubes::{CubeConfig, ItemTier}; -//pub use cubes::{Cube, ItemCategory, VisibilityMode, ItemType}; +mod cubes_json; +pub use cubes_json::CubeConfig; -mod movement; -pub use movement::{MovementCategoryData, MovementData}; +mod traits; +pub use traits::ConfigProvider; -mod weapon; -pub use weapon::WeaponData; +pub type ConfigImpl = CubeConfig; + +fn __must_impl>() {} + +fn __test_impl() { + __must_impl::(); +} diff --git a/rc_services_room/src/persist/config/traits.rs b/rc_services_room/src/persist/config/traits.rs new file mode 100644 index 0000000..299348a --- /dev/null +++ b/rc_services_room/src/persist/config/traits.rs @@ -0,0 +1,10 @@ +use polariton::operation::Typed; + +pub trait ConfigProvider { + fn cube_list(&self) -> Typed; + fn movement_list(&self) -> Typed; + fn weapon_list(&self) -> Typed; + fn weapon_upgrade_list(&self) -> Typed; + fn tech_tree_nodes(&self, unlocked_cubes: &std::collections::HashSet) -> Typed; + fn ids(&self) -> Vec; +} diff --git a/rc_services_room/src/persist/config/cubes.rs b/rc_services_room/src/persist/cube_data.rs similarity index 66% rename from rc_services_room/src/persist/config/cubes.rs rename to rc_services_room/src/persist/cube_data.rs index 470458f..086aa61 100644 --- a/rc_services_room/src/persist/config/cubes.rs +++ b/rc_services_room/src/persist/cube_data.rs @@ -2,115 +2,18 @@ use std::collections::HashMap; use serde::{Serialize, Deserialize}; -use polariton::operation::{Typed, Dict}; -use polariton::serdes::TypePrefix; +use polariton::operation::Typed; -use super::{MovementCategoryData, MovementData, WeaponData}; - -const CUBE_CONFIG_FILENAME: &str = "cubes.json"; - -#[derive(Serialize, Deserialize, Debug)] -pub struct CubeConfig { - cubes: HashMap, - movement: HashMap, - lerp_value: f32, -} - -impl CubeConfig { - pub fn load(root: impl AsRef) -> std::io::Result { - let file = std::fs::File::open(root.as_ref().join(CUBE_CONFIG_FILENAME))?; - let buffered = std::io::BufReader::new(file); - let result = serde_json::from_reader(buffered)?; - Ok(result) - } - - pub fn cube_list(&self) -> Typed { - Typed::Dict(Dict { - key_ty: TypePrefix::Str, - val_ty: TypePrefix::HashMap, - items: self.cubes.values().map(|cube| { - let cube_d: crate::data::cube_list::CubeInfo = cube.info.clone().into(); - cube_d.as_transmissible_key_val(cube.id) - }).collect(), - }) - } - - pub fn movement_list(&self) -> Typed { - let mut movements_stats = HashMap::>::new(); - for cube in self.cubes.values() { - if let Some(movement_data) = &cube.movement { - let category_map = if let Some(x) = movements_stats.get_mut(&cube.info.category) { - x - } else { - movements_stats.insert(cube.info.category, HashMap::new()); - movements_stats.get_mut(&cube.info.category).unwrap() - }; - category_map.insert(cube.info.size, movement_data.to_owned()); - } - } - let mut movement_cat_stats = Vec::with_capacity(self.movement.len()); - for (k, v) in self.movement.iter() { - let stats: Vec<_> = if let Some(stats) = movements_stats.get(&k) { - stats.iter().map(|(k, v)| (k.to_owned(), v.to_owned())).collect() - } else { - Vec::default() - }; - let key: crate::data::weapon_list::ItemCategory = k.to_owned().into(); - let key_typed = Typed::::Str(key.as_str().into()); - - let value_data = v.to_owned().into_data(stats); - movement_cat_stats.push((key_typed, value_data.as_transmissible())); - } - Typed::Dict(Dict { - key_ty: TypePrefix::Str, - val_ty: TypePrefix::HashMap, - items: vec![ - (Typed::Str("Global".into()), Typed::HashMap(vec![ - (Typed::Str("lerpValue".into()), Typed::Float(self.lerp_value)), - ].into())), - (Typed::Str("Movements".into()), Typed::HashMap(movement_cat_stats.into())), - ], - }) - } - - pub fn weapon_list(&self) -> Typed { - let mut weapon_stats = HashMap::new(); - for cube in self.cubes.values() { - if let Some(weapon_data) = &cube.weapon { - let category_map = if let Some(x) = weapon_stats.get_mut(&cube.info.category) { - x - } else { - weapon_stats.insert(cube.info.category, HashMap::new()); - weapon_stats.get_mut(&cube.info.category).unwrap() - }; - category_map.insert(cube.info.size, weapon_data.to_owned()); - } - } - let mut weapons_vec: Vec<(Typed, Typed)> = Vec::with_capacity(weapon_stats.len()); - for (k, v) in weapon_stats { - let cat_data: crate::data::weapon_list::ItemCategory = k.into(); - let mut tiers_vec = Vec::with_capacity(v.len()); - for (k, v) in v { - let tier_data: crate::data::cube_list::ItemTier = k.into(); - let val_data: crate::data::weapon_list::WeaponData = v.into(); - tiers_vec.push((Typed::Str(tier_data.as_str().into()), val_data.as_transmissible())); - } - weapons_vec.push((Typed::Str(cat_data.as_str().into()), Typed::HashMap(tiers_vec.into()))); - } - Typed::Dict(Dict { - key_ty: TypePrefix::Str, - val_ty: TypePrefix::HashMap, - items: weapons_vec, - }) - } -} +use super::{WeaponData, WeaponUpgradeInfo, TechTreeData, MovementData}; #[derive(Serialize, Deserialize, Clone, Debug)] pub struct Cube { pub id: u32, pub info: CubeInfo, pub weapon: Option, + pub weapon_upgrade: Option, pub movement: Option, + pub tree: Option, } #[derive(Serialize, Deserialize, Clone, Debug)] @@ -193,7 +96,7 @@ impl std::convert::Into> for Cube panic!("Invalid json number") }, serde_json::Value::String(s) => Typed::Str(s.into()), - _ => Typed::Null, // TODO is support for Object/Array/Null necessary? + _ => panic!("Unsupported stats type"), // TODO is support for Object/Array/Null necessary? }; (k, new_v) }).collect(), diff --git a/rc_services_room/src/persist/garage.rs b/rc_services_room/src/persist/garage.rs new file mode 100644 index 0000000..b3a4866 --- /dev/null +++ b/rc_services_room/src/persist/garage.rs @@ -0,0 +1,135 @@ +use serde::{Serialize, Deserialize}; + +use super::ItemCategory; + +#[derive(Serialize, Deserialize, Clone, Debug)] +pub struct GarageSlot { + #[serde(default)] + pub slot: u32, + pub name: String, + #[serde(default)] + pub cubes: u32, + #[serde(default)] + pub crf_id: u32, // 0 means not uploaded + #[serde(default = "default_false")] + pub was_rated: bool, + #[serde(default)] + pub movement_categories: Vec, + #[serde(default)] + pub uuid: (u32, u32), + pub thumbnail_version: u32, + #[serde(default)] + pub total_robot_cpu: u32, + #[serde(default)] + pub total_cosmetic_cpu: u32, + #[serde(default)] + pub total_robot_ranking: u32, + #[serde(default)] + pub bay_cpu: u32, + #[serde(default = "default_false")] + pub tutorial_robot: bool, + #[serde(default = "default_neg_1")] + pub starter_robot_index: i32, + #[serde(default)] + pub control_type: ControlType, + #[serde(default)] + pub control_options: GarageControls, + #[serde(default)] + pub mastery_level: i32, + #[serde(default)] + pub bay_skin_id: String, + #[serde(default)] + pub weapon_order: Vec, + #[serde(default = "default_robot_bytes")] + pub robot_data: Vec, + #[serde(default = "default_robot_bytes")] + pub colour_data: Vec, +} + +fn default_false() -> bool { + false +} + +fn default_neg_1() -> i32 { + -1 +} + +fn default_robot_bytes() -> Vec { + vec![0u8, 0u8, 0u8, 0u8] +} + +impl GarageSlot { + pub fn load(filepath: impl AsRef) -> std::io::Result { + let file = std::fs::File::open(filepath)?; + let buffered = std::io::BufReader::new(file); + let result = serde_json::from_reader(buffered)?; + Ok(result) + } + + pub fn save(&self, filepath: impl AsRef) -> std::io::Result<()> { + let file = std::fs::File::create(filepath)?; + let buffered = std::io::BufWriter::new(file); + serde_json::to_writer_pretty(buffered, self)?; + Ok(()) + } +} + +impl std::convert::Into for GarageSlot { + fn into(self) -> crate::data::garage_bay::GarageSlotInfo { + crate::data::garage_bay::GarageSlotInfo { + name: self.name, + cubes: self.cubes, + crf_id: self.crf_id, + was_rated: self.was_rated, + movement_categories: self.movement_categories.into_iter().map(|x| x.into()).collect(), + uuid: self.uuid, + thumbnail_version: self.thumbnail_version, + total_robot_cpu: self.total_robot_cpu, + total_cosmetic_cpu: self.total_cosmetic_cpu, + total_robot_ranking: self.total_robot_ranking, + bay_cpu: self.bay_cpu, + tutorial_robot: self.tutorial_robot, + starter_robot_index: self.starter_robot_index, + control_type: self.control_type.into(), + control_options: self.control_options.into(), + mastery_level: self.mastery_level, + bay_skin_id: self.bay_skin_id, + weapon_order: self.weapon_order, + } + } +} + +#[derive(Serialize, Deserialize, Copy, Clone, Debug, Default)] +pub enum ControlType { + #[default] + Camera, + Keyboard, + Count, +} + +impl std::convert::Into for ControlType { + fn into(self) -> crate::data::garage_bay::ControlType { + match self { + Self::Camera => crate::data::garage_bay::ControlType::Camera, + Self::Keyboard => crate::data::garage_bay::ControlType::Keyboard, + Self::Count => crate::data::garage_bay::ControlType::Count, + } + } +} + +#[derive(Serialize, Deserialize, Clone, Debug, Default)] +pub struct GarageControls { + pub vertical_strafing: bool, + pub sideways_driving: bool, + pub tracks_turn_on_spot: bool, +} + +impl std::convert::Into for GarageControls { + fn into(self) -> crate::data::garage_bay::ControlOptions { + crate::data::garage_bay::ControlOptions { + vertical_strafing: self.vertical_strafing, + sideways_driving: self.sideways_driving, + tracks_turn_on_spot: self.tracks_turn_on_spot, + } + } +} diff --git a/rc_services_room/src/persist/mod.rs b/rc_services_room/src/persist/mod.rs index ef68c36..e6bee26 100644 --- a/rc_services_room/src/persist/mod.rs +++ b/rc_services_room/src/persist/mod.rs @@ -1 +1,18 @@ pub mod config; +pub mod user; + +mod cube_data; +pub use cube_data::{Cube, ItemTier, ItemCategory}; +//pub use cube_data::{VisibilityMode, ItemType}; + +mod garage; +pub use garage::{GarageSlot, GarageControls, ControlType}; + +mod movement; +pub use movement::{MovementCategoryData, MovementData}; + +mod weapon; +pub use weapon::{WeaponData, WeaponUpgradeInfo}; + +mod tech_tree; +pub use tech_tree::TechTreeData; diff --git a/rc_services_room/src/persist/config/movement.rs b/rc_services_room/src/persist/movement.rs similarity index 100% rename from rc_services_room/src/persist/config/movement.rs rename to rc_services_room/src/persist/movement.rs diff --git a/rc_services_room/src/persist/tech_tree.rs b/rc_services_room/src/persist/tech_tree.rs new file mode 100644 index 0000000..0806021 --- /dev/null +++ b/rc_services_room/src/persist/tech_tree.rs @@ -0,0 +1,25 @@ +use serde::{Serialize, Deserialize}; + +#[derive(Serialize, Deserialize, Clone, Debug, Default)] +#[serde(default)] +pub struct TechTreeData { + pub position_x: i32, + pub position_y: i32, + pub tech_points: u32, + pub neighbours: Vec, // cube IDs + pub requires: Vec, +} + +impl TechTreeData { + pub fn into_data(self, self_id: u32, self_is_unlocked: bool, self_is_unlockable: bool) -> crate::data::tech_tree::TechTreeNode { + crate::data::tech_tree::TechTreeNode { + main_cube_id: self_id as i32, + position_x: self.position_x, + position_y: self.position_y, + is_unlocked: self_is_unlocked, + is_unlockable: self_is_unlockable, + tech_points: self.tech_points, + neighbours: self.neighbours.into_iter().map(|x| x as i32).collect(), + } + } +} diff --git a/rc_services_room/src/persist/user/account_json.rs b/rc_services_room/src/persist/user/account_json.rs new file mode 100644 index 0000000..a8c44d9 --- /dev/null +++ b/rc_services_room/src/persist/user/account_json.rs @@ -0,0 +1,204 @@ +use serde::{Serialize, Deserialize}; + +use crate::persist::config::ConfigProvider; + +pub struct AccountProvider { + root: std::path::PathBuf, + cubes: std::sync::Arc>, +} + +impl AccountProvider { + pub fn load(root: impl AsRef, cubes: &crate::persist::config::ConfigImpl) -> std::io::Result { + let root = root.as_ref().join(super::USERS_DIR); + std::fs::create_dir_all(&root)?; + Ok(Self { + root, + cubes: std::sync::Arc::new(>::ids(cubes)), + }) + } +} + +impl super::UserProvider for AccountProvider { + fn authenticate(&self, token: super::UserToken) -> Result + Send + Sync>, String> { + let new_root = self.root.join(&token.uuid); + if !new_root.exists() { + std::fs::create_dir(&new_root).map_err(|e| e.to_string())?; + log::info!("New user {}", token.uuid); + super::setup_directory(&new_root).map_err(|e| e.to_string())?; + } + let account_info = AccountInfo::load(&new_root).map_err(|e| e.to_string())?; + Ok(Box::new(UserData { + root: new_root, + token, + account: account_info, + cubes: self.cubes.clone(), + })) + //Err("Unable to authenticate".to_string()) + } +} + +#[allow(dead_code)] +struct UserData { + root: std::path::PathBuf, + token: super::UserToken, + account: AccountInfo, + cubes: std::sync::Arc>, +} + +impl UserData { + fn load_garage_by_id(&self, id: u32) -> std::io::Result { + let path = self.root.join(super::GARAGE_DIR).join(format!("{}.json", id)); + crate::persist::GarageSlot::load(&path) + } + + fn save_garage(&self, slot: &crate::persist::GarageSlot) -> std::io::Result<()> { + let path = self.root.join(super::GARAGE_DIR).join(format!("{}.json", slot.slot)); + slot.save(path) + } + + fn all_vehicles(&self) -> std::io::Result> { + let path = self.root.join(super::GARAGE_DIR); + let mut slots = Vec::new(); + for entry in std::fs::read_dir(path)? { + let entry = entry?; + let filepath = entry.path(); + if filepath.is_file() { + let slot = crate::persist::GarageSlot::load(&filepath)?; + slots.push(slot); + } else { + log::warn!("Ignoring non-file {} in {} dir", filepath.display(), super::GARAGE_DIR); + } + } + slots.sort_by_key(|slot| slot.slot); + Ok(slots) + } +} + +const INVALID_ROBOT_ERR: i16 = 140; +const DATABASE_ERR: i16 = 8; + +impl super::User for UserData { + fn token(&self) -> &'_ super::UserToken { + &self.token + } + + fn is_mod(&self) -> bool { + self.account.is_mod + } + + fn is_admin(&self) -> bool { + self.account.is_admin + } + + fn is_dev(&self) -> bool { + self.account.is_dev + } + + fn unlocked_parts(&self) -> Vec { + match self.account.inventory.override_ { + super::inventory::UnlockOverride::Normal => self.account.inventory.unlocked.clone(), + super::inventory::UnlockOverride::UnlockNone => Vec::default(), + super::inventory::UnlockOverride::UnlockAll => self.cubes.as_ref().to_owned(), + } + } + + fn selected_garage_uuid(&self) -> String { + self.account.garage.uuid_str() + } + + fn selected_garage_slot(&self) -> u32 { + self.account.garage.slot + } + + fn all_slots_by_id(&self) -> super::UserSlots { + let slots = match self.all_vehicles() { + Ok(slots) => slots, + Err(e) => { + log::error!("Failed to load all vehicles: {}", e); + Vec::default() + } + }; + let slot_order = polariton::operation::Typed::ObjArr(slots.iter().map(|slot| polariton::operation::Typed::Int(slot.slot as _)).collect::>().into()); + let slot_info = polariton::operation::Typed::Dict(polariton::operation::Dict { + key_ty: polariton::serdes::TypePrefix::Int, + val_ty: polariton::serdes:: TypePrefix::HashMap, + items: slots.into_iter().map(|slot| { + let slot_index = slot.slot; + let garage_data: crate::data::garage_bay::GarageSlotInfo = slot.into(); + (polariton::operation::Typed::Int(slot_index as _), garage_data.as_transmissible()) + }).collect(), + }); + super::UserSlots { + slot_info, slot_order, + } + } + + fn slot_by_id(&self, id: i32) -> Result, i16> { + match self.load_garage_by_id(id as _) { + Ok(slot) => { + let control_ty: crate::data::garage_bay::ControlType = slot.control_type.into(); + let control_options: crate::data::garage_bay::ControlOptions = slot.control_options.into(); + Ok(crate::persist::user::UserSlotData { + data: polariton::operation::Typed::Bytes(slot.robot_data.into()), + colour_data: polariton::operation::Typed::Bytes(slot.colour_data.into()), + cube_count: polariton::operation::Typed::Int(slot.cubes as _), + weapon_order: polariton::operation::Typed::IntArr(vec![0].into()), // TODO + movement_categories: polariton::operation::Typed::IntArr(slot.movement_categories.into_iter().map(|cat| { + let cat: crate::data::weapon_list::ItemCategory = cat.into(); + cat as i32 + }).collect::>().into()), + control_type: polariton::operation::Typed::Int(control_ty as _), + control_options: control_options.as_transmissible(), + mastery_level: polariton::operation::Typed::Int(0), // TODO + }) + }, + Err(e) => { + log::error!("Failed to load vehicle {}: {}", id, e); + Err(INVALID_ROBOT_ERR) + } + } + } + + fn save_slot(&self, vehicle: crate::persist::user::VehicleData) -> Result<(), i16> { + let id = vehicle.id as u32; + let mut existing_data = self.load_garage_by_id(id).map_err(|e| { + log::error!("Failed to load vehicle {}: {}", id, e); + INVALID_ROBOT_ERR + })?; + existing_data.slot = id; + existing_data.robot_data = vehicle.robot_data; + existing_data.colour_data = vehicle.colour_data; + log::debug!("weapon order: {:?}", vehicle.weapon_order); + self.save_garage(&existing_data).map_err(|e| { + log::error!("Failed to save vehicle {}: {}", id, e); + DATABASE_ERR + })?; + Ok(()) + } +} + +#[derive(Serialize, Deserialize, Clone, Debug)] +pub struct AccountInfo { + pub is_mod: bool, + pub is_admin: bool, + pub is_dev: bool, + pub inventory: super::UnlockedParts, + pub garage: super::SelectedGarage, +} + +impl AccountInfo { + fn load(root: impl AsRef) -> std::io::Result { + let file = std::fs::File::open(root.as_ref().join(super::USER_FILE))?; + let buffered = std::io::BufReader::new(file); + let result = serde_json::from_reader(buffered)?; + Ok(result) + } + + pub fn save(&self, root: impl AsRef) -> std::io::Result<()> { + let file = std::fs::File::create(root.as_ref().join(super::USER_FILE))?; + let buffered = std::io::BufWriter::new(file); + serde_json::to_writer_pretty(buffered, self)?; + Ok(()) + } +} + diff --git a/rc_services_room/src/persist/user/garage_data.rs b/rc_services_room/src/persist/user/garage_data.rs new file mode 100644 index 0000000..a62a870 --- /dev/null +++ b/rc_services_room/src/persist/user/garage_data.rs @@ -0,0 +1,13 @@ +use serde::{Serialize, Deserialize}; + +#[derive(Serialize, Deserialize, Clone, Debug)] +pub struct SelectedGarage { + pub uuid: (u32, u32), + pub slot: u32, +} + +impl SelectedGarage { + pub fn uuid_str(&self) -> String { + format!("{}_{}", self.uuid.0, self.uuid.1) + } +} diff --git a/rc_services_room/src/persist/user/initial_data.rs b/rc_services_room/src/persist/user/initial_data.rs new file mode 100644 index 0000000..f2a382f --- /dev/null +++ b/rc_services_room/src/persist/user/initial_data.rs @@ -0,0 +1,88 @@ +const REFERENCE_DIR: &str = "layout folder"; + +fn build_reference_directory(root: impl AsRef) -> std::io::Result<()> { + std::fs::create_dir(&root)?; + let garage_dir = root.as_ref().join(super::GARAGE_DIR); + std::fs::create_dir(&garage_dir)?; + default_user_data().save(&root)?; + for slot in default_garage_slots() { + let filepath = garage_dir.join(format!("{}.json", slot.slot)); + slot.save(filepath)?; + } + Ok(()) +} + +pub fn setup_directory(new_dir: impl AsRef) -> std::io::Result<()> { + let ref_path = new_dir.as_ref().parent().unwrap().join(REFERENCE_DIR); + if !ref_path.exists() { + log::debug!("Initialising reference directory {}", ref_path.display()); + build_reference_directory(&ref_path)?; + } + log::debug!("Copying reference directory for new user: {}", new_dir.as_ref().display()); + so::copy_dir_all(ref_path, new_dir)?; + Ok(()) +} + +fn default_user_data() -> super::AccountInfo { + super::AccountInfo { + is_mod: false, + is_admin: false, + is_dev: false, + inventory: super::UnlockedParts { + unlocked: vec![], + override_: super::inventory::UnlockOverride::Normal, + }, + garage: super::SelectedGarage { + uuid: (0, 0), + slot: 0, + }, + } +} + +fn default_garage_slots() -> Vec { + vec![ + crate::persist::GarageSlot { + slot: 0, + name: "Reverse-engineer great success! slot_name".to_owned(), + cubes: 1, + crf_id: 0, + was_rated: false, + movement_categories: vec![crate::persist::ItemCategory::Wheel], + uuid: (0, 0), + thumbnail_version: 0, + total_robot_cpu: 1, + total_cosmetic_cpu: 0, + total_robot_ranking: 1, + bay_cpu: 2_000, + tutorial_robot: false, + starter_robot_index: -1, + control_type: crate::persist::ControlType::Camera, + control_options: crate::persist::GarageControls { vertical_strafing: false, sideways_driving: false, tracks_turn_on_spot: false, }, + mastery_level: 1, + bay_skin_id: "RC_MothershipSkin_Neptune_01".to_owned(), // TODO get the rest of the names + weapon_order: vec![0], + robot_data: vec![0; 4], + colour_data: vec![0; 4], + } + ] +} + +mod so { + // from https://stackoverflow.com/questions/26958489/how-to-copy-a-folder-recursively-in-rust + use std::path::Path; + use std::{io, fs}; + + pub(super) fn copy_dir_all(src: impl AsRef, dst: impl AsRef) -> io::Result<()> { + fs::create_dir_all(&dst)?; + for entry in fs::read_dir(src)? { + let entry = entry?; + let ty = entry.file_type()?; + if ty.is_dir() { + copy_dir_all(entry.path(), dst.as_ref().join(entry.file_name()))?; + } else { + fs::copy(entry.path(), dst.as_ref().join(entry.file_name()))?; + } + } + Ok(()) + } +} diff --git a/rc_services_room/src/persist/user/inventory.rs b/rc_services_room/src/persist/user/inventory.rs new file mode 100644 index 0000000..db3ea95 --- /dev/null +++ b/rc_services_room/src/persist/user/inventory.rs @@ -0,0 +1,16 @@ +use serde::{Serialize, Deserialize}; + +#[derive(Serialize, Deserialize, Clone, Debug)] +pub struct UnlockedParts { + pub unlocked: Vec, + #[serde(rename = "override", default)] + pub override_: UnlockOverride, +} + +#[derive(Serialize, Deserialize, Clone, Debug, Default)] +pub enum UnlockOverride { + #[default] + Normal, + UnlockAll, + UnlockNone, +} diff --git a/rc_services_room/src/persist/user/mod.rs b/rc_services_room/src/persist/user/mod.rs new file mode 100644 index 0000000..3786009 --- /dev/null +++ b/rc_services_room/src/persist/user/mod.rs @@ -0,0 +1,26 @@ +mod account_json; +pub use account_json::{AccountProvider, AccountInfo}; + +mod garage_data; +pub use garage_data::SelectedGarage; + +mod initial_data; +pub use initial_data::setup_directory; + +mod inventory; +pub use inventory::UnlockedParts; + +mod traits; +pub use traits::{UserProvider, User, UserToken, UserSlots, UserSlotData, VehicleData}; + +pub const USERS_DIR: &str = "accounts"; +pub const USER_FILE: &str = "user.json"; +pub const GARAGE_DIR: &str = "vehicles"; + +pub type UserImpl = AccountProvider; + +fn __must_impl>() {} + +fn __test_impl() { + __must_impl::(); +} diff --git a/rc_services_room/src/persist/user/traits.rs b/rc_services_room/src/persist/user/traits.rs new file mode 100644 index 0000000..0c7098f --- /dev/null +++ b/rc_services_room/src/persist/user/traits.rs @@ -0,0 +1,47 @@ +#[allow(dead_code)] +#[derive(Debug)] +pub struct UserToken { + pub uuid: String, + pub token: String, + pub refresh_token: String, +} + +pub trait UserProvider { + fn authenticate(&self, user: UserToken) -> Result + Send + Sync>, String>; +} + +pub trait User { + fn token(&self) -> &'_ super::UserToken; + fn is_mod(&self) -> bool; + fn is_admin(&self) -> bool; + fn is_dev(&self) -> bool; + fn unlocked_parts(&self) -> Vec; + fn selected_garage_uuid(&self) -> String; + fn selected_garage_slot(&self) -> u32; + fn all_slots_by_id(&self) -> UserSlots; + fn slot_by_id(&self, id: i32) -> Result, i16>; + fn save_slot(&self, vehicle: VehicleData) -> Result<(), i16>; +} + +pub struct UserSlots { + pub slot_info: polariton::operation::Typed, + pub slot_order: polariton::operation::Typed, +} + +pub struct UserSlotData { + pub data: polariton::operation::Typed, + pub colour_data: polariton::operation::Typed, + pub cube_count: polariton::operation::Typed, + pub weapon_order: polariton::operation::Typed, + pub movement_categories: polariton::operation::Typed, + pub control_type: polariton::operation::Typed, + pub control_options: polariton::operation::Typed, + pub mastery_level: polariton::operation::Typed, +} + +pub struct VehicleData { + pub id: i32, + pub robot_data: Vec, + pub colour_data: Vec, + pub weapon_order: Vec, +} diff --git a/rc_services_room/src/persist/config/weapon.rs b/rc_services_room/src/persist/weapon.rs similarity index 90% rename from rc_services_room/src/persist/config/weapon.rs rename to rc_services_room/src/persist/weapon.rs index 95a7b75..3a440a3 100644 --- a/rc_services_room/src/persist/config/weapon.rs +++ b/rc_services_room/src/persist/weapon.rs @@ -44,6 +44,7 @@ pub struct WeaponData { pub spin_up_time: Option, pub spin_down_time: Option, pub spin_initial_cooldown: Option, + #[serde(default = "group_fire_scales_default")] pub group_fire_scales: Vec, pub mana_cost: Option, pub lock_time: Option, @@ -67,6 +68,10 @@ pub struct WeaponData { pub effect_duration: Option, } +fn group_fire_scales_default() -> Vec { + vec![1.0] +} + impl std::convert::Into for WeaponData { fn into(self) -> crate::data::weapon_list::WeaponData { crate::data::weapon_list::WeaponData { @@ -135,3 +140,24 @@ impl std::convert::Into for WeaponData { } } } + +#[derive(Serialize, Deserialize, Clone, Debug, Default)] +pub struct WeaponUpgradeInfo { + pub xp: f64, + pub rating: i32, + pub rank: i32, + pub power: i32, +} + +impl WeaponUpgradeInfo { + pub fn into_data(self, tier: super::ItemTier, type_: super::ItemCategory) -> crate::data::weapon_upgrade::WeaponUpgradeInfo { + crate::data::weapon_upgrade::WeaponUpgradeInfo { + tier: tier.into(), + type_: type_.into(), + xp: self.xp, + rating: self.rating, + rank: self.rank, + power: self.power, + } + } +} diff --git a/rc_services_room/src/state.rs b/rc_services_room/src/state.rs index bc39273..6ae2be5 100644 --- a/rc_services_room/src/state.rs +++ b/rc_services_room/src/state.rs @@ -1,27 +1,58 @@ -use std::sync::RwLock; +use crate::persist::user::UserProvider; -#[derive(Default, Debug)] -pub struct UserState { - pub uuid: String, - pub token: String, - pub refresh_token: String, +pub struct UserState { + state: InitState, } -impl UserState { +impl UserState { pub fn update_with_auth(&mut self, auth_str: &str) -> bool { - let splits: Vec<&str> = auth_str.split(';').collect(); - if splits.len() != 3 { - log::warn!("Invalid auth payload: {}", auth_str); - false - } else { - self.uuid = splits[0].to_owned(); - self.token = splits[1].to_owned(); - self.refresh_token = splits[2].to_owned(); - true + match &self.state { + InitState::Unauthenticated(auth) => { + let splits: Vec<&str> = auth_str.split(';').collect(); + if splits.len() != 3 { + log::warn!("Invalid auth payload: {}", auth_str); + false + } else { + let token = crate::persist::user::UserToken { + uuid: splits[0].to_owned(), + token: splits[1].to_owned(), + refresh_token: splits[2].to_owned(), + }; + match auth.authenticate(token) { + Ok(user) => { + self.state = InitState::Authenticated(user); + true + }, + Err(e) => { + log::error!("Failed to authenticate {}: {}", splits[0], e); + false + } + } + } + }, + InitState::Authenticated(_) => { + log::warn!("User was already authenticated, ignoring"); + true + } + } + + } + + pub fn new(provider: std::sync::Arc) -> Self { + Self { + state: InitState::Unauthenticated(provider), } } - pub fn new() -> crate::UserTy { - RwLock::new(UserState::default()) + pub fn user(&self) -> Result<&dyn crate::persist::user::User, i16> { + match &self.state { + InitState::Unauthenticated(_) => Err(120), + InitState::Authenticated(user) => Ok(user.as_ref()), + } } } + +enum InitState { + Unauthenticated(std::sync::Arc), + Authenticated(Box + Send + Sync>), +} diff --git a/utils/cube_gen.py b/utils/cube_gen.py index 499c611..f843876 100644 --- a/utils/cube_gen.py +++ b/utils/cube_gen.py @@ -8,25 +8,66 @@ WEAPONS = { "Laser" : { "T0": { "damage_inflicted": 42, + "group_fire_scales": [1.0], }, "T1": { "damage_inflicted": 420, + "group_fire_scales": [1.0], }, "T2": { "damage_inflicted": 4200, + "group_fire_scales": [1.0], }, "T3": { "damage_inflicted": 42000, + "group_fire_scales": [1.0], }, "T4": { "damage_inflicted": 420000, + "group_fire_scales": [1.0], }, "T5": { "damage_inflicted": 4200000, + "group_fire_scales": [1.0], }, }, } +STATS_TRANSLATIONS = { + "CPU LOAD": "strCPU", + "CPU": "strCPU", + "MASS": "strMass", + "ARMOR": "strHealth", + "ROBOT RANKING": "strRobotRanking", + "ROBOT RATING": "strRobotRanking", + "MAX LIFT": "strLiftDS", + "LIFT": "strLiftDS", + "MAX SPEED": "strMaxSpeedDS", + "CARRYING CAPACITY": "strCapacity", + "LOAD CAPACITY PER WING": "strCapacity", + "TOP SPEED": "strMaxSpeedDS", + "DAMAGE AT 160M": "strDamageNearDS", + "DAMAGE AT 320M": "strDamageFarDS", + "DAMAGE": "strDamageDS", + "BLAST": "strBlastRadiusDS", + "DAMAGE RATE": "strWeaponDamageRateDS", + "HEAL RATE": "strHealRate", +} + +STATS_VALUE_REPLACEMENTS = { + "pFLOP": "[strPFlops]", + "Kg": "[strKilograms]", + "kg": "[strKilograms]", +} + +IGNORED_STATS = [ + "OVERCLOCK", + "OVERCLOCKER", + "THRUST", + "SHIELD", + "LIGHT OUTPUT", +] + # different from the enum '''CATEGORIES = { 0: "NotAFunctionalItem", @@ -91,17 +132,65 @@ CATEGORIES = [ "EnergyModule", ] -def guess_category(name: str, sprite: str, cat: int) -> str: +CATEGORY_IGNORES = [ + "VaporTrail", + "Vapor_Trail", + "FusionTower", +] + +ALL_FACES = 63; + +CATEGORIES_PLACEMENTS = { + "NotAFunctionalItem": ALL_FACES, + "Wheel": 0b00001100, + "Hover": 0b00111100, + "Wing": 0b00111100, + "Rudder": 0b00111100, + "Thruster": ALL_FACES, + "InsectLeg": 0b00111100, + "MechLeg": 0b00000011, + "Ski": 0b00000011, + "TankTrack": 0b00111100, + "Rotor": 0b00111100, + "SprinterLeg": 0b00000011, + "Propeller": ALL_FACES, + "Laser": None, + "Plasma": ALL_FACES, + "Mortar": 0b00000011, + "Rail": ALL_FACES, + "Nano": ALL_FACES, + "Tesla": ALL_FACES, + "Aeroflak": ALL_FACES, + "Ion": ALL_FACES, + "Seeker": ALL_FACES, + "Chaingun": ALL_FACES, + "ShieldModule": ALL_FACES, + "GhostModule": ALL_FACES, + "BlinkModule": ALL_FACES, + "EmpModule": ALL_FACES, + "WindowmakerModule": ALL_FACES, + "EnergyModule": ALL_FACES, +} + +def guess_category(name: str, sprite: str) -> str: name = name.lower() sprite = sprite.lower() for variant in CATEGORIES: variant_sanitized = variant.lower() - if variant_sanitized in name or variant_sanitized in sprite: + if (variant_sanitized in name and not str_contains_any(name, CATEGORY_IGNORES)) or (variant_sanitized in sprite and not str_contains_any(sprite, CATEGORY_IGNORES)): return variant return CATEGORIES[0] -def guess_type(name: str, sprite: str, cat: int) -> str: - category = guess_category(name, sprite, cat) +def str_contains_any(s: str, l: list) -> bool: + for variant in l: + variant_sanitized = variant.lower() + if variant_sanitized in s: + print(s + " contains " + variant) + return True + return False + + +def guess_type(category: str) -> str: cat_i = CATEGORIES.index(category) if cat_i == 0: return "NotAFunctionalItem" @@ -115,7 +204,9 @@ def guess_type(name: str, sprite: str, cat: int) -> str: return "NotAFunctionalItem" def guess_tier(name: str, sprite: str) -> str: - return guess_tier_by_name_str_key(name) or guess_tier_by_size(sprite) or "NoTier" + if guess_category(name, sprite) == "NotAFunctionalItem" and "medium" in name.lower(): # Medium cube variants + return "NoTier" + return guess_tier_by_name_str_key(name) or guess_tier_by_size(sprite) or guess_tier_by_name_str_key(sprite) or "NoTier" def guess_tier_by_size(sprite: str) -> str: sprite = sprite.lower() @@ -159,6 +250,44 @@ def placements_to_int(placements: dict) -> int: int(placements["1 UInt8 back"]) << 4 | \ int(placements["1 UInt8 front"]) << 5 +def guess_placement(placements: dict, category: str, name: str) -> int: + by_category = CATEGORIES_PLACEMENTS[category] + if by_category is not None: + return by_category + name = name.lower() + if "front" in name: + return 0b0011000000 + elif category == "Laser": + return ALL_FACES + return placements_to_int(placements) + +def translate_stat_key(key: str) -> str: + return STATS_TRANSLATIONS[key.upper()] + +def replace_stat_values(value: str) -> str: + for replace in STATS_VALUE_REPLACEMENTS.keys(): + value = value.replace(replace, STATS_VALUE_REPLACEMENTS[replace]) + return value + +VARIANT_STRINGS = [ + "frontlaser", + "golden", + "carbon6", + "egglauncher", + "cardlife", + "seekerfirework", + "rudderbat", + "wingbat", + "legspider", +] + +def is_variant_guess(name: str, sprite: str) -> bool: + name_lower = name.lower() + for s in VARIANT_STRINGS: + if s in name_lower: + return True + return False + def main(): print(sys.argv) filename_in = sys.argv[1] @@ -173,6 +302,9 @@ def main(): "movement": dict(), "lerp_value": 10.0, } + last_tech_tree_id = 0 + tech_tree_index = 0 + tech_tree_specials_index = 0 for i in range(len(cubes)): #print(f"processing cube {i}") cube = cubes[i]["0 CubeTypeData data"] @@ -197,15 +329,16 @@ def main(): new_stat_key = str(cube[stat_key]).split(": ")[0] new_stat_val = str(cube[stat_key]).split(": ")[1] stats[new_stat_key] = new_stat_val + category = guess_category(cube["1 string nameStrKey"], cube["1 string spriteName"]); new_entry = { "id": int(cube["0 unsigned int itemCodeValue"]), "info": { - "category": guess_category(cube["1 string nameStrKey"], cube["1 string spriteName"], int(cube["0 PersistentCubeData cubeData"]["0 int category"])), - "placements": placements_to_int(cube["0 PersistentCubeData cubeData"]["0 CubeFaces selectableFaces"]), + "category": category, + "placements": guess_placement(cube["0 PersistentCubeData cubeData"]["0 CubeFaces selectableFaces"], category, cube["1 string nameStrKey"]), "stats": stats, # required "description": str(cube["1 string description"]), # required "size": guess_tier(cube["1 string nameStrKey"], cube["1 string spriteName"]), # required - "type": guess_type(cube["1 string nameStrKey"], cube["1 string spriteName"], int(cube["0 PersistentCubeData cubeData"]["0 int category"])), + "type": guess_type(category), "active": int(cube["1 UInt8 active"]) != 0, # ignored }, # ignored @@ -214,15 +347,69 @@ def main(): "mirrorCubeId": cube["0 PersistentCubeData cubeData"]["1 string mirrorCubeId"], "hexId": str(cube["1 string itemCode"]), } + if "protonium" in name.lower(): + new_entry["info"]["protonium"] = True if "CPU LOAD" in stats: new_entry["info"]["cpu"] = int(stats["CPU LOAD"].strip().split(" ")[0].strip()) if "ARMOR" in stats: new_entry["info"]["health"] = int(stats["ARMOR"].replace(",", "").strip()) + translated_stats = dict() + for (key, val) in new_entry["info"]["stats"].items(): + if key not in IGNORED_STATS: + trans_key = translate_stat_key(key) + translated_stats[trans_key] = replace_stat_values(val) + new_entry["info"]["stats"] = translated_stats if len(new_entry["info"]["description"].strip()) == 0: new_entry["info"]["description"] = name + " (" + str(cube["0 unsigned int itemCodeValue"]) + "_10|" + str(cube["1 string itemCode"]) + "_16) without a description" - if new_entry["info"]["category"] in WEAPONS and new_entry["info"]["type"] == "Weapon": - if new_entry["info"]["size"] in WEAPONS[new_entry["info"]["category"]]: - new_entry["weapon"] = WEAPONS[new_entry["info"]["category"]][new_entry["info"]["size"]] + else: + new_entry["info"]["description"] += " (" + str(cube["0 unsigned int itemCodeValue"]) + "_10|" + str(cube["1 string itemCode"]) + "_16)" + + is_original = not is_variant_guess(cube["1 string nameStrKey"], cube["1 string spriteName"]) + # weapons + if new_entry["info"]["type"] == "Weapon": + if is_original and "module" not in new_entry["info"]["category"].lower(): # ignore variants and modules + print(name, new_entry["info"]["category"], new_entry["info"]["size"]) + tier_num = int(new_entry["info"]["size"][1]) + new_entry["weapon"] = { + "damage_inflicted": i, + "group_fire_scales": [1.0], + } + new_entry["weapon_upgrade"] = { + "xp": tier_num + 1.0, + "rating": tier_num, + "rank": tier_num, + "power": 0, + } + if new_entry["info"]["category"] in WEAPONS: + if new_entry["info"]["size"] in WEAPONS[new_entry["info"]["category"]]: + new_entry["weapon"] = WEAPONS[new_entry["info"]["category"]][new_entry["info"]["size"]] + new_entry["info"]["ignore_in_weapon_list"] = new_entry["info"]["type"] != "Weapon" + + # tech tree + if new_entry["info"]["category"] != "NotAFunctionalItem" and is_original: + if last_tech_tree_id != 0: + neighbours = [last_tech_tree_id] + else: + neighbours = [] + last_tech_tree_id = new_entry["id"] + new_entry["tree"] = { + "position_x": tech_tree_index % 16, + "position_y": tech_tree_index // 16, + "tech_points": i, + "neighbours": neighbours, + "requires": neighbours, + } + tech_tree_index += 1 + if not is_original: + new_entry["tree"] = { + "position_x": tech_tree_specials_index % 16, + "position_y": (tech_tree_specials_index // 16) + 8, + "tech_points": i, + "neighbours": [], + "requires": [227205318], # default cube (MediumCube) + } + tech_tree_specials_index += 1 + print(f"processed cube {i} into {new_entry}") cubes_out["cubes"][new_key] = new_entry with open("../assets/robocraft/cubes.json", "w") as f: