From 66770e2d49523894419da15168868e832c7b2c92 Mon Sep 17 00:00:00 2001
From: fatsbrown <123950591+fatsbrown@users.noreply.github.com>
Date: Wed, 13 May 2026 13:41:20 -0300
Subject: [PATCH] Update to Zwift 1.0.161309
---
cdn/gameassets/ZwiftAndroid_ver_cur.xml | 2 +-
.../Zwift_Updates_Root/ZwiftMac_ver_cur.xml | 2 +-
.../Zwift_Updates_Root/Zwift_ver_cur.xml | 2 +-
data/climbs.txt | 4 +
data/entitlements.txt | 2 +-
data/start_lines.txt | 50 ++++++
data/variants.txt | 161 +++++++++++-------
protobuf/user_storage.proto | 6 +
protobuf/user_storage_pb2.py | 24 +--
9 files changed, 171 insertions(+), 82 deletions(-)
diff --git a/cdn/gameassets/ZwiftAndroid_ver_cur.xml b/cdn/gameassets/ZwiftAndroid_ver_cur.xml
index 6be67ce..95b1d6d 100644
--- a/cdn/gameassets/ZwiftAndroid_ver_cur.xml
+++ b/cdn/gameassets/ZwiftAndroid_ver_cur.xml
@@ -1 +1 @@
-
+
diff --git a/cdn/gameassets/Zwift_Updates_Root/ZwiftMac_ver_cur.xml b/cdn/gameassets/Zwift_Updates_Root/ZwiftMac_ver_cur.xml
index ac3f23e..a32ff07 100644
--- a/cdn/gameassets/Zwift_Updates_Root/ZwiftMac_ver_cur.xml
+++ b/cdn/gameassets/Zwift_Updates_Root/ZwiftMac_ver_cur.xml
@@ -1 +1 @@
-
+
diff --git a/cdn/gameassets/Zwift_Updates_Root/Zwift_ver_cur.xml b/cdn/gameassets/Zwift_Updates_Root/Zwift_ver_cur.xml
index e3731ba..92e7143 100644
--- a/cdn/gameassets/Zwift_Updates_Root/Zwift_ver_cur.xml
+++ b/cdn/gameassets/Zwift_Updates_Root/Zwift_ver_cur.xml
@@ -1 +1 @@
-
+
diff --git a/data/climbs.txt b/data/climbs.txt
index 263d9cf..11610fc 100644
--- a/data/climbs.txt
+++ b/data/climbs.txt
@@ -1,4 +1,8 @@
[
+ {
+ "name": "Alto de Patios (5.9 km / 376 m)",
+ "road": "10052"
+ },
{
"name": "Bealach na Ba (9 km / 632 m)",
"road": "10011"
diff --git a/data/entitlements.txt b/data/entitlements.txt
index 1e94501..973cb96 100644
--- a/data/entitlements.txt
+++ b/data/entitlements.txt
@@ -1 +1 @@
-{"first": 1687, "last": 2143}
\ No newline at end of file
+{"first": 1687, "last": 2144}
\ No newline at end of file
diff --git a/data/start_lines.txt b/data/start_lines.txt
index 27e51eb..a7be329 100644
--- a/data/start_lines.txt
+++ b/data/start_lines.txt
@@ -804,6 +804,36 @@
"road": 0,
"time": 485875
},
+ "-59983043": {
+ "name": "Paris - Cirque du Suffer",
+ "road": 0,
+ "time": 972899
+ },
+ "-1153887298": {
+ "name": "Paris - Cr\u00c3\u00aape Escape",
+ "road": 0,
+ "time": 485874
+ },
+ "1365497350": {
+ "name": "Paris - Double Espresso",
+ "road": 0,
+ "time": 485874
+ },
+ "565111133": {
+ "name": "Paris - Heart of Montmartre",
+ "road": 0,
+ "time": 485874
+ },
+ "870135081": {
+ "name": "Paris - La Boucle",
+ "road": 0,
+ "time": 485874
+ },
+ "-913743341": {
+ "name": "Paris - Loop de loop de loop",
+ "road": 0,
+ "time": 485874
+ },
"1236439870": {
"name": "Paris - Lutece Express",
"road": 0,
@@ -814,6 +844,26 @@
"road": 0,
"time": 485875
},
+ "1247427185": {
+ "name": "Paris - Montmartre Mixer",
+ "road": 0,
+ "time": 485874
+ },
+ "2128895616": {
+ "name": "Paris - Paris Pacer",
+ "road": 0,
+ "time": 888371
+ },
+ "-1489331213": {
+ "name": "Paris - Paris Toujours",
+ "road": 0,
+ "time": 485874
+ },
+ "-1978050323": {
+ "name": "Paris - Rues in Rythme",
+ "road": 0,
+ "time": 36583
+ },
"-2098947784": {
"name": "Richmond - 2015 Worlds Course",
"road": 0,
diff --git a/data/variants.txt b/data/variants.txt
index 6f2264c..b9dc1b8 100644
--- a/data/variants.txt
+++ b/data/variants.txt
@@ -266,7 +266,8 @@
"value": true
},
{
- "name": "game_1_105_zui_logout_earlier"
+ "name": "game_1_105_zui_logout_earlier",
+ "value": true
},
{
"name": "game_1_106_zml_rnl",
@@ -283,7 +284,8 @@
"name": "game_1_108_allow_experimental_uploading"
},
{
- "name": "game_1_108_challenge_poster_cards"
+ "name": "game_1_108_challenge_poster_cards",
+ "value": true
},
{
"name": "game_1_108_data_collection_consent",
@@ -334,16 +336,33 @@
"name": "game_1_110_auto_pairing_fixes"
},
{
- "name": "game_1_110_customizable_workout_hud"
+ "name": "game_1_110_customizable_workout_hud",
+ "value": true,
+ "values": {
+ "fields": {
+ "bUseCustomizedHUD": {
+ "boolValue": true
+ }
+ }
+ }
},
{
"name": "game_1_110_disable_sensor_relay_on_ble"
},
{
- "name": "game_1_110_high_density_just_watch"
+ "name": "game_1_110_high_density_just_watch",
+ "value": true,
+ "values": {
+ "fields": {
+ "botCategory": {
+ "stringValue": "d"
+ }
+ }
+ }
},
{
- "name": "game_1_110_prestige_badging"
+ "name": "game_1_110_prestige_badging",
+ "value": true
},
{
"name": "game_1_110_prevent_auto_continue_when_background_pairing",
@@ -370,12 +389,26 @@
},
{
"name": "game_1_112_tune_experiment",
- "values": {}
+ "value": true,
+ "values": {
+ "fields": {
+ "tune_button": {
+ "stringValue": "MORE OPTIONS"
+ }
+ }
+ }
},
{
"name": "game_1_112_use_steering_and_braking_on_zp",
"value": true
},
+ {
+ "name": "game_1_113_lan_timeout_lowering"
+ },
+ {
+ "name": "game_1_113_quest_xp_reward_icons",
+ "value": true
+ },
{
"name": "game_1_15_assert_disable_abort",
"value": true,
@@ -786,20 +819,6 @@
}
}
},
- {
- "name": "game_1_49_pvs",
- "value": true,
- "values": {}
- },
- {
- "name": "game_1_50_zc_rf1",
- "value": true,
- "values": {}
- },
- {
- "name": "game_1_50_zc_rf2",
- "values": {}
- },
{
"name": "game_1_51_zc_workout_asset_patch_fix",
"value": true,
@@ -828,21 +847,6 @@
{
"name": "game_1_53_enable_hardcoded_repackrush__for_you_carousel__card"
},
- {
- "name": "game_1_53_update_payment_capture",
- "values": {}
- },
- {
- "name": "game_1_53_zp_sgpd",
- "value": true,
- "values": {
- "fields": {
- "DelayInMs": {
- "varintValue": "800"
- }
- }
- }
- },
{
"name": "game_1_53_zui_tp",
"value": true,
@@ -905,11 +909,6 @@
"value": true,
"values": {}
},
- {
- "name": "game_1_62_zp_user_input_device_event_logging",
- "value": true,
- "values": {}
- },
{
"name": "game_1_63_autobraking",
"values": {}
@@ -1121,18 +1120,13 @@
}
}
},
- {
- "name": "game_1_70_device_identifier_analytics",
- "value": true,
- "values": {}
- },
{
"name": "game_1_71_challenge_carousel",
"value": true,
"values": {
"fields": {
"challenge_carousel_id": {
- "stringValue": "prod_home_challenge_carousel"
+ "stringValue": "prod_home_challenge_carousel_1_113"
}
}
}
@@ -1274,7 +1268,15 @@
"values": {}
},
{
- "name": "game_1_77_prevent_teleport_to_player_type"
+ "name": "game_1_77_prevent_teleport_to_player_type",
+ "value": true,
+ "values": {
+ "fields": {
+ "restricted_teleports": {
+ "stringValue": "{\"Player Type\":[{\"ZWIFT_STAFF,NORMAL,PRO_CYCLIST,AMBASSADOR,VERIFIED,ZED,ZAC,PRO_TRIATHLETE,PRO_RUNNER,\":[{\"World ID\":11,\"Road IDs\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164]}]}]}"
+ }
+ }
+ }
},
{
"name": "game_1_77_ttt_team_car_shows_znl_when_fanviewing",
@@ -1486,9 +1488,6 @@
}
}
},
- {
- "name": "game_1_90_ios_link_to_web_payment_provider"
- },
{
"name": "game_1_90_use_web_onboarding_skill_level"
},
@@ -1583,8 +1582,7 @@
}
},
{
- "name": "game_1_98_aup",
- "value": true
+ "name": "game_1_98_aup"
},
{
"name": "game_1_98_prevent_creation_zp_controller_sensor_relay_sensor"
@@ -1907,7 +1905,7 @@
"stringValue": "dlc_asset"
},
"build_id": {
- "stringValue": "161037"
+ "stringValue": "160612"
},
"canary_test": {
"boolValue": true
@@ -2038,7 +2036,24 @@
"values": {}
},
{
- "name": "game_instrumental_rock_bass"
+ "name": "game_instrumental_rock_bass",
+ "value": true,
+ "values": {
+ "fields": {
+ "end": {
+ "varintValue": "1783328400"
+ },
+ "ints": {
+ "stringValue": "1,11,1,1 2,11,0,1 4,11,3,0 4,11,0,1 5,11,1,0 5,11,1,1 3,11,1,0 6,11,0,1 7,11,1,1 7,11,3,1 9,11,0,0 0,11,0,0 8,11,3,0 8,11,0,0 10,11,1,1 730000,11,0,0 870000,11,1,1 1060000,11,0,0"
+ },
+ "routes": {
+ "stringValue": "3141079998,870135081,2805636083,1365497350,1247427185,3381223955,4234984253,2316916973,2128895616,565111133"
+ },
+ "start": {
+ "varintValue": "1775631600"
+ }
+ }
+ }
},
{
"name": "game_lauterbrunnen",
@@ -2102,6 +2117,20 @@
}
}
},
+ {
+ "name": "game_os_deprecation_warning",
+ "value": true,
+ "values": {
+ "fields": {
+ "iOS": {
+ "stringValue": "15.0;2026/08/04"
+ },
+ "showInGameWarning": {
+ "boolValue": true
+ }
+ }
+ }
+ },
{
"name": "game_prize_wheel_schedule",
"value": true,
@@ -2185,7 +2214,15 @@
"values": {}
},
{
- "name": "game_routes_delivery"
+ "name": "game_routes_delivery",
+ "value": true,
+ "values": {
+ "fields": {
+ "version": {
+ "stringValue": "1.113.0"
+ }
+ }
+ }
},
{
"name": "game_sentry_log_upload",
@@ -2214,6 +2251,9 @@
"value": true,
"values": {}
},
+ {
+ "name": "game_spatial_frame_time_telemetry"
+ },
{
"name": "game_staged_quest_rewards_ui",
"value": true
@@ -2321,18 +2361,11 @@
}
}
},
- {
- "name": "game_uiupdateinupdate",
- "value": true
- },
{
"name": "game_user_storage_service",
"value": true,
"values": {}
},
- {
- "name": "game_watopian_force_1080p"
- },
{
"name": "game_wd1_data_acq"
},
@@ -2402,10 +2435,6 @@
"name": "gfx_romsdalen",
"values": {}
},
- {
- "name": "gfx_waipio",
- "value": true
- },
{
"name": "gn_deferred_lighting",
"value": true,
diff --git a/protobuf/user_storage.proto b/protobuf/user_storage.proto
index 97bb017..0b1e7ad 100644
--- a/protobuf/user_storage.proto
+++ b/protobuf/user_storage.proto
@@ -24,6 +24,12 @@ message GameSettings {
optional int32 streaks_flair_visuals = 11;
optional int32 ride_stats_slot0 = 13;
optional int32 ride_stats_slot1 = 14;
+ optional int32 workout_stats_slot0 = 15;
+ optional int32 workout_stats_slot1 = 16;
+ optional int32 workout_stats_slot2 = 17;
+ optional int32 workout_stats_slot3 = 18;
+ optional int32 ride_stats_workout_slot0 = 19;
+ optional int32 ride_stats_workout_slot1 = 20;
}
message GarageItemLastSelected {
diff --git a/protobuf/user_storage_pb2.py b/protobuf/user_storage_pb2.py
index f0337e6..7276331 100644
--- a/protobuf/user_storage_pb2.py
+++ b/protobuf/user_storage_pb2.py
@@ -13,7 +13,7 @@ _sym_db = _symbol_database.Default()
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x12user_storage.proto\".\n\x0bUserStorage\x12\x1f\n\nattributes\x18\x02 \x03(\x0b\x32\x0b.Attributes\"\xf7\x01\n\nAttributes\x12$\n\rgame_settings\x18\x16 \x01(\x0b\x32\r.GameSettings\x12\x35\n\x14garage_last_selected\x18\x17 \x01(\x0b\x32\x17.GarageItemLastSelected\x12$\n\rbike_progress\x18\x18 \x01(\x0b\x32\r.BikeProgress\x12-\n\x12special_event_seen\x18\x19 \x01(\x0b\x32\x11.SpecialEventSeen\x12\x37\n\x17\x64\x61ta_collection_consent\x18\x1d \x01(\x0b\x32\x16.DataCollectionConsent\"\xb4\x02\n\x0cGameSettings\x12\n\n\x02\x66\x32\x18\x02 \x01(\x02\x12\x1c\n\x14minimal_leaderboards\x18\x03 \x01(\x05\x12\x19\n\x11power_meter_slot0\x18\x04 \x01(\x05\x12\x19\n\x11power_meter_slot1\x18\x05 \x01(\x05\x12\x19\n\x11power_meter_slot2\x18\x06 \x01(\x05\x12\x19\n\x11power_meter_slot3\x18\x07 \x01(\x05\x12\x1f\n\x17\x63limb_graph_sensitivity\x18\t \x01(\x05\x12\x1a\n\x12screen_shake_scale\x18\n \x01(\x02\x12\x1d\n\x15streaks_flair_visuals\x18\x0b \x01(\x05\x12\x18\n\x10ride_stats_slot0\x18\r \x01(\x05\x12\x18\n\x10ride_stats_slot1\x18\x0e \x01(\x05\"9\n\x16GarageItemLastSelected\x12\x11\n\tsignature\x18\x01 \x01(\t\x12\x0c\n\x04time\x18\x02 \x01(\x04\"3\n\x10SpecialEventSeen\x12\x11\n\tsignature\x18\x01 \x01(\t\x12\x0c\n\x04time\x18\x02 \x01(\x04\"\xbf\x02\n\x0c\x42ikeProgress\x12\x11\n\tsignature\x18\x01 \x01(\t\x12\r\n\x05level\x18\x02 \x01(\r\x12\x16\n\x0elevel_distance\x18\x03 \x01(\x02\x12\x16\n\x0etotal_distance\x18\x04 \x01(\x02\x12\x17\n\x0flevel_elevation\x18\x05 \x01(\x02\x12\x17\n\x0ftotal_elevation\x18\x06 \x01(\x02\x12\x19\n\x11level_moving_time\x18\x07 \x01(\x02\x12\x19\n\x11total_moving_time\x18\x08 \x01(\x02\x12\x14\n\x0clast_upgrade\x18\n \x01(\x04\x12\x0c\n\x04time\x18\x0b \x01(\x04\x12#\n\rbike_upgrades\x18\x0c \x03(\x0b\x32\x0c.BikeUpgrade\x12\x0b\n\x03\x66\x31\x34\x18\x0e \x01(\r\x12\x12\n\npercentage\x18\x0f \x01(\x02\x12\x0b\n\x03\x66\x31\x36\x18\x10 \x01(\r\"9\n\x0b\x42ikeUpgrade\x12\x0c\n\x04time\x18\x01 \x01(\x04\x12\r\n\x05level\x18\x02 \x01(\r\x12\r\n\x05price\x18\x03 \x01(\r\"F\n\x15\x44\x61taCollectionConsent\x12\x0e\n\x06\x64\x65vice\x18\x01 \x01(\t\x12\x0f\n\x07\x63onsent\x18\x02 \x01(\x05\x12\x0c\n\x04time\x18\x03 \x01(\x04')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x12user_storage.proto\".\n\x0bUserStorage\x12\x1f\n\nattributes\x18\x02 \x03(\x0b\x32\x0b.Attributes\"\xf7\x01\n\nAttributes\x12$\n\rgame_settings\x18\x16 \x01(\x0b\x32\r.GameSettings\x12\x35\n\x14garage_last_selected\x18\x17 \x01(\x0b\x32\x17.GarageItemLastSelected\x12$\n\rbike_progress\x18\x18 \x01(\x0b\x32\r.BikeProgress\x12-\n\x12special_event_seen\x18\x19 \x01(\x0b\x32\x11.SpecialEventSeen\x12\x37\n\x17\x64\x61ta_collection_consent\x18\x1d \x01(\x0b\x32\x16.DataCollectionConsent\"\xec\x03\n\x0cGameSettings\x12\n\n\x02\x66\x32\x18\x02 \x01(\x02\x12\x1c\n\x14minimal_leaderboards\x18\x03 \x01(\x05\x12\x19\n\x11power_meter_slot0\x18\x04 \x01(\x05\x12\x19\n\x11power_meter_slot1\x18\x05 \x01(\x05\x12\x19\n\x11power_meter_slot2\x18\x06 \x01(\x05\x12\x19\n\x11power_meter_slot3\x18\x07 \x01(\x05\x12\x1f\n\x17\x63limb_graph_sensitivity\x18\t \x01(\x05\x12\x1a\n\x12screen_shake_scale\x18\n \x01(\x02\x12\x1d\n\x15streaks_flair_visuals\x18\x0b \x01(\x05\x12\x18\n\x10ride_stats_slot0\x18\r \x01(\x05\x12\x18\n\x10ride_stats_slot1\x18\x0e \x01(\x05\x12\x1b\n\x13workout_stats_slot0\x18\x0f \x01(\x05\x12\x1b\n\x13workout_stats_slot1\x18\x10 \x01(\x05\x12\x1b\n\x13workout_stats_slot2\x18\x11 \x01(\x05\x12\x1b\n\x13workout_stats_slot3\x18\x12 \x01(\x05\x12 \n\x18ride_stats_workout_slot0\x18\x13 \x01(\x05\x12 \n\x18ride_stats_workout_slot1\x18\x14 \x01(\x05\"9\n\x16GarageItemLastSelected\x12\x11\n\tsignature\x18\x01 \x01(\t\x12\x0c\n\x04time\x18\x02 \x01(\x04\"3\n\x10SpecialEventSeen\x12\x11\n\tsignature\x18\x01 \x01(\t\x12\x0c\n\x04time\x18\x02 \x01(\x04\"\xbf\x02\n\x0c\x42ikeProgress\x12\x11\n\tsignature\x18\x01 \x01(\t\x12\r\n\x05level\x18\x02 \x01(\r\x12\x16\n\x0elevel_distance\x18\x03 \x01(\x02\x12\x16\n\x0etotal_distance\x18\x04 \x01(\x02\x12\x17\n\x0flevel_elevation\x18\x05 \x01(\x02\x12\x17\n\x0ftotal_elevation\x18\x06 \x01(\x02\x12\x19\n\x11level_moving_time\x18\x07 \x01(\x02\x12\x19\n\x11total_moving_time\x18\x08 \x01(\x02\x12\x14\n\x0clast_upgrade\x18\n \x01(\x04\x12\x0c\n\x04time\x18\x0b \x01(\x04\x12#\n\rbike_upgrades\x18\x0c \x03(\x0b\x32\x0c.BikeUpgrade\x12\x0b\n\x03\x66\x31\x34\x18\x0e \x01(\r\x12\x12\n\npercentage\x18\x0f \x01(\x02\x12\x0b\n\x03\x66\x31\x36\x18\x10 \x01(\r\"9\n\x0b\x42ikeUpgrade\x12\x0c\n\x04time\x18\x01 \x01(\x04\x12\r\n\x05level\x18\x02 \x01(\r\x12\r\n\x05price\x18\x03 \x01(\r\"F\n\x15\x44\x61taCollectionConsent\x12\x0e\n\x06\x64\x65vice\x18\x01 \x01(\t\x12\x0f\n\x07\x63onsent\x18\x02 \x01(\x05\x12\x0c\n\x04time\x18\x03 \x01(\x04')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'user_storage_pb2', globals())
@@ -25,15 +25,15 @@ if _descriptor._USE_C_DESCRIPTORS == False:
_ATTRIBUTES._serialized_start=71
_ATTRIBUTES._serialized_end=318
_GAMESETTINGS._serialized_start=321
- _GAMESETTINGS._serialized_end=629
- _GARAGEITEMLASTSELECTED._serialized_start=631
- _GARAGEITEMLASTSELECTED._serialized_end=688
- _SPECIALEVENTSEEN._serialized_start=690
- _SPECIALEVENTSEEN._serialized_end=741
- _BIKEPROGRESS._serialized_start=744
- _BIKEPROGRESS._serialized_end=1063
- _BIKEUPGRADE._serialized_start=1065
- _BIKEUPGRADE._serialized_end=1122
- _DATACOLLECTIONCONSENT._serialized_start=1124
- _DATACOLLECTIONCONSENT._serialized_end=1194
+ _GAMESETTINGS._serialized_end=813
+ _GARAGEITEMLASTSELECTED._serialized_start=815
+ _GARAGEITEMLASTSELECTED._serialized_end=872
+ _SPECIALEVENTSEEN._serialized_start=874
+ _SPECIALEVENTSEEN._serialized_end=925
+ _BIKEPROGRESS._serialized_start=928
+ _BIKEPROGRESS._serialized_end=1247
+ _BIKEUPGRADE._serialized_start=1249
+ _BIKEUPGRADE._serialized_end=1306
+ _DATACOLLECTIONCONSENT._serialized_start=1308
+ _DATACOLLECTIONCONSENT._serialized_end=1378
# @@protoc_insertion_point(module_scope)