diff --git a/.github/workflows/generate.yml b/.github/workflows/generate.yml index cac48c8..a62c625 100644 --- a/.github/workflows/generate.yml +++ b/.github/workflows/generate.yml @@ -24,6 +24,7 @@ jobs: python script/generate_boards.py python script/collection.py python script/calender.py + python script/quests.py - name: increase version run: python script/update.py @@ -41,7 +42,7 @@ jobs: run: | git config user.name "GitHub Actions" git config user.email "actions@github.com" - git commit -am "characters, boards" + git commit -am "auto update files ${{steps.version.outputs.version}}" git push - name: Convert & Zip diff --git a/CHANGELOG.md b/CHANGELOG.md index 58a05b1..7420d20 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -170,3 +170,55 @@ - Added Characters Thursday, outatimeJake - Added Outfit botanicalHorrorOutfit (scarlett) - Added Boards flamingdoll, backtothefuture + +### v1.3.1 + +- add Todo +- update score multiplier +- update calender +- add scripts & update info +- fix not running error +- user_settings & tutorial +- Added Characters musician, jiYeong +- Added Outfit stanOutfit (alexandre) +- Added Boards kdillac, retroorange, neoseoul, energy + +### v1.3.2 + +- Update upgrades.json +- Added Characters vivienne, lawrence +- Added Outfit sneakyblindersOutfit (alia) +- Added Boards fauxpunx, sharpeed + +### v1.3.3 + +- Added Characters clockworkJohnny, captainFlash +- Added Outfit jingleOutfit (bobTheBlob) +- Added Boards winduprocket, snowdown, flashjet + +### v1.3.4 + +- Added Characters skye, thunder +- Added Boards skyrocket, electroshock + +### v1.3.5 + +- Added Characters dragonyear, azura +- Added Outfit cupidOutfit (alfie) +- Added Boards roaringheart, badabomb, redvelvet, lunarscroll, confetticrush + +### v1.3.6 + +- rename / move files +- add list generator +- Added Characters astra, stella +- Added Outfit celestialOutfit (jiYeong) +- Added Boards interstellar, astrotune + +### v1.3.7 + +- Characters.md & setup.py +- Added Characters lucky, meggan, redpanda +- Added Outfit eggstravaganzaOutfit (george) +- Added Outfit theholiOutfit (moira) +- Added Boards shamrockshebang, meggabite, jak, fastandfestive, radiantrider diff --git a/README.md b/README.md index bbfb2da..0d4e85b 100644 --- a/README.md +++ b/README.md @@ -20,13 +20,13 @@ ## Announcement -You can use [subway_gen](https://subway.herrerde.xyz) to customize your own SubwaySurf files, with different Coin/Keys/Boards/.. amount +You can use [subway_gen](https://subway.herrerde.xyz) to customize your own SubwaySurf files, with different Coin/Keys/.. amount, also with Characters and Boards picker ## Features - Every [**Character**](https://subwaysurf.fandom.com/wiki/Characters) and their **Outfits** - Every [**Hoverboard**](https://subwaysurf.fandom.com/wiki/Hoverboard) with every **Special Ability** -- **All Upgrades** +- **Max Level Upgrades** - **Double Coins** - **Endless Token Boost** - _basicly_ **Unlimited Coins** @@ -39,21 +39,23 @@ You can use [subway_gen](https://subway.herrerde.xyz) to customize your own Subw - All **Collections** - All **Trophies** - All **Achievements** +- All **Quests** ### Info -The files of the SubwaySurfers App are now encrypted, not changing the way to add new names for the Characters/Outfits/Boards. -Because it is still possible to modify the SubwaySurfers files by just replacing the original SubwaySurfers files with the modified ones. - -If you want to extract your own set of Characters or Boards, you can achieve this by downloading the app, renaming it to `.zip`, \ -and then extracting the files `characters.json` and `boards.json` from the folder `assets/tower/gamedata/`. \ -This folder contains the necessary data, allowing you to set all characters or boards along with their outfits and Special Abilities. +The save files in SubwaySurf are now encrypted, which doesn't change the way how to modify the pre-generated files, like new Characters/Outfits/Boards. +By just replacing your encrypted SubwaySurf save files with the unencrypted modified ones, it will modify to the new Values. ### How do I use it? -To modify the SubwaySurfers files, you'll need a file explorer and the latest release from [this link](https://github.com/HerrErde/SubwayBooster/releases/latest). Once you've downloaded the release, unpack the Zip file and extract it into the same folder. In the extracted files, you'll find the **Android** folder. Copy this folder to the **Internal Storage** of your Android device. +To modify the SubwaySurfers files, you'll need a file explorer and the latest [release](https://github.com/HerrErde/SubwayBooster/releases/latest). \ +Once you've downloaded the release, simply unpack the Zip file and extract its contents into the same folder (This process may vary depending on the file explorer you're using). +In the extracted files, you'll have the **Android** folder. Copy this folder to the **Internal **Storage** (which has its own **Android** folder) of your Android device. (You'll need to have full access to your Android/data folder for this step). + +If you need help join the [Discord Server](https://discord.gg/NAXbNwKK2V) -If you know what you're doing, you can edit the individual files and then copy them into the `com.kiloo.subwaysurf` folder. Just make sure to be careful and understand the changes you're making. +If you know how to, you can edit the individual files and then copy them into the `com.kiloo.subwaysurf` folder. \ +Just make sure to know to understand which changes you're making. --- diff --git a/script/quests.py b/script/quests.py new file mode 100644 index 0000000..1cec951 --- /dev/null +++ b/script/quests.py @@ -0,0 +1,21 @@ +import json + +quests_file = "src/profile/quests.json" +collections_file = "collections_data.json" + + +def update_quests(season): + with open(quests_file, "r+") as file: + quests_data = json.load(file) + quests_data["data"]["timeSlot"] = season + for quest_type in ["daily", "seasonal"]: + quests_data["data"]["questStates"][quest_type]["globalTimeslotId"] = season + file.seek(0) + file.truncate() + json.dump(quests_data, file, indent=2) + + +with open(collections_file) as f: + season = json.load(f).get("timeSlot", "") + +update_quests(season) diff --git a/src/profile/quests.json b/src/profile/quests.json new file mode 100644 index 0000000..aa88007 --- /dev/null +++ b/src/profile/quests.json @@ -0,0 +1,606 @@ +{ + "version": 1, + "data": { + "lastSaved": "0001-01-01T00:00:00Z", + "timeSlot": "season_S81", + "progressPoints": 999999, + "questStates": { + "daily": { + "globalTimeslotId": "season_S81", + "id": "daily", + "titleKey": "ui.quests.section_daily", + "type": 1, + "questSet": { + "endTime": "9999-12-31T00:00:00Z", + "questObjectives": [ + { + "shortcut": "WorldTour", + "icon": "$event_coin", + "difficulty": 0, + "goal": 2000, + "targetFiller": 0, + "currentProgress": 2000, + "claimed": true, + "target": 0, + "condition": 0, + "completionKey": "daily" + }, + { + "seasonPoints": 5, + "shortcut": "MainMenu", + "icon": "icon_sneaker", + "difficulty": 0, + "goal": 2, + "targetFiller": 0, + "currentProgress": 2, + "claimed": true, + "target": 22, + "condition": 0, + "completionKey": "daily" + }, + { + "seasonPoints": 15, + "shortcut": "MainMenu", + "icon": "hoverboard", + "difficulty": 0, + "goal": 6, + "targetFiller": 0, + "currentProgress": 6, + "claimed": true, + "target": 30, + "condition": 0, + "completionKey": "daily" + }, + { + "seasonPoints": 10, + "shortcut": "Shop", + "icon": "minimysterybox", + "difficulty": 0, + "goal": 2, + "targetFiller": 0, + "currentProgress": 2, + "claimed": true, + "target": 41, + "condition": 0, + "completionKey": "daily" + }, + { + "seasonPoints": 10, + "shortcut": "MainMenu", + "icon": "icon_coin", + "difficulty": 0, + "goal": 750, + "targetFiller": 0, + "currentProgress": 750, + "claimed": true, + "target": 16, + "condition": 0, + "completionKey": "daily" + }, + { + "seasonPoints": 15, + "shortcut": "MainMenu", + "icon": "icon_key_02", + "difficulty": 0, + "goal": 3, + "targetFiller": 0, + "currentProgress": 3, + "claimed": true, + "target": 31, + "condition": 0, + "completionKey": "daily" + }, + { + "seasonPoints": 10, + "shortcut": "WorldTour", + "icon": "icon_dailychallenge", + "difficulty": 0, + "goal": 2, + "targetFiller": 0, + "currentProgress": 2, + "claimed": true, + "target": 43, + "condition": 0, + "completionKey": "daily" + } + ], + "type": 0 + }, + "currentSetIndex": 5, + "refreshSetCost": { + "costKeys": [ + 2, + 3, + 5 + ], + "adWatch": true + }, + "maxPaidRefresh": 3, + "seenLatestChanges": true + }, + "seasonal": { + "globalTimeslotId": "season_S81", + "id": "seasonal", + "titleKey": "ui.quests.section_seasonal", + "type": 2, + "questSet": { + "startTime": "0001-01-01T00:00:00Z", + "endTime": "9999-12-31T00:00:00Z", + "questObjectives": [ + { + "seasonPoints": 150, + "shortcut": "TopRun", + "icon": "icon_medal_gold", + "difficulty": 0, + "goal": 1, + "targetFiller": 0, + "currentProgress": 1, + "claimed": true, + "target": 48, + "condition": 0, + "completionKey": "seasonal" + }, + { + "seasonPoints": 100, + "shortcut": "MainMenu", + "icon": "jetpack", + "difficulty": 0, + "goal": 3500, + "targetFiller": 0, + "currentProgress": 3500, + "claimed": true, + "target": 16, + "condition": 0, + "completionKey": "seasonal" + }, + { + "seasonPoints": 200, + "shortcut": "WorldTour", + "icon": "icon_sneaker", + "difficulty": 0, + "goal": 100, + "targetFiller": 0, + "currentProgress": 100, + "claimed": true, + "target": 44, + "condition": 0, + "completionKey": "seasonal" + }, + { + "seasonPoints": 150, + "shortcut": "MainMenu", + "icon": "headstart", + "difficulty": 0, + "goal": 30, + "targetFiller": 0, + "currentProgress": 30, + "claimed": true, + "target": 29, + "condition": 0, + "completionKey": "seasonal" + }, + { + "seasonPoints": 100, + "shortcut": "MainMenu", + "icon": "icon_video", + "difficulty": 0, + "goal": 30, + "targetFiller": 0, + "currentProgress": 30, + "claimed": true, + "target": 47, + "condition": 0, + "completionKey": "seasonal" + }, + { + "seasonPoints": 300, + "shortcut": "Offers", + "icon": "$event_coin", + "difficulty": 0, + "goal": 40000, + "targetFiller": 0, + "currentProgress": 40000, + "claimed": true, + "target": 33, + "condition": 0, + "completionKey": "seasonal" + }, + { + "seasonPoints": 250, + "shortcut": "WorldTour", + "icon": "icon_elitechallenge", + "difficulty": 0, + "goal": 8, + "targetFiller": 0, + "currentProgress": 8, + "claimed": true, + "target": 46, + "condition": 0, + "completionKey": "seasonal" + }, + { + "seasonPoints": 100, + "shortcut": "MainMenu", + "icon": "hoverboard", + "difficulty": 0, + "goal": 100, + "targetFiller": 0, + "currentProgress": 100, + "claimed": true, + "target": 30, + "condition": 0, + "completionKey": "seasonal" + }, + { + "seasonPoints": 100, + "shortcut": "MainMenu", + "icon": "icon_sneaker", + "difficulty": 0, + "goal": 200, + "targetFiller": 0, + "currentProgress": 200, + "claimed": true, + "target": 22, + "condition": 0, + "completionKey": "seasonal" + }, + { + "seasonPoints": 200, + "shortcut": "MainMenu", + "icon": "icon_coin", + "difficulty": 0, + "goal": 75000, + "targetFiller": 0, + "currentProgress": 75000, + "claimed": true, + "target": 16, + "condition": 0, + "completionKey": "seasonal" + } + ], + "type": 0 + }, + "currentSetIndex": 2, + "seenLatestChanges": true + } + }, + "poolPointers": { + "quest_pool_1": 2, + "quest_pool_3": 2, + "quest_pool_7": 2, + "quest_pool_2": 4, + "quest_pool_4": 2 + }, + "rewards": [ + { + "rewardWithFallback": [ + { + "reward": { + "type": "Currency", + "id": "Hoverboards", + "value": 1, + "claimed": true + } + }, + { + "reward": { + "type": "Currency", + "id": "EventCoins", + "value": 500, + "claimed": true + }, + "fallbackReward": { + "type": "Currency", + "id": "Coins", + "value": 500 + } + } + ], + "pointsToUnlock": 40, + "state": 10 + }, + { + "rewardWithFallback": [ + { + "reward": { + "type": "Currency", + "id": "HeadStarts", + "value": 1, + "claimed": true + } + }, + { + "reward": { + "type": "Currency", + "id": "ScoreBoosters", + "value": 1, + "claimed": true + } + } + ], + "pointsToUnlock": 150, + "state": 10, + "index": 1 + }, + { + "rewardWithFallback": [ + { + "reward": { + "type": "Currency", + "id": "Hoverboards", + "value": 3, + "claimed": true + } + }, + { + "reward": { + "type": "Currency", + "id": "Coins", + "value": 300, + "claimed": true + } + } + ], + "pointsToUnlock": 250, + "state": 10, + "index": 2, + "groupId": 1 + }, + { + "rewardWithFallback": [ + { + "reward": { + "type": "Currency", + "id": "ScoreBoosters", + "value": 5, + "claimed": true + } + }, + { + "reward": { + "type": "Currency", + "id": "EventCoins", + "value": 1000, + "claimed": true + }, + "fallbackReward": { + "type": "Currency", + "id": "Coins", + "value": 1000 + } + } + ], + "pointsToUnlock": 500, + "state": 10, + "index": 3, + "groupId": 1 + }, + { + "rewardWithFallback": [ + { + "reward": { + "type": "SeasonHuntToken", + "value": 10, + "claimed": true + } + }, + { + "reward": { + "type": "Currency", + "id": "Coins", + "value": 2000, + "claimed": true + } + } + ], + "pointsToUnlock": 750, + "state": 10, + "index": 4, + "groupId": 1 + }, + { + "rewardWithFallback": [ + { + "reward": { + "type": "Currency", + "id": "HeadStarts", + "value": 5, + "claimed": true + } + }, + { + "reward": { + "type": "Currency", + "id": "EventCoins", + "value": 1000, + "claimed": true + }, + "fallbackReward": { + "type": "Currency", + "id": "Coins", + "value": 1000 + } + } + ], + "pointsToUnlock": 1000, + "state": 10, + "index": 5, + "groupId": 2 + }, + { + "rewardWithFallback": [ + { + "reward": { + "type": "SeasonHuntToken", + "value": 15, + "claimed": true + } + }, + { + "reward": { + "type": "Currency", + "id": "EventCoins", + "value": 1500, + "claimed": true + }, + "fallbackReward": { + "type": "Currency", + "id": "Coins", + "value": 1500 + } + } + ], + "pointsToUnlock": 1500, + "state": 10, + "index": 6, + "groupId": 2 + }, + { + "rewardWithFallback": [ + { + "reward": { + "type": "SeasonHuntToken", + "value": 20, + "claimed": true + } + }, + { + "reward": { + "type": "Currency", + "id": "EventCoins", + "value": 1500, + "claimed": true + }, + "fallbackReward": { + "type": "Currency", + "id": "Coins", + "value": 1500 + } + } + ], + "pointsToUnlock": 2000, + "state": 10, + "index": 7, + "groupId": 2 + }, + { + "rewardWithFallback": [ + { + "reward": { + "type": "Currency", + "id": "Hoverboards", + "value": 5, + "claimed": true + } + }, + { + "reward": { + "type": "Currency", + "id": "EventCoins", + "value": 2000, + "claimed": true + }, + "fallbackReward": { + "type": "Currency", + "id": "Coins", + "value": 2000 + } + } + ], + "pointsToUnlock": 2500, + "state": 10, + "index": 8, + "groupId": 3 + }, + { + "rewardWithFallback": [ + { + "reward": { + "type": "SeasonHuntToken", + "value": 20, + "claimed": true + } + }, + { + "reward": { + "type": "Currency", + "id": "EventCoins", + "value": 2500, + "claimed": true + }, + "fallbackReward": { + "type": "Currency", + "id": "Coins", + "value": 2500 + } + } + ], + "pointsToUnlock": 3000, + "state": 10, + "index": 9, + "groupId": 3 + }, + { + "rewardWithFallback": [ + { + "reward": { + "type": "Currency", + "id": "EventCoins", + "value": 3000, + "claimed": true + }, + "fallbackReward": { + "type": "Currency", + "id": "Coins", + "value": 3000 + } + }, + { + "reward": { + "type": "Currency", + "id": "Keys", + "value": 5, + "claimed": true + } + } + ], + "pointsToUnlock": 3500, + "state": 10, + "index": 10, + "groupId": 4 + }, + { + "rewardWithFallback": [ + { + "reward": { + "type": "Currency", + "id": "EventCoins", + "value": 5000, + "claimed": true + }, + "fallbackReward": { + "type": "Currency", + "id": "Coins", + "value": 5000 + } + }, + { + "reward": { + "type": "Currency", + "id": "Keys", + "value": 10, + "claimed": true + } + } + ], + "pointsToUnlock": 4000, + "state": 10, + "index": 11, + "groupId": 4 + } + ], + "sunsetPeriod": 907200, + "lastSeenGroupId": 1, + "lastSeenProgressPoints": 999999 + } +} \ No newline at end of file