feat(sanctuary): rendre les coffres et lits Backroom trouvables #149

Merged
koka merged 2 commits from feature/backroom-visible-loot into main 2026-09-02 12:52:54 +00:00
8 changed files with 116 additions and 62 deletions
+8
View File
@@ -6,6 +6,14 @@ Ce journal suit les **versions du modpack**. Lorsqu'un seul module change, sa ve
- Depuis `26.2.0-alpha.6`, le pack et les modules ont des versions indépendantes. I Like To Move It et Only Fun deviennent les cinquième et sixième modules actifs dans l'alpha 46.
- Les versions ci-dessous ont été reconstituées à partir des JAR archivés, des packs locaux et du code source actuel. Les dates n'étant pas enregistrées de manière fiable, elles ne sont pas inventées.
## Non publié
Module modifié : **Sanctuary `0.0.0-alpha.137`**.
- garantit sur chaque niveau de la Backroom un coffre par cellule de 3 × 3 chunks dans les nouveaux chunks, au lieu dun coffre aléatoire réparti entre les cinq niveaux ;
- resserre aussi la grille des lits de sortie de 10 × 10 à 3 × 3 chunks sur chacun des cinq niveaux afin quils soient réellement trouvables ;
- ne change ni le butin ordinaire des coffres, ni les données Sanctuary v15, ni le protocole réseau 24 ; les nouveaux coffres et lits apparaissent dans les chunks qui nont pas encore été générés.
## `26.2.0-alpha.230`
Modules modifiés : **Sanctuary `0.0.0-alpha.136`** et **Red-Stoner `0.0.0-alpha.17`**.
+32 -31
View File
@@ -2916,7 +2916,7 @@ tasks.register("verifyNotchEncounter") {
def textureHash = MessageDigest.getInstance("SHA-256").digest(texture.bytes).encodeHex().toString()
if (rootProject.itsalive_version != "0.0.0-alpha.38"
|| rootProject.ouch_version != "0.0.0-alpha.11"
|| rootProject.sanctuary_version != "0.0.0-alpha.136"
|| rootProject.sanctuary_version != "0.0.0-alpha.137"
|| rootProject.masterkey_version != "0.0.0-alpha.9"
|| rootProject.pack_version != "26.2.0-alpha.230"
|| manifests.itsalive.custom?.sanctuary26?.data_version != 4
@@ -3010,7 +3010,7 @@ tasks.register("verifyMagicCarpet") {
if (rootProject.pack_version != "26.2.0-alpha.230"
|| rootProject.iliketomoveit_version != "0.0.0-alpha.18"
|| rootProject.onlyfun_version != "0.0.0-alpha.27"
|| rootProject.sanctuary_version != "0.0.0-alpha.136"
|| rootProject.sanctuary_version != "0.0.0-alpha.137"
|| manifests.iliketomoveit.custom?.sanctuary26?.data_version != 4
|| manifests.iliketomoveit.custom?.sanctuary26?.network_protocol != 5
|| manifests.iliketomoveit.depends?.sanctuary != ">=0.0.0-alpha.127"
@@ -3641,7 +3641,7 @@ tasks.register("verifyProgressivePauseMenuRelease") {
"sanctuary/src/main/resources/assets/sanctuary/lang/${locale}.json"))]
}
if (rootProject.pack_version != "26.2.0-alpha.230"
|| rootProject.sanctuary_version != "0.0.0-alpha.136"
|| rootProject.sanctuary_version != "0.0.0-alpha.137"
|| rootProject.onlyfun_version != "0.0.0-alpha.27"
|| release.pack_version != rootProject.pack_version || index.versionId != rootProject.pack_version
|| migration.source?.modules != [sanctuary: "0.0.0-alpha.108", onlyfun: "0.0.0-alpha.17"]
@@ -4240,7 +4240,7 @@ project(":redstoner") {
"sanctuary/src/main/resources/assets/sanctuary/lang/${it}.json"))
}
if (rootProject.redstoner_version != "0.0.0-alpha.17"
|| rootProject.sanctuary_version != "0.0.0-alpha.136"
|| rootProject.sanctuary_version != "0.0.0-alpha.137"
|| redstonerManifest.custom?.sanctuary26?.data_version != 4
|| redstonerManifest.custom?.sanctuary26?.network_protocol != 7
|| sanctuaryManifest.custom?.sanctuary26?.data_version != 15
@@ -4576,7 +4576,7 @@ tasks.register("verifyShopPricingLayoutRelease") {
def index = new JsonSlurper().parse(file("pack/prism/modrinth.index.json"))
if (rootProject.pack_version != "26.2.0-alpha.230"
|| rootProject.onlyfun_version != "0.0.0-alpha.27"
|| rootProject.sanctuary_version != "0.0.0-alpha.136"
|| rootProject.sanctuary_version != "0.0.0-alpha.137"
|| release.pack_version != rootProject.pack_version || index.versionId != rootProject.pack_version
|| migration.source?.pack_version != "26.2.0-alpha.192"
|| migration.target?.pack_version != "26.2.0-alpha.193"
@@ -4670,7 +4670,7 @@ tasks.register("verifyShopCsvBossGatesRelease") {
def offerCatalog = file("sanctuary/src/main/java/fr/koka99cab/sanctuary26/sanctuary/shop/ShopOfferCatalog.java").text
if (rootProject.pack_version != "26.2.0-alpha.230"
|| rootProject.onlyfun_version != "0.0.0-alpha.27"
|| rootProject.sanctuary_version != "0.0.0-alpha.136"
|| rootProject.sanctuary_version != "0.0.0-alpha.137"
|| release.pack_version != rootProject.pack_version || index.versionId != rootProject.pack_version
|| migration.source?.pack_version != "26.2.0-alpha.194"
|| migration.source?.modules != [onlyfun: "0.0.0-alpha.18", sanctuary: "0.0.0-alpha.110"]
@@ -4763,7 +4763,7 @@ tasks.register("verifyQuestRequestsCauldronBatchesRelease") {
def sanctuaryManifest = new JsonSlurper().parse(file("sanctuary/src/main/resources/fabric.mod.json"))
if (rootProject.pack_version != "26.2.0-alpha.230"
|| rootProject.itsalive_version != "0.0.0-alpha.38"
|| rootProject.sanctuary_version != "0.0.0-alpha.136"
|| rootProject.sanctuary_version != "0.0.0-alpha.137"
|| migration.source?.pack_version != "26.2.0-alpha.196"
|| migration.target?.pack_version != "26.2.0-alpha.197"
|| migration.target?.modules != [itsalive: "0.0.0-alpha.29", sanctuary: "0.0.0-alpha.113"]
@@ -4863,7 +4863,7 @@ tasks.register("verifyQuestRequestContractsRelease") {
def sanctuaryManifest = new JsonSlurper().parse(file("sanctuary/src/main/resources/fabric.mod.json"))
if (rootProject.pack_version != "26.2.0-alpha.230"
|| rootProject.itsalive_version != "0.0.0-alpha.38"
|| rootProject.sanctuary_version != "0.0.0-alpha.136"
|| rootProject.sanctuary_version != "0.0.0-alpha.137"
|| migration.source?.pack_version != "26.2.0-alpha.198"
|| migration.source?.modules?.sanctuary != "0.0.0-alpha.114"
|| migration.target?.pack_version != "26.2.0-alpha.199"
@@ -4983,7 +4983,7 @@ tasks.register("verifyQuestRequestEscrowRelease") {
def packwizIndex = file("pack/packwiz/index.toml").text
def sanctuaryManifest = new JsonSlurper().parse(file("sanctuary/src/main/resources/fabric.mod.json"))
if (rootProject.pack_version != "26.2.0-alpha.230"
|| rootProject.sanctuary_version != "0.0.0-alpha.136"
|| rootProject.sanctuary_version != "0.0.0-alpha.137"
|| migration.source?.pack_version != "26.2.0-alpha.200"
|| migration.source?.modules?.sanctuary != "0.0.0-alpha.115"
|| migration.target?.pack_version != "26.2.0-alpha.201"
@@ -5040,7 +5040,7 @@ tasks.register("verifyWaystoneShopCulinaryAlpha202Release") {
|| rootProject.anotherworld_version != "0.0.0-alpha.57"
|| rootProject.itsalive_version != "0.0.0-alpha.38"
|| rootProject.iliketomoveit_version != "0.0.0-alpha.18"
|| rootProject.sanctuary_version != "0.0.0-alpha.136"
|| rootProject.sanctuary_version != "0.0.0-alpha.137"
|| migration.source?.pack_version != "26.2.0-alpha.201"
|| migration.source?.modules != [
itsalive: "0.0.0-alpha.30",
@@ -5198,7 +5198,7 @@ tasks.register("verifySafeVaultFeature") {
}.keySet()
if (rootProject.pack_version != "26.2.0-alpha.230"
|| rootProject.anotherworld_version != "0.0.0-alpha.57"
|| rootProject.sanctuary_version != "0.0.0-alpha.136"
|| rootProject.sanctuary_version != "0.0.0-alpha.137"
|| migration.schema_version != 1
|| migration.source?.pack_version != "26.2.0-alpha.201"
|| migration.target?.pack_version != "26.2.0-alpha.202"
@@ -6058,7 +6058,7 @@ tasks.register("verifyAlpha210Release") {
it.path == "mods/jei-26.2-fabric-30.29.0.199.jar"
}
if (rootProject.pack_version != "26.2.0-alpha.230"
|| rootProject.sanctuary_version != "0.0.0-alpha.136"
|| rootProject.sanctuary_version != "0.0.0-alpha.137"
|| rootProject.onlyfun_version != "0.0.0-alpha.27"
|| rootProject.iliketomoveit_version != "0.0.0-alpha.18"
|| rootProject.itsalive_version != "0.0.0-alpha.38"
@@ -6160,7 +6160,7 @@ tasks.register("verifyAlpha211Release") {
itsalive: "0.0.0-alpha.38",
ouch: "0.0.0-alpha.11",
masterkey: "0.0.0-alpha.9"]
def workspaceModules = currentModules + [sanctuary: "0.0.0-alpha.136"]
def workspaceModules = currentModules + [sanctuary: "0.0.0-alpha.137"]
def expectedDataVersions = [ambiance: 2, itsalive: 3, onlyfun: 2, ouch: 1, sanctuary: 11]
def workspaceDataVersions = [ambiance: 2, itsalive: 4, onlyfun: 2, ouch: 1, sanctuary: 15]
def expectedProtocols = [ambiance: 6, itsalive: 4, onlyfun: 3, ouch: 1, sanctuary: 22]
@@ -6260,7 +6260,7 @@ tasks.register("verifyAlpha212Release") {
it.path == "mods/jei-26.2-fabric-30.29.0.199.jar"
}
if (rootProject.pack_version != "26.2.0-alpha.230"
|| rootProject.sanctuary_version != "0.0.0-alpha.136"
|| rootProject.sanctuary_version != "0.0.0-alpha.137"
|| migration.source?.pack_version != "26.2.0-alpha.211"
|| migration.source?.modules != [sanctuary: "0.0.0-alpha.119"]
|| migration.target?.pack_version != "26.2.0-alpha.212"
@@ -6759,7 +6759,7 @@ tasks.register("verifyAlpha218Release") {
}
|| rootProject.onlyfun_version != "0.0.0-alpha.27"
|| rootProject.iliketomoveit_version != "0.0.0-alpha.18"
|| rootProject.sanctuary_version != "0.0.0-alpha.136"
|| rootProject.sanctuary_version != "0.0.0-alpha.137"
|| migration.source?.pack_version != "26.2.0-alpha.217"
|| migration.source?.modules != sourceModules
|| migration.target?.pack_version != "26.2.0-alpha.218"
@@ -6845,7 +6845,7 @@ tasks.register("verifyAlpha219Release") {
ambiance: "0.0.0-alpha.22", sanctuary: "0.0.0-alpha.136",
iliketomoveit: "0.0.0-alpha.18", onlyfun: "0.0.0-alpha.27",
itsalive: "0.0.0-alpha.38", ouch: "0.0.0-alpha.11", masterkey: "0.0.0-alpha.9"]
def workspaceModules = currentModules + [sanctuary: "0.0.0-alpha.136"]
def workspaceModules = currentModules + [sanctuary: "0.0.0-alpha.137"]
def requiredJars = currentModules.collect { id, version ->
"file = \"mods/${id}-${version}.jar\""
}
@@ -7170,7 +7170,7 @@ tasks.register("verifyAlpha222Release") {
}
if (rootProject.pack_version != "26.2.0-alpha.230"
|| rootProject.redstoner_version != "0.0.0-alpha.17"
|| rootProject.sanctuary_version != "0.0.0-alpha.136"
|| rootProject.sanctuary_version != "0.0.0-alpha.137"
|| migration.source?.pack_version != "26.2.0-alpha.221"
|| migration.source?.modules != [
redstoner: "0.0.0-alpha.12", sanctuary: "0.0.0-alpha.122"]
@@ -7382,7 +7382,7 @@ tasks.register("verifyAlpha223Release") {
it.path == "mods/jei-26.2-fabric-30.29.0.199.jar"
}
if (rootProject.pack_version != "26.2.0-alpha.230"
|| rootProject.sanctuary_version != "0.0.0-alpha.136"
|| rootProject.sanctuary_version != "0.0.0-alpha.137"
|| migration.source?.pack_version != "26.2.0-alpha.222"
|| migration.source?.modules != [sanctuary: "0.0.0-alpha.124"]
|| migration.target?.pack_version != "26.2.0-alpha.223"
@@ -7503,7 +7503,7 @@ tasks.register("verifyAlpha224Release") {
def currentModules = targetModules + [
itsalive: "0.0.0-alpha.38", iliketomoveit: "0.0.0-alpha.18",
onlyfun: "0.0.0-alpha.27", sanctuary: "0.0.0-alpha.136"]
def workspaceModules = currentModules + [sanctuary: "0.0.0-alpha.136"]
def workspaceModules = currentModules + [sanctuary: "0.0.0-alpha.137"]
def inventorySort = file(
"sanctuary/src/main/java/fr/koka99cab/sanctuary26/sanctuary/gameplay/SanctuaryInventorySort.java").text
def clientProgress = file(
@@ -7625,11 +7625,11 @@ tasks.register("verifyAlpha225Release") {
sanctuary: "0.0.0-alpha.129"]
def currentModules = targetModules + [sanctuary: "0.0.0-alpha.136"]
def currentWorkspaceModules = currentModules + [
anotherworld: "0.0.0-alpha.57", sanctuary: "0.0.0-alpha.136"]
anotherworld: "0.0.0-alpha.57", sanctuary: "0.0.0-alpha.137"]
def workspaceModules = moduleIds.collectEntries { id ->
[(id): project(":${id}").version.toString()]
}
def releasedModules = workspaceModules
def releasedModules = workspaceModules + [sanctuary: "0.0.0-alpha.136"]
def requiredJars = releasedModules.collect { id, version ->
"file = \"mods/${id}-${version}.jar\""
}
@@ -7789,12 +7789,12 @@ tasks.register("verifyAlpha226Release") {
def workspaceModules = moduleIds.collectEntries { id ->
[(id): project(":${id}").version.toString()]
}
def releasedModules = workspaceModules
def releasedModules = workspaceModules + [sanctuary: "0.0.0-alpha.136"]
def requiredJars = releasedModules.collect { id, version ->
"file = \"mods/${id}-${version}.jar\""
}
if (rootProject.pack_version != "26.2.0-alpha.230"
|| rootProject.sanctuary_version != "0.0.0-alpha.136"
|| rootProject.sanctuary_version != "0.0.0-alpha.137"
|| migration.status != "released"
|| migration.source?.pack_version != "26.2.0-alpha.225"
|| migration.source?.modules != [sanctuary: "0.0.0-alpha.129"]
@@ -7880,13 +7880,13 @@ tasks.register("verifyAlpha227Release") {
def workspaceModules = moduleIds.collectEntries { id ->
[(id): project(":${id}").version.toString()]
}
def releasedModules = workspaceModules
def releasedModules = workspaceModules + [sanctuary: "0.0.0-alpha.136"]
def requiredJars = releasedModules.collect { id, version ->
"file = \"mods/${id}-${version}.jar\""
}
if (rootProject.pack_version != "26.2.0-alpha.230"
|| rootProject.anotherworld_version != "0.0.0-alpha.57"
|| rootProject.sanctuary_version != "0.0.0-alpha.136"
|| rootProject.sanctuary_version != "0.0.0-alpha.137"
|| migration.status != "released"
|| migration.source?.pack_version != "26.2.0-alpha.226"
|| migration.source?.modules != [
@@ -7978,13 +7978,13 @@ tasks.register("verifyAlpha228Release") {
def workspaceModules = moduleIds.collectEntries { id ->
[(id): project(":${id}").version.toString()]
}
def releasedModules = workspaceModules
def releasedModules = workspaceModules + [sanctuary: "0.0.0-alpha.136"]
def requiredJars = releasedModules.collect { id, version ->
"file = \"mods/${id}-${version}.jar\""
}
if (rootProject.pack_version != "26.2.0-alpha.230"
|| rootProject.redstoner_version != "0.0.0-alpha.17"
|| rootProject.sanctuary_version != "0.0.0-alpha.136"
|| rootProject.sanctuary_version != "0.0.0-alpha.137"
|| migration.status != "released"
|| migration.source?.pack_version != "26.2.0-alpha.227"
|| migration.source?.modules != [
@@ -8083,7 +8083,7 @@ tasks.register("verifyAlpha229Release") {
def workspaceModules = moduleIds.collectEntries { id ->
[(id): project(":${id}").version.toString()]
}
def releasedModules = workspaceModules
def releasedModules = workspaceModules + [sanctuary: "0.0.0-alpha.136"]
def requiredJars = releasedModules.collect { id, version ->
"file = \"mods/${id}-${version}.jar\""
}
@@ -8094,7 +8094,7 @@ tasks.register("verifyAlpha229Release") {
"screen.redstoner.storage_terminal.sort.count_descending"]
if (rootProject.pack_version != "26.2.0-alpha.230"
|| rootProject.redstoner_version != "0.0.0-alpha.17"
|| rootProject.sanctuary_version != "0.0.0-alpha.136"
|| rootProject.sanctuary_version != "0.0.0-alpha.137"
|| migration.status != "released"
|| migration.source?.pack_version != "26.2.0-alpha.228"
|| migration.source?.modules != [redstoner: "0.0.0-alpha.15"]
@@ -8171,13 +8171,14 @@ tasks.register("verifyAlpha230Release") {
def workspaceModules = moduleIds.collectEntries { id ->
[(id): project(":${id}").version.toString()]
}
def requiredJars = workspaceModules.collect { id, version ->
def releasedModules = workspaceModules + [sanctuary: "0.0.0-alpha.136"]
def requiredJars = releasedModules.collect { id, version ->
"file = \"mods/${id}-${version}.jar\""
}
def indexHash = java.security.MessageDigest.getInstance("SHA-256")
.digest(packwizIndexFile.bytes).encodeHex().toString()
if (rootProject.pack_version != "26.2.0-alpha.230"
|| rootProject.sanctuary_version != "0.0.0-alpha.136"
|| rootProject.sanctuary_version != "0.0.0-alpha.137"
|| rootProject.redstoner_version != "0.0.0-alpha.17"
|| migration.schema_version != 1
|| migration.status != "released"
+1 -1
View File
@@ -28,7 +28,7 @@ iliketomoveit_version=0.0.0-alpha.18
iliketomoveit_lifecycle=active
onlyfun_version=0.0.0-alpha.27
onlyfun_lifecycle=active
sanctuary_version=0.0.0-alpha.136
sanctuary_version=0.0.0-alpha.137
sanctuary_lifecycle=active
pack_version=26.2.0-alpha.230
maven_group=fr.koka99cab.sanctuary26
+4 -3
View File
@@ -35,6 +35,7 @@ réelle matérialisée reçoit un identifiant persistant : elle peut passer du r
Une perte associée à un joueur lui reste réservée pendant 24 000 ticks avant de pouvoir rejoindre
les tirages historiques partagés ; une perte sans propriétaire est immédiatement partagée.
Chaque niveau génère exactement un coffre par cellule de 3 × 3 chunks dans les nouveaux chunks.
Tous les coffres vanilla de la Backroom, générés ou posés, deviennent des nœuds de butin renouvelés
toutes les 12 000 ticks lors de leur prochaine ouverture. Le renouvellement rend au registre les
objets perdus non pris, efface le contenu ordinaire et produit le plus souvent du vide ou des
@@ -75,9 +76,9 @@ numérotés de haut en bas afin quune chute fasse toujours avancer vers le ni
Les ouvertures entre deux niveaux sont calculées une seule fois puis appliquées à la fois au sol
supérieur et au plafond inférieur : une chute annoncée ne débouche donc pas sur un bloc fermé. Les
imperfections, morceaux suspendus et raccords volontairement cassés font partie de lesthétique,
mais les portes des couloirs restent traversables. Les lits de sortie restent rares, mais chacun
des cinq niveaux en génère exactement un par cellule de 10 × 10 chunks, sur un plancher praticable
propre à sa zone. Il nest donc plus nécessaire de remonter jusquaux Archives pour ressortir.
mais les portes des couloirs restent traversables. Chacun des cinq niveaux génère exactement un lit
de sortie par cellule de 3 × 3 chunks, sur un plancher praticable propre à sa zone. Il nest donc
plus nécessaire de parcourir une centaine de chunks ou de remonter jusquaux Archives pour ressortir.
La Backroom ne possède ni ciel, ni soleil, ni lune, ni étoiles, ni lumière ambiante. Son biome ne
déclare aucune créature et le serveur retire aussi toute entité de catégorie monstre qui y serait
+17 -15
View File
@@ -207,7 +207,7 @@ tasks.register("verifyBlackMarket") {
def questData = file("src/main/java/fr/koka99cab/sanctuary26/sanctuary/shop/QuestBoardData.java").text
def quests = file("src/main/java/fr/koka99cab/sanctuary26/sanctuary/shop/QuestBoardService.java").text
def inventoryView = file("src/main/java/fr/koka99cab/sanctuary26/sanctuary/api/inventory/SanctuaryPlayerInventoryView.java").text
if (project.version.toString() != "0.0.0-alpha.136"
if (project.version.toString() != "0.0.0-alpha.137"
|| !data.contains('SAVE_KEY = "black_market"') || !data.contains("DATA_VERSION = 2")
|| !data.contains("ItemStack.CODEC.fieldOf(\"item\")") || !data.contains("replaceListing")
|| !service.contains("LISTING_FEE_RUBIES = 1") || !service.contains("COMMISSION_PERCENT = 5")
@@ -2923,7 +2923,7 @@ tasks.register("verifyShopCurrencyRowsRelease") {
"src/main/java/fr/koka99cab/sanctuary26/sanctuary/shop/BlackMarketService.java").text
def shop = file(
"src/main/java/fr/koka99cab/sanctuary26/sanctuary/shop/ShopService.java").text
if (project.version.toString() != "0.0.0-alpha.136"
if (project.version.toString() != "0.0.0-alpha.137"
|| migration.target?.modules?.sanctuary != "0.0.0-alpha.117"
|| migration.shop_currency_inventory?.all_unlocked_rows_counted != true
|| migration.shop_currency_inventory?.overflow_rows_counted != true
@@ -3089,7 +3089,7 @@ tasks.register("verifyProgressivePauseMenu") {
"pack/migrations/26.2.0-alpha.190-progressive-pause-menu-to-alpha.191.json"))
def pauseMenu = file("src/main/java/fr/koka99cab/sanctuary26/sanctuary/mixin/client/PauseScreenMixin.java").text
def costs = file("src/main/java/fr/koka99cab/sanctuary26/sanctuary/progression/SanctuaryProgressionCosts.java").text
if (project.version.toString() != "0.0.0-alpha.136"
if (project.version.toString() != "0.0.0-alpha.137"
|| migration.target?.pack_version != "26.2.0-alpha.191"
|| migration.target?.modules?.sanctuary != "0.0.0-alpha.109"
|| migration.pause_menu?.progression_full_width != true
@@ -3127,7 +3127,7 @@ tasks.register("verifyShopPricingLayout") {
"pack/migrations/26.2.0-alpha.192-shop-pricing-layout-to-alpha.193.json"))
def screen = file("src/main/java/fr/koka99cab/sanctuary26/sanctuary/client/SanctuaryShopScreen.java").text
def progression = file("src/main/java/fr/koka99cab/sanctuary26/sanctuary/shop/ShopProgression.java").text
if (project.version.toString() != "0.0.0-alpha.136"
if (project.version.toString() != "0.0.0-alpha.137"
|| migration.target?.modules?.sanctuary != "0.0.0-alpha.110"
|| migration.shop_layout?.locked_offer_buttons != 6
|| migration.shop_layout?.button_slots != [4, 5, 6, 7, 8, 9]
@@ -3158,7 +3158,7 @@ tasks.register("verifyShopCsvBossGates") {
"pack/migrations/26.2.0-alpha.194-shop-csv-boss-gates-to-alpha.195.json"))
def provider = file("src/main/java/fr/koka99cab/sanctuary26/sanctuary/shop/ShopCatalogProvider.java").text
def catalog = file("src/main/java/fr/koka99cab/sanctuary26/sanctuary/shop/ShopOfferCatalog.java").text
if (project.version.toString() != "0.0.0-alpha.136"
if (project.version.toString() != "0.0.0-alpha.137"
|| migration.target?.pack_version != "26.2.0-alpha.195"
|| migration.target?.modules?.sanctuary != "0.0.0-alpha.111"
|| migration.compatibility?.sanctuary_data_version != 11
@@ -3189,7 +3189,7 @@ tasks.register("verifyDeliveryBoxOrientation") {
def blockstate = new JsonSlurper().parse(
file("src/main/resources/assets/sanctuary/blockstates/delivery_box.json"))
def expectedVariants = ["facing=north", "facing=east", "facing=south", "facing=west"].toSet()
if (project.version.toString() != "0.0.0-alpha.136"
if (project.version.toString() != "0.0.0-alpha.137"
|| migration.target?.modules?.sanctuary != "0.0.0-alpha.112"
|| migration.mailbox?.id != "sanctuary:delivery_box"
|| migration.mailbox?.horizontal_facing != true
@@ -3217,7 +3217,7 @@ tasks.register("verifyInventoryShiftClick") {
def mixin = file("src/main/java/fr/koka99cab/sanctuary26/sanctuary/mixin/AbstractContainerMenuMixin.java").text
def screen = file("src/main/java/fr/koka99cab/sanctuary26/sanctuary/mixin/client/AbstractContainerScreenMixin.java").text
def gui = file("INVENTORY_GUI.md").text
if (project.version.toString() != "0.0.0-alpha.136"
if (project.version.toString() != "0.0.0-alpha.137"
|| !transfer.contains("shouldAppendOverflow")
|| !transfer.contains("isVanillaStorageRange")
|| !transfer.contains("hotbarStart")
@@ -3263,7 +3263,7 @@ tasks.register("verifyQuestRequests") {
new JsonSlurper().parse(file("src/main/resources/data/sanctuary/loot_table/blocks/${path}.json"))
.pools[0].entries[0].name
}
if (project.version.toString() != "0.0.0-alpha.136"
if (project.version.toString() != "0.0.0-alpha.137"
|| migration.target?.modules?.sanctuary != "0.0.0-alpha.113"
|| migration.quest_requests?.save_key != "quest_requests"
|| migration.quest_requests?.data_version != 1
@@ -3325,7 +3325,7 @@ tasks.register("verifyQuestRequestContracts") {
def locales = ["fr_fr", "en_us", "ru_ru"].collectEntries { locale ->
[(locale): new JsonSlurper().parse(file("src/main/resources/assets/sanctuary/lang/${locale}.json"))]
}
if (project.version.toString() != "0.0.0-alpha.136"
if (project.version.toString() != "0.0.0-alpha.137"
|| migration.source?.pack_version != "26.2.0-alpha.198"
|| migration.source?.modules?.sanctuary != "0.0.0-alpha.114"
|| migration.target?.pack_version != "26.2.0-alpha.199"
@@ -3394,7 +3394,7 @@ tasks.register("verifyQuestRequestEscrow") {
def locales = ["fr_fr", "en_us", "ru_ru"].collectEntries { locale ->
[(locale): new JsonSlurper().parse(file("src/main/resources/assets/sanctuary/lang/${locale}.json"))]
}
if (project.version.toString() != "0.0.0-alpha.136"
if (project.version.toString() != "0.0.0-alpha.137"
|| migration.source?.pack_version != "26.2.0-alpha.200"
|| migration.source?.modules?.sanctuary != "0.0.0-alpha.115"
|| migration.target?.pack_version != "26.2.0-alpha.201"
@@ -3473,7 +3473,7 @@ tasks.register("verifyCraftableBannerCape") {
def locales = ["fr_fr", "en_us", "ru_ru"].collect {
new JsonSlurper().parse(file("src/main/resources/assets/sanctuary/lang/${it}.json"))
}
if (project.version.toString() != "0.0.0-alpha.136"
if (project.version.toString() != "0.0.0-alpha.137"
|| migration.target?.modules?.sanctuary != "0.0.0-alpha.130"
|| migration.white_cape?.crafting_material_count != 6
|| migration.white_cape?.maximum_pattern_layers != 6
@@ -3525,7 +3525,7 @@ tasks.register("verifyFinalSanctuaryTickets") {
def locales = ["fr_fr", "en_us", "ru_ru"].collect {
new JsonSlurper().parse(file("src/main/resources/assets/sanctuary/lang/${it}.json"))
}
if (project.version.toString() != "0.0.0-alpha.136"
if (project.version.toString() != "0.0.0-alpha.137"
|| !capeRenderer.contains("SHIELD_PATTERN_X_SCALE = 1.2F")
|| !capeRenderer.contains("SHIELD_PATTERN_Y_SCALE = 1.375F")
|| !capeRenderer.contains("model, state, false, appearance.baseColor()")
@@ -3574,7 +3574,7 @@ tasks.register("verifyAlphaIndev") {
def locales = ["fr_fr", "en_us", "ru_ru"].collect {
new JsonSlurper().parse(file("src/main/resources/assets/sanctuary/lang/${it}.json"))
}
if (project.version.toString() != "0.0.0-alpha.136"
if (project.version.toString() != "0.0.0-alpha.137"
|| migration.target?.modules?.sanctuary != "0.0.0-alpha.122"
|| migration.alpha_world?.dimension != "sanctuary:alpha"
|| migration.alpha_world?.legacy_dimension != "portals:alpha"
@@ -3634,7 +3634,7 @@ tasks.register("verifyBackroom") {
def locales = ["fr_fr", "en_us", "ru_ru"].collect {
new JsonSlurper().parse(file("src/main/resources/assets/sanctuary/lang/${it}.json"))
}
if (project.version.toString() != "0.0.0-alpha.136"
if (project.version.toString() != "0.0.0-alpha.137"
|| migration.source_data_version != 13 || migration.target_data_version != 14
|| migration.integration_modules?.anotherworld?.source != "0.0.0-alpha.56"
|| migration.integration_modules?.anotherworld?.target != "0.0.0-alpha.57"
@@ -3660,10 +3660,12 @@ tasks.register("verifyBackroom") {
|| !chest.contains("REFRESH_TICKS = 12_000L") || !chest.contains("ordinal == 3")
|| !architecture.contains("PLAYABLE_RADIUS = 2_000")
|| !architecture.contains("BackroomMaterialApi.anomalyMaterial()")
|| !architecture.contains("placeLootLandmark")
|| !layout.contains("WORLD_MIN_Y = -64") || !layout.contains("WORLD_MAX_Y_EXCLUSIVE = 384")
|| !layout.contains("LEVEL_0(295, 383)") || !layout.contains("LEVEL_4(-64, 27)")
|| !layout.contains("mazeConnected") || !layout.contains("RoomCorner")
|| !layout.contains("EXIT_BED_CELL_SIZE_CHUNKS = 10")
|| !layout.contains("LOOT_CHEST_CELL_SIZE_CHUNKS = 3") || !layout.contains("lootChestChunk")
|| !layout.contains("EXIT_BED_CELL_SIZE_CHUNKS = 3")
|| !layout.contains("exitBedChunk") || !layout.contains("exitBedFloor")
|| !materialApi.contains("registerAnomalyMaterial")
|| locales.any { !it.containsKey("dimension.sanctuary.backroom")
@@ -77,7 +77,7 @@ public final class BackroomArchitectureFeature extends Feature<NoneFeatureConfig
buildCity(level, worldSeed, startX, startZ, chunkX, chunkZ);
buildUtilities(level, worldSeed, startX, startZ);
buildGlitchMaze(level, worldSeed, startX, startZ);
placeLootLandmarks(level, worldSeed, startX, startZ, chunkX, chunkZ, random);
placeLootLandmarks(level, worldSeed, startX, startZ, chunkX, chunkZ);
placeRareAnomaly(level, startX, startZ, random);
return true;
}
@@ -416,14 +416,11 @@ public final class BackroomArchitectureFeature extends Feature<NoneFeatureConfig
}
private static void placeLootLandmarks(WorldGenLevel level, long seed, int x0, int z0,
int chunkX, int chunkZ, Random random) {
if (random.nextInt(5) == 0) {
BackroomLevel zone = BackroomLevel.values()[random.nextInt(BackroomLevel.values().length)];
int floorY = BackroomLayout.exitBedFloor(zone);
int x = x0 + 7, y = floorY + 1, z = z0 + 7;
set(level, x, floorY, z, floorMaterial(zone));
set(level, x, y, z, Blocks.CHEST.defaultBlockState());
set(level, x, y + 1, z, Blocks.AIR.defaultBlockState());
int chunkX, int chunkZ) {
for (BackroomLevel zone : BackroomLevel.values()) {
if (BackroomLayout.lootChestChunk(seed, zone, chunkX, chunkZ)) {
placeLootLandmark(level, zone, x0 + 7, z0 + 7);
}
}
for (BackroomLevel zone : BackroomLevel.values()) {
if (!BackroomLayout.exitBedChunk(seed, zone, chunkX, chunkZ)) continue;
@@ -438,6 +435,16 @@ public final class BackroomArchitectureFeature extends Feature<NoneFeatureConfig
}
}
private static void placeLootLandmark(WorldGenLevel level, BackroomLevel zone, int x, int z) {
int floorY = BackroomLayout.exitBedFloor(zone);
for (int dx = -1; dx <= 1; dx++) for (int dz = -1; dz <= 1; dz++) {
set(level, x + dx, floorY, z + dz, floorMaterial(zone));
for (int dy = 1; dy <= 2; dy++) set(level, x + dx, floorY + dy, z + dz,
Blocks.AIR.defaultBlockState());
}
set(level, x, floorY + 1, z, Blocks.CHEST.defaultBlockState());
}
private static void placeRareAnomaly(WorldGenLevel level, int x0, int z0, Random random) {
if (random.nextInt(96) == 0) {
Block anomaly = BackroomMaterialApi.anomalyMaterial();
@@ -13,7 +13,8 @@ public final class BackroomLayout {
public static final int ROOM_SIZE = 16;
public static final int MAZE_FLOOR_Y = 8;
public static final int MAZE_ROOF_Y = 18;
public static final int EXIT_BED_CELL_SIZE_CHUNKS = 10;
public static final int EXIT_BED_CELL_SIZE_CHUNKS = 3;
public static final int LOOT_CHEST_CELL_SIZE_CHUNKS = 3;
private static final int HOLE_CELL_SIZE = 64;
private BackroomLayout() {}
@@ -91,7 +92,21 @@ public final class BackroomLayout {
return Math.floorMod((int) mix(seed ^ 0x43c2a1769f0e85bdL, chunkX, chunkZ), 11) == 0;
}
/** One deterministic, rare exit-bed chunk per grid cell and per vertical level. */
/** One easy-to-find loot landmark per three-by-three chunk cell and per vertical level. */
public static boolean lootChestChunk(long seed, BackroomLevel level, int chunkX, int chunkZ) {
Objects.requireNonNull(level, "level");
int cellX = Math.floorDiv(chunkX, LOOT_CHEST_CELL_SIZE_CHUNKS);
int cellZ = Math.floorDiv(chunkZ, LOOT_CHEST_CELL_SIZE_CHUNKS);
long hash = mix(seed ^ 0x354c6f3a82d9e107L ^ (long) level.ordinal() * 0x9e3779b97f4a7c15L,
cellX, cellZ);
int targetX = cellX * LOOT_CHEST_CELL_SIZE_CHUNKS
+ Math.floorMod((int) hash, LOOT_CHEST_CELL_SIZE_CHUNKS);
int targetZ = cellZ * LOOT_CHEST_CELL_SIZE_CHUNKS
+ Math.floorMod((int) (hash >>> 32), LOOT_CHEST_CELL_SIZE_CHUNKS);
return chunkX == targetX && chunkZ == targetZ;
}
/** One deterministic exit-bed chunk per three-by-three grid cell and per vertical level. */
public static boolean exitBedChunk(long seed, BackroomLevel level, int chunkX, int chunkZ) {
Objects.requireNonNull(level, "level");
int cellX = Math.floorDiv(chunkX, EXIT_BED_CELL_SIZE_CHUNKS);
@@ -25,6 +25,7 @@ public final class BackroomModelSmoke {
personalRecoveryIsPrioritized();
recentLossesRemainPersonal();
architectureIsDeterministicAndStacked();
lootLandmarksCoverEveryLevel();
exitBedsCoverEveryLevel();
roomCornersReachEveryVariant();
mazeDoorsStayConnected();
@@ -130,6 +131,7 @@ public final class BackroomModelSmoke {
private static void exitBedsCoverEveryLevel() {
long seed = 26_200_133L;
int cellSize = BackroomLayout.EXIT_BED_CELL_SIZE_CHUNKS;
require(cellSize == 3, "Backroom exit beds are no longer spaced three chunks apart");
for (BackroomLevel level : BackroomLevel.values()) {
int floorY = BackroomLayout.exitBedFloor(level);
require(BackroomLayout.levelAt(floorY) == level,
@@ -142,7 +144,25 @@ public final class BackroomModelSmoke {
}
}
require(candidates == 1,
"A Backroom level lost its single rare exit bed in a generation cell: " + level);
"A Backroom level lost its exit bed in a three-by-three chunk cell: " + level);
}
}
}
private static void lootLandmarksCoverEveryLevel() {
long seed = 26_200_137L;
int cellSize = BackroomLayout.LOOT_CHEST_CELL_SIZE_CHUNKS;
require(cellSize == 3, "Backroom loot landmarks are no longer spaced three chunks apart");
for (BackroomLevel level : BackroomLevel.values()) {
for (int cellX = -4; cellX <= 4; cellX++) for (int cellZ = -4; cellZ <= 4; cellZ++) {
int candidates = 0;
for (int chunkX = cellX * cellSize; chunkX < (cellX + 1) * cellSize; chunkX++) {
for (int chunkZ = cellZ * cellSize; chunkZ < (cellZ + 1) * cellSize; chunkZ++) {
if (BackroomLayout.lootChestChunk(seed, level, chunkX, chunkZ)) candidates++;
}
}
require(candidates == 1,
"A Backroom level lost its loot landmark in a three-by-three chunk cell: " + level);
}
}
}