mirror of
https://github.com/zkldi/Tachi.git
synced 2026-10-11 16:58:25 +03:00
feat: some initial quests and goals
This commit is contained in:
@@ -455,8 +455,7 @@ function GetChartDataForGPT(idString: IDStrings): PrudenceSchema {
|
||||
export const PR_GOAL_SCHEMA = {
|
||||
game: p.isIn(games),
|
||||
playtype: isValidPlaytype,
|
||||
timeAdded: p.isPositive,
|
||||
title: "string",
|
||||
name: "string",
|
||||
goalID: "string",
|
||||
criteria: p.or(
|
||||
{
|
||||
@@ -644,12 +643,10 @@ const PRE_SCHEMAS = {
|
||||
name: "string",
|
||||
desc: "string",
|
||||
questID: "string",
|
||||
group: "?string",
|
||||
groupINdex: p.nullable(p.isInteger),
|
||||
questData: [
|
||||
{
|
||||
title: "string",
|
||||
desc: "string",
|
||||
desc: "*string",
|
||||
goals: [{ goalID: "string", note: "*string" }],
|
||||
},
|
||||
],
|
||||
|
||||
+1
-2
@@ -353,7 +353,6 @@ export type Ratings = Record<Game, Record<Playtype, number>>;
|
||||
export interface BaseGoalDocument extends MongoDBDocument {
|
||||
game: Game;
|
||||
playtype: Playtype;
|
||||
timeAdded: integer;
|
||||
name: string;
|
||||
goalID: string;
|
||||
criteria: GoalCountCriteria | GoalSingleCriteria;
|
||||
@@ -623,7 +622,7 @@ interface QuestGoalReference {
|
||||
|
||||
interface QuestSection {
|
||||
title: string;
|
||||
desc: string;
|
||||
desc?: string;
|
||||
goals: Array<QuestGoalReference>;
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1 +1,825 @@
|
||||
[]
|
||||
[
|
||||
{
|
||||
"desc": "These goals are around 13.1 KtLampRating and 5-10BPI.",
|
||||
"game": "iidx",
|
||||
"name": "Post-Kaiden II",
|
||||
"playtype": "SP",
|
||||
"questData": [
|
||||
{
|
||||
"title": "Specific Clear Goals",
|
||||
"desc": "",
|
||||
"goals": [
|
||||
{
|
||||
"goalID": "G76c0bbc3a0fe6317ca7df70dc434019649e2688b8ea837b53ab2746c50a9e6f9",
|
||||
"note": "It's all in the earth power."
|
||||
},
|
||||
{
|
||||
"goalID": "G791f6d82168c328f1cc2e2969259395a5ef45e5e3a5b707741a1f4daa51b624e",
|
||||
"note": "It's all in the speed."
|
||||
},
|
||||
{
|
||||
"goalID": "G619aa77d55ea4bcc640f417c89dcececf2b27cffa668bbc3c426ca3ca7c08fd9",
|
||||
"note": "It's all in the soflan."
|
||||
},
|
||||
{
|
||||
"goalID": "Ge3dfee446e5a637cec50289cb155491867169d160df111f216c3d3c5b83983c8",
|
||||
"note": "It's all in the turntable."
|
||||
},
|
||||
{
|
||||
"goalID": "Gcc568ff893af52f198a9a44923935316a2493a860f490daabd1f2d04b73fa611",
|
||||
"note": "It's all in the uhh..."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Specific Timing Goals",
|
||||
"desc": "",
|
||||
"goals": [
|
||||
{
|
||||
"goalID": "G7b1d40f6c387b9b7f9e526be5dda00eb58e6ed3d460199a2e45b8c2c38b8e028",
|
||||
"note": "This is a classic landmark for timing ability. Push through the intro and don't let nerves trip you!"
|
||||
},
|
||||
{
|
||||
"goalID": "Gc8810aee9f6a72665481caf696bc2ac4d8e18ecead4c5f7578cb42afb969a1d5"
|
||||
},
|
||||
{
|
||||
"goalID": "G5deff029c3b74dda741fc9f1ca4b31b73fa4fab545e9da42b856a233753213d8"
|
||||
},
|
||||
{
|
||||
"goalID": "G1022f0dd6ea1431dda59337a7de9fdec00299064c0ca64f8f12aab7a99448b17"
|
||||
},
|
||||
{
|
||||
"goalID": "G1b3c51e5777c2b03d2217d905692cb3f9f56ba44b49737942cddaae423d6eeb0"
|
||||
},
|
||||
{
|
||||
"goalID": "G48b37635cef52936fca85eb2b67de9f59e6d2acdae03c3c3d25b56baf18339f5",
|
||||
"note": "Depending on your proficiency at weird stuff, you might be able to get this *way* sooner... or way later."
|
||||
},
|
||||
{
|
||||
"goalID": "G003f2d03f54c43e569459e4b7c669ba1b221970c77be995c66d2a2e0757278f8",
|
||||
"note": "This might be the hardest one here. Good luck."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "General Clear Goals",
|
||||
"desc": "",
|
||||
"goals": [
|
||||
{
|
||||
"goalID": "G6e20c550080d65cff94a78b7a3543eebb3bb6d2cb3822a67da7a167f92098057",
|
||||
"note": "This isn't actually that hard, it's more to make sure you're playing a wide variety of stuff. Don't get tunnel vision!"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "General Timing Goals",
|
||||
"desc": "",
|
||||
"goals": [
|
||||
{
|
||||
"goalID": "Gf3afc4929a494d103185095f7f9bb2853b9c20ea4de66bf3921da63e5b830712",
|
||||
"note": "Use the tierlist to find the easier ones!"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"questID": "dec92ca49bae7fd805102c8836e09680b64971f0"
|
||||
},
|
||||
{
|
||||
"desc": "Good luck, it's only harder from here on. On the bright side, you don't have to play dans anymore. These goals are around 13.0 KtLampRating and 0BPI.",
|
||||
"game": "iidx",
|
||||
"name": "Post-Kaiden I",
|
||||
"playtype": "SP",
|
||||
"questData": [
|
||||
{
|
||||
"title": "Specific Clear Goals",
|
||||
"desc": "",
|
||||
"goals": [
|
||||
{
|
||||
"goalID": "G309ba94b9ef699c805703bcc1852e5662bc9cc30997f8cc8736c6e436820be5a"
|
||||
},
|
||||
{
|
||||
"goalID": "G08ec759ebc5f9559d3ad5a1d8e1c0079b38f40fdd46828ba93e4e9d3db1ba0fa"
|
||||
},
|
||||
{
|
||||
"goalID": "G75f05f32f219df7fd185c5042bb3ea5b7ad20e2f45399fa089674a96a210de11",
|
||||
"note": "Depending on your CN proficiency, this could be way easier."
|
||||
},
|
||||
{
|
||||
"goalID": "G3c17272dc2855aa5ea0e0ee96bdcae1d3c940c33d6dc5cc78c78dba5ddd0622d"
|
||||
},
|
||||
{
|
||||
"goalID": "G6cf560b08e8cd998b81de772b7ae013e8f5be079528db1fd1762c785d3a6f837"
|
||||
},
|
||||
{
|
||||
"goalID": "Gc6a8310d512c3c0a2f56e5039350a903d2d29bc866f6c0878194f57fdec37468"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Specific Timing Goals",
|
||||
"desc": "",
|
||||
"goals": [
|
||||
{
|
||||
"goalID": "G3eedf757708ac87215081499949a4bea21ed18ed0f878ca3d85dcef2234b1d60"
|
||||
},
|
||||
{
|
||||
"goalID": "G36a982fb3b53103e00000d5ae72cd968eb9b94f267e34d7fcf54abdd8ee31cfd",
|
||||
"note": "Don't get nervous, but the ending is the scary bit."
|
||||
},
|
||||
{
|
||||
"goalID": "G16f38b156d78627a574d00ed8720a21bcac5d6ddd235b802e2588903ad75ce07",
|
||||
"note": "what is it then?"
|
||||
},
|
||||
{
|
||||
"goalID": "G4a0d00f6ddb7491c0115a10411eba6a5019d3fe69c459f566a44fc0722ccddba",
|
||||
"note": "Huge milestone for timing ability."
|
||||
},
|
||||
{
|
||||
"goalID": "G35f07fcdaa2da151fc84cfaa9191f7eba8fc148e99d986f8becd937b22461478"
|
||||
},
|
||||
{
|
||||
"goalID": "G2762543ba7088eff22a3b1ff6d355a02400425ac33dc82b09b687a2e2b3c33bc",
|
||||
"note": "This is MAX-60. "
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "General Clear Goals",
|
||||
"desc": "",
|
||||
"goals": [
|
||||
{
|
||||
"goalID": "G29320115c04f85df9a57c16d6919b3c4d2478611348dd70a03976443ca98d4dd",
|
||||
"note": "This isn't actually that hard. It's more to make sure you're playing a wide variety of stuff. Don't get tunnel vision!"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "General Timing Goals",
|
||||
"desc": "",
|
||||
"goals": [
|
||||
{
|
||||
"goalID": "G104639bcdc79b84e6f198cd34cc1719d4e1b35b548a920d6312efdf8f8b88806",
|
||||
"note": "Use the tierlist to find the easier ones!"
|
||||
},
|
||||
{
|
||||
"goalID": "G35f9e219fdf60668867508b928f48cd147ba5f5f04097bf9bf0d70993a9971fb"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"questID": "eff21aac99bdc4429ed6ea2ddfbe3435d09c30dc"
|
||||
},
|
||||
{
|
||||
"desc": "These goals are around 13.2 KtLampRating and 10-20BPI.",
|
||||
"game": "iidx",
|
||||
"name": "Post-Kaiden III",
|
||||
"playtype": "SP",
|
||||
"questData": [
|
||||
{
|
||||
"title": "Specific Clear Goals",
|
||||
"desc": "",
|
||||
"goals": [
|
||||
{
|
||||
"goalID": "Gbacd149fd5b031dd229e87cc686ff3dccbaa6e7aad5821190aa97a4193ddfc31",
|
||||
"note": "At least it's not SAMURAI-Scramble..."
|
||||
},
|
||||
{
|
||||
"goalID": "Gba5ad7f9d804d759b0b859c2c48769abe02539c0884c21916633ea2bf6c06c5a",
|
||||
"note": "At least it's not 疾風迅雷 [L]..."
|
||||
},
|
||||
{
|
||||
"goalID": "G04a620fa063f9532158db346190c943e6ac17564872f8a1b3451f100cd35f637",
|
||||
"note": "Welp."
|
||||
},
|
||||
{
|
||||
"goalID": "G928b54946d75193a1db4a561009b5a3ab7129121c347efbbea85f100094bcdd2",
|
||||
"note": "You know what's messed up? This is the most normal chart in this list."
|
||||
},
|
||||
{
|
||||
"goalID": "G10f34f70a30353e7eb541e01b9667983465d78d26b0a199bf6cef9acf2374e74"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Specific Timing Goals",
|
||||
"desc": "",
|
||||
"goals": [
|
||||
{
|
||||
"goalID": "G213bc0e8ac3417d2ef07b965ef099abbefa04fe413b33bda52bbc50448144cda",
|
||||
"note": "If you can hit it this should be remarkably straightforward."
|
||||
},
|
||||
{
|
||||
"goalID": "G65fd49da69245f2042f415770dbdfab2b0e4821221bb75ac9df97f507e8b1f08"
|
||||
},
|
||||
{
|
||||
"goalID": "G49eaff99d808df0ce1c2ab84833e8ddb128f8f8c438ab54ad779ea9208aa2a3f",
|
||||
"note": "flex those muscles"
|
||||
},
|
||||
{
|
||||
"goalID": "G17f8d5932be1dc5a16beca10ec79693be87bacf4c42b01f7630ca7094ff683d8"
|
||||
},
|
||||
{
|
||||
"goalID": "G9b422b6264f23a43e14f58977ac26ab30feb42d22bf07641d618bfeb546092c1",
|
||||
"note": "Fun Fact: This is the first scratch timing goal in the entire questline. Funner Fact: Some of you will find this the hardest goal here."
|
||||
},
|
||||
{
|
||||
"goalID": "G1cb8a9d389dd5f0aaa7d52abb0d59121a94a565bb4ce412e8338909344f8fd79",
|
||||
"note": "eeeeeeeeeee"
|
||||
},
|
||||
{
|
||||
"goalID": "G193426e3a621f4768504bb100e00ed684e00ddceb169799bb440c1f5dd80f820",
|
||||
"note": "It's back!"
|
||||
},
|
||||
{
|
||||
"goalID": "G95f683e538a1b4aa121752a55c2553a74bd30c2a06aa2d1331419f0a9a51f42a",
|
||||
"note": "(MAX-15) we're all having fun, right?"
|
||||
},
|
||||
{
|
||||
"goalID": "Gbe5d4b3e05f185b18773d276e075ba4718eb02eb2a0b73f09ab71d3fd6c1358b"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "General Clear Goals",
|
||||
"desc": "",
|
||||
"goals": [
|
||||
{
|
||||
"goalID": "G4ed65a10684bc8281e30d72ebbfb31e0683972771778566a348ee4ddf59d1612",
|
||||
"note": "Show mastery."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "General Timing Goals",
|
||||
"desc": "",
|
||||
"goals": [
|
||||
{
|
||||
"goalID": "Ge525b8f85b5da68c09b75f58b0ab104b86c60b1f404604def89f67b52aa2a07d",
|
||||
"note": "I plucked 30% out of thin air. Complain to me on discord."
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"questID": "4cc3b3465fdd02f1c2e0e63344eec0d07c2eed7c"
|
||||
},
|
||||
{
|
||||
"desc": "These goals are around 13.3 KtLampRating and 20-30BPI.",
|
||||
"game": "iidx",
|
||||
"name": "Post-Kaiden IV",
|
||||
"playtype": "SP",
|
||||
"questData": [
|
||||
{
|
||||
"title": "Specific Clear Goals",
|
||||
"desc": "",
|
||||
"goals": [
|
||||
{
|
||||
"goalID": "G583ebbb166ada040a5ab26118d95b6d14965b10223862cc22feb18987ec3e417"
|
||||
},
|
||||
{
|
||||
"goalID": "Gdf49bf791333551b698792802ae6f082dc2f2e9b8c9516e307f4f6221b0392d0"
|
||||
},
|
||||
{
|
||||
"goalID": "G2f0429b33a981444cda23580a06be1f43e2136e91956ab226948d88520a80ff1"
|
||||
},
|
||||
{
|
||||
"goalID": "G5509b5a81cefdc3e5e1f61738fd9fa4c1b02cb3eb4d974c707b7d1252a4113ad",
|
||||
"note": "Veni..."
|
||||
},
|
||||
{
|
||||
"goalID": "G985b9802ff3b6a0d670ad92de7db3f5ac44f8f56ab5654ba79efb1f5f54fb2fc",
|
||||
"note": "...vidi..."
|
||||
},
|
||||
{
|
||||
"goalID": "Ge4b62ba8b2896c00fce77bf29ed756bf52188add5fa2bc3b0426db061a29a6c4",
|
||||
"note": "...vici."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Specific Timing Goals",
|
||||
"desc": "",
|
||||
"goals": [
|
||||
{
|
||||
"goalID": "G2903acfccb8f099626342e58cbf0e212aea83e0ac87c6ba8e38fdc265d2829c9"
|
||||
},
|
||||
{
|
||||
"goalID": "G3f8689001f29d808a1611c35462f62f661337b24c89443c5a92d038e479a1e68",
|
||||
"note": "habbening"
|
||||
},
|
||||
{
|
||||
"goalID": "G421d5e17fd9bc4980b2e493ad2ac61e06cbea80e0fe96875bcfc508b1e3bd8a4"
|
||||
},
|
||||
{
|
||||
"goalID": "G891d47c9a01ca7aac100f2a0fb74661138d0e2cfbfa7ba0da037d59b6e035a33",
|
||||
"note": "le fast jacks have appeared"
|
||||
},
|
||||
{
|
||||
"goalID": "G223f55faaf36ba721074e2b3375519562a9f8470b975324c996077a5755875d8"
|
||||
},
|
||||
{
|
||||
"goalID": "Ga80d64b4b8cc748984f3d65f83cc8334711c47443e2abba1ea59270decdd8ab1"
|
||||
},
|
||||
{
|
||||
"goalID": "G17a6da212d87a3cf87efc46dd25a821ee301663172ac9e91142f5671908f377b",
|
||||
"note": "And it wont be the last time you play this chart!"
|
||||
},
|
||||
{
|
||||
"goalID": "G3a7d606ae07db1088c19a9c70bcc8d5fe4506fd0de0ddbe694f22cb436f8d9b9",
|
||||
"note": "welp."
|
||||
},
|
||||
{
|
||||
"goalID": "G723c0e84bc15714335c9582dd3e7821842a89ea5f90bff055daf2a20fbbfc539"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "General Clear Goals",
|
||||
"desc": "",
|
||||
"goals": [
|
||||
{
|
||||
"goalID": "Gcb184f515f8bd6b20eae7eef38efe72f09d43ec1cceebbd42ac7c37d1f766fbd",
|
||||
"note": "To be honest, if you can hard clear the other things in this quest, this'll happen naturally."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "General Timing Goals",
|
||||
"desc": "",
|
||||
"goals": [
|
||||
{
|
||||
"goalID": "G5bd7588891bccd9d03bc5f76b894316a2605a4ea32f769b1a7df35f5fdddd4e1",
|
||||
"note": "Better get working on it!"
|
||||
},
|
||||
{
|
||||
"goalID": "G3c1543f42198284cddab993ed3e89613a5e5a9545b54714829913114ecfb03b5"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"questID": "fba16fe77f11905a39f5f2134b28dad2d149c18f"
|
||||
},
|
||||
{
|
||||
"desc": "This is the end of the line, for now. Good luck.",
|
||||
"game": "iidx",
|
||||
"name": "Post-Kaiden VI",
|
||||
"playtype": "SP",
|
||||
"questData": [
|
||||
{
|
||||
"title": "Specific Clear Goals",
|
||||
"desc": "",
|
||||
"goals": [
|
||||
{
|
||||
"goalID": "G0dd0a061b24cf543792bc6df8e072f57171a32511ac95871610f2a4aae025808"
|
||||
},
|
||||
{
|
||||
"goalID": "G0ea1a66e8af507c52370a9a23b2e31a8b92e9094d87b24a13e3d0349af105e84",
|
||||
"note": "EX-VENI..."
|
||||
},
|
||||
{
|
||||
"goalID": "Gc1741e461b755d34e9c95e0ffb07f58404fd40926015c43e3b9eda2cdd70d252",
|
||||
"note": "...EX-VIDI..."
|
||||
},
|
||||
{
|
||||
"goalID": "Gf22db09848edccdf484a8e7bc86414cdbf36e78004fb1fffe88ffe5ad10165e8",
|
||||
"note": "...EX-VICI."
|
||||
},
|
||||
{
|
||||
"goalID": "Gbe7c8b7de120c68ecc4ad62ab616a7f73ad2fde574308d125a728c57680d3b3e",
|
||||
"note": "I'm skeptical of putting any FULL COMBO goals in quests, but this seemed thematically appropriate."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Specific Timing Goals",
|
||||
"desc": "",
|
||||
"goals": [
|
||||
{
|
||||
"goalID": "Gde38896c606b0585e96ff21616e0a4bfadc338acf554e618d41f9a9fc33e57e4",
|
||||
"note": "Hope you're not tired of this chart!"
|
||||
},
|
||||
{
|
||||
"goalID": "Gd6e61546b5957a2dddd8a67cab0f8fd81bd58e2c1a0c4580052a470821a73257"
|
||||
},
|
||||
{
|
||||
"goalID": "G140d69d5f063f5c1374a89b9a2cfc230f71a4f2aac2bff34186346f89c8d4d06",
|
||||
"note": "I hope you've been practicing!"
|
||||
},
|
||||
{
|
||||
"goalID": "Gf5efcedc1ff4074ac7f250144ce48408beb61033baf7543f144df52ad40df2a4"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "General Clear Goals",
|
||||
"desc": "That's all! You've got the all-HC. Play BMS.",
|
||||
"goals": []
|
||||
},
|
||||
{
|
||||
"title": "General Timing Goals",
|
||||
"desc": "",
|
||||
"goals": [
|
||||
{
|
||||
"goalID": "Gac6fee7c3554f11dd40725889969648b1a26a014022c7ba52b9e34e717ba0195",
|
||||
"note": "Leave no stone unturned."
|
||||
},
|
||||
{
|
||||
"goalID": "G12beea1bc937115e33631e8eb71acd6926dac4b04325cf3da9115062302464f6",
|
||||
"note": "(Ok, you can leave some stones unturned.)"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"questID": "496b195a80a46156627c14d36aa939dc9d67b36f"
|
||||
},
|
||||
{
|
||||
"desc": "These goals are around 13.5 KtLampRating and 30-50BPI.",
|
||||
"game": "iidx",
|
||||
"name": "Post-Kaiden V",
|
||||
"playtype": "SP",
|
||||
"questData": [
|
||||
{
|
||||
"title": "Specific Clear Goals",
|
||||
"desc": "",
|
||||
"goals": [
|
||||
{
|
||||
"goalID": "Gd770c9c0687473c3fca80f6f8f1c435e683dba30ea7f95770b6c5e53d92ff8bd"
|
||||
},
|
||||
{
|
||||
"goalID": "G73b8d71a7b5e60f846e58af8393b6d1919240ce314894663d13415bbc43b59e4",
|
||||
"note": "Hope you've been playing BMS!"
|
||||
},
|
||||
{
|
||||
"goalID": "G53d98a6a8599562e877a14c063f6d30b58e2c5688651a738cde4c45dbbebb579"
|
||||
},
|
||||
{
|
||||
"goalID": "G220c1d0061f79a8b00fc173b2225f2005e754868d4de55f5d94db29692909fc8",
|
||||
"note": "This is stupid. There's not much else in the game at this point though. Have fun!"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Specific Timing Goals",
|
||||
"desc": "",
|
||||
"goals": [
|
||||
{
|
||||
"goalID": "G1ed429454468835596b0a19fb69fcd5a7d12437672e05966d7a6c44db24517e0",
|
||||
"note": "Congratulations if you get this far. This is huge."
|
||||
},
|
||||
{
|
||||
"goalID": "G53f3e650dbba5580c114e2a48042171e91c60c0a8b7b98e7a1af8bb5ae046da6"
|
||||
},
|
||||
{
|
||||
"goalID": "Ga228c6b215dcf91af11ee4710e96e105387e29cf5e1990cd9e94a1b1bccfca6a"
|
||||
},
|
||||
{
|
||||
"goalID": "G8ac206ea81144d524a1e5c33e3e552beb7471b194f3308e47bbcd09e13cc5c6b"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "General Clear Goals",
|
||||
"desc": "That's all! You've got the all-HC. Play BMS.",
|
||||
"goals": []
|
||||
},
|
||||
{
|
||||
"title": "General Timing Goals",
|
||||
"desc": "",
|
||||
"goals": [
|
||||
{
|
||||
"goalID": "G16de948ebb0c125d575cafc03f2a1cf66389edfe21a756a018162c5985edc51c"
|
||||
},
|
||||
{
|
||||
"goalID": "G542b3aa58ca288f20a3cb56ab70b8c39936c3cbb841b77a89437184c30531fdb"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"questID": "fc3c2836e30cab42c8604ede7436b8e2f92f2a13"
|
||||
},
|
||||
{
|
||||
"desc": "These goals are aimed at players roughly between Chuuden and Kaiden.",
|
||||
"game": "iidx",
|
||||
"name": "Approaching Kaiden",
|
||||
"playtype": "SP",
|
||||
"questData": [
|
||||
{
|
||||
"title": "Specific Clear Goals",
|
||||
"desc": "",
|
||||
"goals": [
|
||||
{
|
||||
"goalID": "Gc36cd646ca44e072738eda25a9bd5dfaa96646ca7502f2f3b311beb37e81c2b6",
|
||||
"note": "BAD"
|
||||
},
|
||||
{
|
||||
"goalID": "G6cd32322170187ad657685a13b01103248a10ac229b3468f054aaeca747dcc47",
|
||||
"note": "MEN"
|
||||
},
|
||||
{
|
||||
"goalID": "G67a054178c34bee552152d968cf05abff9af1b8e09e415570f5267303de18561",
|
||||
"note": "QUEL"
|
||||
},
|
||||
{
|
||||
"goalID": "Gd42d0e628b4c0dbd7e6ebf7410d32d16b85d95ac6e5c7d94e0deae668c4b4380",
|
||||
"note": "TEN"
|
||||
},
|
||||
{
|
||||
"goalID": "G2dd3389b4157d3a4551f43c0c45d9c519b8bc93fa927c2f3412f334bc5b19ce9",
|
||||
"note": "HAE. Badmenqueltenhae!"
|
||||
},
|
||||
{
|
||||
"goalID": "Gd0e1308bde6a5945befb8ceb8f128a51bec23bc8434c8c86daf443b572c7824f",
|
||||
"note": "Don't lose focus for a second at the end. If you're good at scratching, you'll find the notes the hardest part of this chart!"
|
||||
},
|
||||
{
|
||||
"goalID": "G4b4b1166f68816a954dae2170978205ec178894f49ca17d40caaa94117e633a9",
|
||||
"note": "This is honestly more than enough scratch power to get through BSB."
|
||||
},
|
||||
{
|
||||
"goalID": "G045e652f3fd5ad8f587d43217517f5722ff428094589f3dc33e37e0c36cece39",
|
||||
"note": "Huh? This is a secret trick: Play this chart until you can full combo it **without floating**. Congrats, you're now good enough to get through Mei!"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Specific Timing Goals",
|
||||
"desc": "",
|
||||
"goals": [
|
||||
{
|
||||
"goalID": "G3868194e08fcee70f561c28e91845effac4f61eef31e7b748b00fc02f4a19c3b",
|
||||
"note": "It's the easiest 12 to AAA. Good luck!"
|
||||
},
|
||||
{
|
||||
"goalID": "G1d6ebdedee6185eb08a6bcbcb12a604bcad5eea5f8c585d9d26c01cd39031b13"
|
||||
},
|
||||
{
|
||||
"goalID": "G528446c5607084431ea70dd799d2da982faccc8e115bcf8aab20428ef9b05be3",
|
||||
"note": "Watch out for the subtle BPM change!"
|
||||
},
|
||||
{
|
||||
"goalID": "G7660c6abd4fb3bc2452d49df9dd9448b7270215de746f2adfa4e925b67191fd0"
|
||||
},
|
||||
{
|
||||
"goalID": "G48fb74cd7294822bf6faf102c12a319739dac3b044f5a9769f81a58bedf08814",
|
||||
"note": "warning: song slaps"
|
||||
},
|
||||
{
|
||||
"goalID": "G489a4f93beb8c60d9754be05df3f0f334e2281064c4bb01307076ef3536c163a"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "General Clear Goals",
|
||||
"desc": "",
|
||||
"goals": [
|
||||
{
|
||||
"goalID": "Ge144e1928be9ce454699d7230cecb8a97d610d2894a7f77b1c0cf7dad56c9714",
|
||||
"note": "Not as hard as it sounds. This should encorage you to play a wide variety of stuff!"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "General Timing Goals",
|
||||
"desc": "",
|
||||
"goals": [
|
||||
{
|
||||
"goalID": "Gc6fae0d887270e21c67d20fbd5db50f8c24c115effd233c687d7c59f6feff265"
|
||||
},
|
||||
{
|
||||
"goalID": "Gffb740d2e0344df26a4d8d3fa936e31207c290c7bfc8387e3698137ab9e0726c",
|
||||
"note": "This isn't as hard as it sounds. Find some charts you're good at in the folder and focus hard on timing in your warmups!"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"questID": "ad98165639ea879151d7ef8799aaf3d196bee6b5"
|
||||
},
|
||||
{
|
||||
"desc": "These goals are aimed at players roughly between 10th Dan and Chuuden.",
|
||||
"game": "iidx",
|
||||
"name": "Approaching Chuuden",
|
||||
"playtype": "SP",
|
||||
"questData": [
|
||||
{
|
||||
"title": "Specific Clear Goals",
|
||||
"desc": "",
|
||||
"goals": [
|
||||
{
|
||||
"goalID": "Gde97674cd535f89d1cd73293c9ae5dcf3c13ba844f614b752ee2aa43f5e1532f",
|
||||
"note": "Won't be the last time you see this chart. The intro is the hardest bit! Power through it."
|
||||
},
|
||||
{
|
||||
"goalID": "G1a2ae738966c073fd83661cd44de134195eb2171b5f9a23cd9de8fdacfad1fb0",
|
||||
"note": "Don't get filtered by the jacks."
|
||||
},
|
||||
{
|
||||
"goalID": "G25c92c1f8961d5887c9c462641fee3733117cd4ff0c579887b6277da825f47f8",
|
||||
"note": "go fast. go hard."
|
||||
},
|
||||
{
|
||||
"goalID": "G76b421184aff629a7cc062e60c579146d0d5b4454ceeb9d7dd3e56844066d480",
|
||||
"note": "Make sure your scratching is up to... scratch. Heh."
|
||||
},
|
||||
{
|
||||
"goalID": "G5db368bcdf7c6bbf7fdc04e3afc573f4e3e0b86ec8c5b8a9545a32f9c1510659",
|
||||
"note": "it's worth getting good at janky stuff. it only gets more janky from here..."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Specific Timing Goals",
|
||||
"desc": "",
|
||||
"goals": [
|
||||
{
|
||||
"goalID": "Ga628861faaf636eaeadb4f8348719cdc7c432a1d8bc4f6bf17439565aa7fafa8"
|
||||
},
|
||||
{
|
||||
"goalID": "G291fa5f2e28da0544a9f3a457677714a266186caf7f0eaf64162d7c551aef4fb"
|
||||
},
|
||||
{
|
||||
"goalID": "G0b377588fa6c31472a7207123d759879f92ca047db0110c96479de2255a69350",
|
||||
"note": "You might prefer nonran for this."
|
||||
},
|
||||
{
|
||||
"goalID": "G3c27708736385f0389268325675de1079dbf3e7380ac50444561c75cbede9708"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "General Clear Goals",
|
||||
"desc": "",
|
||||
"goals": [
|
||||
{
|
||||
"goalID": "G422f6fcc8a3f73c1fbbafbd118d8df50f2bab274037b2f947c0938dab4f4db02",
|
||||
"note": "Use the tierlist to pluck out the easier ones. You'll be pushing 12C's. Make sure to play a variety of stuff!"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "General Timing Goals",
|
||||
"desc": "",
|
||||
"goals": [
|
||||
{
|
||||
"goalID": "Gb772449aeed60af88481317d3142144cabbf2a4c60b96243299c04c5ff184d70",
|
||||
"note": "There's a bunch of easy contenders for this, but you'll need to build up the ability to time 16ths well. Good luck!"
|
||||
},
|
||||
{
|
||||
"goalID": "G3c6c4f5d0ec2ea922a7b29fc017a0a7ba830f5a1e4fcc4f5be68b42d68dfc23e"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"questID": "b4d52224375a7d9010c1171a89aa10038383b1ae"
|
||||
},
|
||||
{
|
||||
"desc": "These goals are aimed at players roughly between 9th and 10th Dan.",
|
||||
"game": "iidx",
|
||||
"name": "Approaching 10th Dan",
|
||||
"playtype": "SP",
|
||||
"questData": [
|
||||
{
|
||||
"title": "Specific Clear Goals",
|
||||
"desc": "",
|
||||
"goals": [
|
||||
{
|
||||
"goalID": "Ga9de767754b2b9320949f3a9b57b17b7fc502de57857d089f6b94b15ba13649d"
|
||||
},
|
||||
{
|
||||
"goalID": "G2dcef4cab3dfad94bc1bfff207243fa26d4c23f4453b061e9b61d5e5368bb15e"
|
||||
},
|
||||
{
|
||||
"goalID": "G8af34fa5d40b5273b77763838606c5d7c8288d1ba12ea77596783c80b22fecce"
|
||||
},
|
||||
{
|
||||
"goalID": "G1abe46c0cd2620e78977688aea147cc06270d027e48d49a9766935141c341220"
|
||||
},
|
||||
{
|
||||
"goalID": "G7b8615d1efb89539e673cc3491d6a66f883cfae44264dbeac5775e222b2b495b",
|
||||
"note": "(ok, let's go)"
|
||||
},
|
||||
{
|
||||
"goalID": "Gc6bcbde716d58bd81f8bdb7bc2a7c33b6084ab933837ee01da3092e9c0d2900d",
|
||||
"note": "The stream is brutal. Hold yourself through it and recover afterwards."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Specific Timing Goals",
|
||||
"desc": "",
|
||||
"goals": [
|
||||
{
|
||||
"goalID": "G02009ddce4f507f4a0135d3c82bd1c82b6f78e44bdfc55316014943451ec6f96"
|
||||
},
|
||||
{
|
||||
"goalID": "Gfceaa0ce05372836f20a818fc424ad603524a844c506bb84e256e394cd693bda"
|
||||
},
|
||||
{
|
||||
"goalID": "G72cd75373c2c1bc0260c4796c50f4250aa177f10ffda4bec09e9e95c7902dbe3"
|
||||
},
|
||||
{
|
||||
"goalID": "Geb3d34194c0c16417d7ef47d6852976264787bab347b8e1cd96f3c3e5a748927",
|
||||
"note": "Hey, it's not 8ths!"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "General Clear Goals",
|
||||
"desc": "",
|
||||
"goals": [
|
||||
{
|
||||
"goalID": "Gc358218d7967c35ad2a76f09055426412a22bea509d0db0dae1f34b33714a051",
|
||||
"note": "Use the tierlist to find the easier charts. Make sure you're playing a wide variety of stuff!"
|
||||
},
|
||||
{
|
||||
"goalID": "G59bdcf8a9874c0209046cdf2f0d14f171249b829da7d1bfe0ed90d8a11cec1c0",
|
||||
"note": "Keep the HARD CLEARs up, they're useful for training your consistency!"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "General Timing Goals",
|
||||
"desc": "",
|
||||
"goals": [
|
||||
{
|
||||
"goalID": "G494945da02e2718318a0884d4a940e50eedace0127820c2f61275576b84d1a0c"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"questID": "b8c80d5d5f2bc84c59ccd3bbb7fb063839c4ca08"
|
||||
},
|
||||
{
|
||||
"desc": "These goals are aimed at players roughly between 8th and 9th Dan. Simultaneously, you'll be breaking into 12s around this time. Good luck!",
|
||||
"game": "iidx",
|
||||
"name": "Approaching 9th Dan",
|
||||
"playtype": "SP",
|
||||
"questData": [
|
||||
{
|
||||
"title": "Specific Clear Goals",
|
||||
"desc": "",
|
||||
"goals": [
|
||||
{
|
||||
"goalID": "G750c6011e0dc0e95215cf2fa00c3d38fbeb46ca22b93b8558234eaf9caed6c00",
|
||||
"note": "It's time to really get good at chordstreams."
|
||||
},
|
||||
{
|
||||
"goalID": "G187781b42d220c0e2cc3b2180f4f277fdee721c7372ae8ad0dcf8a4e36dfaf58",
|
||||
"note": "The scratches are much, much slower than you think."
|
||||
},
|
||||
{
|
||||
"goalID": "Gd04342eac2113aee1ae97a038c2aa1a4afffdcef86f7fee7ecd15777b0293f43",
|
||||
"note": "Arguably the least infuriating \"easy 12\". No gimmicks, no nonsense, just density."
|
||||
},
|
||||
{
|
||||
"goalID": "Ged23213f8125a89e1e4a1bd2e60616e2dc691b746d036800627c356506202c90"
|
||||
},
|
||||
{
|
||||
"goalID": "G911dd951a0cfe755e42ceb25532fe518afed5bcb2c2db30801e09b71b8f7f356"
|
||||
},
|
||||
{
|
||||
"goalID": "G7f42cf226c3ec4eeafedd06655ddc36ac48dc91ea18df1f73c20b4a5e694ab3f",
|
||||
"note": "Pick up one of these brutal 11s on your way to pushing early 12s."
|
||||
},
|
||||
{
|
||||
"goalID": "G307f2c8ae08f2807075efb9ce5cffd1f1b3cf9abddc7441731898e0c984bfd72"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Specific Timing Goals",
|
||||
"desc": "",
|
||||
"goals": [
|
||||
{
|
||||
"goalID": "G9228d1ffe5cff125fd444270cb54b3f137ba33dea275e1c879489770ab999059"
|
||||
},
|
||||
{
|
||||
"goalID": "G3d0655ab19d3992687fddd1b78c01a9a6711f8e15a7316e5df0f1af80b644700"
|
||||
},
|
||||
{
|
||||
"goalID": "G59f31c1e5be23fd92944e3c95deaf112e3b409f1595dc01aa7621a0f203f5980"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "General Clear Goals",
|
||||
"desc": "",
|
||||
"goals": [
|
||||
{
|
||||
"goalID": "G191ae15a484958fa1f55ac9ba087bcccfdba4eab9465223466ecbed8965369b7",
|
||||
"note": "Use the tierlist to break into 12s and pick up the (relatively) easier ones!"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "General Timing Goals",
|
||||
"desc": "",
|
||||
"goals": [
|
||||
{
|
||||
"goalID": "Ga969ef50f627363db7140d98bd478af284cde9eceb5b547184eb14c8594ae84c",
|
||||
"note": "Pick up some AAAs to work on your timing. Some 9s are far easier to time than others, so try and snag those!"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"questID": "7f01dd4bb78537a37f0d06456c9153f960b1ab1c"
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,95 @@
|
||||
import { Command } from "commander";
|
||||
import { CreateGoalID, CreateQuestID, MutateCollection } from "../util";
|
||||
import fs from "fs";
|
||||
import { QuestDocument, GoalDocument } from "tachi-common";
|
||||
|
||||
const program = new Command();
|
||||
program.option("-f, --file <quests.json>");
|
||||
|
||||
program.parse(process.argv);
|
||||
const options = program.opts();
|
||||
|
||||
// stolen from client/serc/types/tachi.ts
|
||||
type RawQuestDocument = Omit<QuestDocument, "questData" | "questID"> & {
|
||||
rawQuestData: Array<RawQuestSection>;
|
||||
};
|
||||
|
||||
type RawQuestSection = {
|
||||
title: string;
|
||||
desc: string;
|
||||
rawGoals: Array<RawQuestGoal>;
|
||||
};
|
||||
|
||||
type RawQuestGoal = {
|
||||
goal: Pick<GoalDocument, "criteria" | "charts" | "name">;
|
||||
note?: string;
|
||||
};
|
||||
|
||||
const data = JSON.parse(fs.readFileSync(options.file, "utf-8")) as Array<RawQuestDocument>;
|
||||
|
||||
const newGoals: Array<GoalDocument> = [];
|
||||
|
||||
function HydrateQuest(raw: RawQuestDocument): QuestDocument {
|
||||
const questData: QuestDocument["questData"] = [];
|
||||
|
||||
const { game, playtype } = raw;
|
||||
|
||||
for (const rawQuest of raw.rawQuestData) {
|
||||
const goals: Array<{ goalID: string; note?: string }> = [];
|
||||
|
||||
for (const rawGoal of rawQuest.rawGoals) {
|
||||
const goalID = CreateGoalID(rawGoal.goal.charts, rawGoal.goal.criteria, game, playtype);
|
||||
|
||||
const newGoal: GoalDocument = {
|
||||
charts: rawGoal.goal.charts,
|
||||
criteria: rawGoal.goal.criteria,
|
||||
game,
|
||||
playtype,
|
||||
goalID,
|
||||
name: rawGoal.goal.name,
|
||||
} as GoalDocument;
|
||||
|
||||
newGoals.push(newGoal);
|
||||
|
||||
goals.push({
|
||||
goalID,
|
||||
note: rawGoal.note,
|
||||
});
|
||||
}
|
||||
|
||||
questData.push({
|
||||
title: rawQuest.title,
|
||||
desc: rawQuest.desc,
|
||||
goals,
|
||||
});
|
||||
}
|
||||
|
||||
return {
|
||||
desc: raw.desc,
|
||||
name: raw.name,
|
||||
game,
|
||||
playtype,
|
||||
// just 20 random bytes. can't think of much more creative at the moment.
|
||||
questID: CreateQuestID(),
|
||||
questData,
|
||||
};
|
||||
}
|
||||
|
||||
const newQuests = data.map(HydrateQuest);
|
||||
|
||||
MutateCollection("quests.json", (quests) => [...quests, ...newQuests]);
|
||||
|
||||
MutateCollection("goals.json", (goals) => {
|
||||
// don't duplicate goals
|
||||
const goalIDs = new Set(goals.map((e) => e.goalID));
|
||||
|
||||
for (const goal of newGoals) {
|
||||
if (goalIDs.has(goal.goalID)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
goals.push(goal);
|
||||
}
|
||||
|
||||
return goals;
|
||||
});
|
||||
@@ -53,6 +53,10 @@ function CreateChartID() {
|
||||
return crypto.randomBytes(20).toString("hex");
|
||||
}
|
||||
|
||||
function CreateQuestID() {
|
||||
return crypto.randomBytes(20).toString("hex");
|
||||
}
|
||||
|
||||
// this api sucks, maybe dont use it
|
||||
function CreateFolderID(query, game, playtype) {
|
||||
return `F${fjsh.hash(Object.assign({ game, playtype }, query), "SHA256")}`;
|
||||
@@ -62,6 +66,10 @@ function CreateFolderIDFromFolder(folder) {
|
||||
return CreateFolderID(folder.data, folder.game, folder.playtype);
|
||||
}
|
||||
|
||||
function CreateGoalID(charts, criteria, game, playtype) {
|
||||
return `G${fjsh.hash({ charts, criteria, game, playtype }, "sha256")}`;
|
||||
}
|
||||
|
||||
// quick inplace deepmerge hack
|
||||
// probably doesn't work for arrays, i don't care though.
|
||||
function EfficientInPlaceDeepmerge(ref, apply) {
|
||||
@@ -96,4 +104,6 @@ module.exports = {
|
||||
EfficientInPlaceDeepmerge,
|
||||
GetFreshSongIDGenerator,
|
||||
CreateFolderIDFromFolder,
|
||||
CreateGoalID,
|
||||
CreateQuestID,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user