diff --git a/tests/run.lua b/tests/run.lua index 39d85e0..a682cc7 100644 --- a/tests/run.lua +++ b/tests/run.lua @@ -14747,6 +14747,179 @@ local order = { "gameScavengeCorpseCarvesTheMatchingHerbAndClearsTheCorpse", "gameScavengeCorpseFailsWithoutACorpseUnderfoot", "gameScavengeCorpseFailsOnARottenCorpse", + "gameScavengeCorpseFailsForASpeciesWithNoKnownHerb", + "reanimationFieldsSurviveSerialization", + "herbItemsSurviveSerialization", + "potionOfFortificationAppliesAShield", "usingAFortifyPotionAppliesShieldAndConsumesIt", + "potionOfLevitationAppliesTheLevitateStatus", "usingAPotionOfLevitationAppliesLevitateAndConsumesIt", + "companionSummonPlacesItAdjacentToThePlayer", "companionSummonRejectsAnUnknownSpecies", + "companionSummonReplacesAnEarlierBond", "companionAttacksAdjacentHostileMonsterAndCanKillIt", + "companionAttacksADiagonallyAdjacentHostileMonsterJustLikeACardinalOne", + "companionAdvancesOnAVisibleMonsterItCannotYetReach", "companionIgnoresAMonsterBeyondItsSightRadius", + "companionActBlindedCompanionOnlyDetectsAnAdjacentHostileNotOneWithinItsSightRadius", + "companionActAttackingAnAdjacentMonsterEmitsNoiseThatCanStirADormantBystander", + "companionFollowsThePlayerWhenNoMonsterIsVisible", + "companionActConfusedCompanionSometimesStumblesInsteadOfFightingAnAdjacentHostile", + "companionActConfusedCompanionNeverAttacksThePlayerEvenIfTheStumbleAimsAtItsCell", + "hearthSpriteMendsThePlayerWhenIdle", + "useItemOnACharmBondsACompanionAndConsumesIt", "takeMonsterTurnRoutesACompanionThroughCompanionsAct", + "gameTakeMonsterTurnTicksAnInfectedCompanionsDiseaseExactlyLikeThePlayersOwnEndOfTurnDoes", + "aFallenCompanionIsLoggedAndSweptWithoutAwardingXp", "builderOccasionallyPlacesACharmFromDepthThree", + "charmsStayOffTheShallowestFloors", "companionFieldsSurviveSerialization", + "companionGainXpBelowFirstThresholdBanksXpWithoutEvolving", + "companionGainXpAtFirstThresholdEvolvesRenamesAndGrowsStats", + "companionGainXpCrossingBothThresholdsAtOnceAppliesBothStagesCumulatively", + "companionGainXpNeverReappliesAnAlreadyCrossedStage", + "companionGainXpAtMaxLevelJustBanksFurtherXpWithNoFurtherEvolution", + "companionGainXpIgnoresAZeroOrNegativeAmount", + "companionActCreditsItsOwnKillWithXpOnTopOfThePlayers", + "companionEvolutionBoostsAHearthSpriteHealingOnTopOfItsStaticRate", + "companionLevelXpAndHealBonusSurviveSerialization", + "artifactsCreateBuildsTheCatalogedItemShape", "lifestealWeaponHealsThePlayerOnAHit", + "thornedArmorReflectsDamageBackAtAMeleeAttacker", "thornedArmorCanKillAWeakAttacker", + "thornedArmorRespectsAFireImmuneAttacker", "thornedArmorIsHalvedAgainstAFireResistantAttacker", + "ringOfTheTideRegeneratesHpEachTurn", "piercingBowIgnoresPartOfTargetDefense", + "builderOccasionallyPlacesAnArtifactFromDepthFive", "artifactsStayOffFloorsAboveDepthFive", + "artifactFieldsSurviveSerialization", + "useItemOnAKitPlantsAHiddenTrapOnThePlayersTile", "plantingATrapWhereOneAlreadyExistsFails", + "aMonsterSteppingOntoAPlayerSetTrapSpringsIt", + "checkTrapForSkipsAndLeavesUndetectedForALevitatingMonster", + "movePlayerSkipsTheInlineTrapTriggerForALevitatingPlayer", + "aLethalTrapKillsAWeakMonsterAndCreditsThePlayer", + "aTeleportTrapRelocatesTheMonsterThatSpringsIt", "builderOccasionallyPlacesATrapKitFromDepthTwo", + "kitsStayOffTheEntranceFloor", "plantedTrapFieldsSurviveSerialization", + "bossCreateBuildsAFreshUnenragedBoss", "bossAtFullHealthDoesNotEnrage", + "bossEnragesOncePastItsHalfHpThresholdAndOnlyOnce", "bossLootMatchesItsCatalogEntry", + "bossOnlyArtifactsAreExcludedFromTheRandomBuilderRoll", + "builderOccasionallyPlacesABossFromDepthSix", "bossesStayOffFloorsAboveDepthSix", + "takeMonsterTurnEnragesABloodiedBossBeforeItsAiActs", + "defeatingABossGrantsBossXpAndDropsItsGuaranteedArtifact", "bossFieldsSurviveSerialization", + "questGenerateProducesACullBounty", "questGenerateProducesAHoardBounty", + "questGenerateProducesADepthBountyClampedToMaxDepth", + "questAcceptBindsThePlayerAndClaimsTheBoard", "questAcceptFailsWhenAlreadyHoldingOne", + "questAcceptFailsOnAnAlreadyClaimedBoard", + "questRegisterKillIncrementsOnlyMatchingSpeciesWhileActive", + "questResolvedDetectsEachKindsCompletion", + "gameResolveQuestPaysOutAndClearsAFulfilledBounty", "gameResolveQuestIsANoOpOnAnUnmetBounty", + "gameTryAcceptQuestBindsAndLogsWhenStandingOnAnUnclaimedBoard", + "autopilotAcceptsAnUnclaimedBountyForFreeWithoutSkippingItsTurn", + "autopilotSkipsAnAlreadyClaimedBoard", "autopilotDoesNotStackASecondBountyWhileOneIsActive", + "questBoardRendersItsGlyphAndFlipsOnceClaimed", "questFieldsSurviveSerialization", + "builderOccasionallyPlacesAQuestBoardFromDepthTwo", "questBoardsStayOffTheEntranceFloor", + "metaFreshStateHasNoRenownRunsOrAchievements", + "metaRenownForScalesWithDepthBossesAndQuestsAndAddsAWinBonus", + "metaRecordRunBanksRenownAndAdvancesTallies", + "metaRecordRunUnlocksMatchingAchievementsOnlyOnce", + "metaPurchaseSpendsRenownAndMarksThePerkOwned", "metaPurchaseFailsWithoutEnoughRenown", + "metaPurchaseFailsForAnAlreadyOwnedPerk", "metaPurchaseFailsForAnUnknownPerk", + "metaApplyAllAppliesEveryOwnedPerkToAFreshPlayer", "metaAppliedPerksLandBeneathAClassDelta", + "metaLoadReturnsFreshStateForAMissingFile", "metaSaveLoadRoundTrip", + "gameAwardKillTracksKillsAndBossKillsForMetaStats", + "gameResolveQuestTracksQuestsCompletedForMetaStats", + "gamePickupTracksArtifactsFoundForMetaStats", "gameDescendTracksDeepestDepthEvenAfterAscending", + "gameMetaStatsFieldsSurviveSerialization", + "resistancesDefaultTierPassesDamageThroughUnchanged", "resistancesResistHalvesAndFloors", + "resistancesWeakAmplifies", "resistancesImmuneZeroesEvenAHugeHit", + "resistancesEquipmentGrantsATierOnTopOfABaseProfile", + "resistancesInnateWeaknessIsMaskedByAResistantItem", + "combatDefenderResistanceHalvesTheFinalBlow", + "combatWeaponElementOverridesPhysicalAndCanBeFullyImmune", + "statusPoisonAndBurningTicksRespectResistance", + "statusPoisonShrugAndRegenKnitMessagesAddressThePlayerInSecondPerson", + "hazardsAfflictAppliesTargetResistance", + "spellMissileAndFireballRespectTargetResistance", "throwingAndRangedDamageRespectResistance", + "equippingCinderplateAndFrostbandGrantsTheirResist", + "disenchantingAnElementalAffixClearsItsDamageType", + "bossBreathDamageTypeMatchesTheMonsterAndCanBeShruggedOff", + "resistFieldsSurviveEntitySerialization", + "factionsTierBoundariesReflectReputationScore", + "factionsAdjustAccumulatesAndClampsToTheHundredBounds", + "factionsRegisterKillSoursOnlyTheFallensFaction", + "factionsRegisterKillPenalizesABossFarMoreThanARegularKill", + "factionsRegisterKillIgnoresAFactionlessTarget", + "factionsPriceMultiplierScalesFromHostileToHonored", + "factionsIsWaryTrueForAFreshGoblinoidAndFalseOnceProvoked", + "factionsIsWaryIsFalseForNonTribalFactionsAndOnceTheTribeGoesHostile", + "factionsAppeaseSpendsGoldAndRaisesReputationOrFailsWithoutFunds", + "factionsAppeaseCostsMoreTheDeeperTheGrudge", + "factionsAppeaseFailsOnceAFactionIsAlreadyMaxedOut", + "factionAndProvokedFieldsSurviveEntitySerialization", + "gameTakeMonsterTurnLeavesAWaryGoblinoidAloneUntilProvoked", + "gamePlayerAttackProvokesAWaryGoblinoidSoItFightsBackNextTurn", + "gameAwardKillSoursFactionReputationWithTheFallensFaction", + "shopBuyIsMarkedUpWhenMerchantsAreHostile", "shopBuyIsDiscountedWhenMerchantsAreHonored", + "shopSellValueRisesWithMerchantStanding", "stealingFromShopAlsoSoursMerchantReputation", + "resolveQuestNudgesMerchantReputationUpward", "gameAppeaseFactionSpendsGoldAndLogsTheOutcome", + "playerReputationSurvivesGameSaveLoadRoundTrip", + "encumbranceItemWeightScalesWithGearPower", "encumbranceAmmoWeightScalesWithStackCount", + "encumbranceCapacityGrowsWithLevel", "encumbranceEquippedGearCountsTowardCarriedWeight", + "encumbranceLightLoadHasNoPenalty", "encumbranceBurdenedSlowsMovementButNotDefense", + "encumbranceOverloadedSlowsMovementAndWeakensDefense", + "gameDropItemReturnsItemToTheFloorAndFreesCapacity", + "gamePickupWarnsWhenNewWeightTipsIntoOverloaded", + "gamePickupWarnsWithALighterMessageWhenOnlyTippingIntoBurdened", + "autopilotDropsCheapestJunkWhenOverloadedAndSafe", + "encumbranceTierIsDerivedAcrossASaveLoadRoundTrip", + "renderPanelShowsCarriedLoad", + "tilesClassifyVolatileTerrain", + "terrainAfflictLavaDoesNothingOffLava", "terrainLavaRespectsFireResistanceAndImmunity", + "terrainAfflictLavaUnharmedMessageAddressesThePlayerInSecondPerson", + "terrainLavaBurnsAndIgnitesAPlayerWhoStepsOnIt", "terrainLavaCanKillAWeakMonsterAndCreditsThePlayer", + "terrainChasmDropsThePlayerToTheFloorBelowWithFallDamage", + "terrainChasmSwallowsAMonsterAndCreditsTheKill", + "terrainIceSlidesATravellerUntilSomethingStopsIt", "terrainIceSlideStopsBeforeAWall", + "terrainIceSlideStopsAtAnOccupiedCell", + "checkTerrainForSkipsLavaDamageAndIgnitionForALevitatingPlayer", + "checkTerrainForSkipsTheChasmFallForALevitatingPlayer", + "checkTerrainForSkipsTheIceSlideForALevitatingPlayer", + "checkTerrainForSkipsLavaForALevitatingMonsterToo", + "terrainGlyphsSurviveMapSerialization", + "chasmFallFieldsSurviveGameSaveLoad", "lavaChasmAndIceStayOffTheShallowFloors", + "builderOccasionallyPlacesLavaChasmAndIceFromDepthFour", "chasmNeverAppearsOnTheFinalFloor", + "eliteNeverPromotesBelowMinDepth", "eliteEligibleExcludesBossesAndTheShopkeeper", + "eliteArmoredAffixAddsFlatDefenseAndPrefixesTheName", + "eliteChampionTierAtDeepDepthRollsTwoDistinctAffixes", "eliteFieldsSurviveSerialization", + "monstersCreateNeverAliasesTheSpeciesCatalogsInnateResistTable", + "builderOccasionallyPromotesAMonsterToEliteFromDepthThree", + "elitesNeverAppearOnTheShallowestTwoFloors", + "eliteVampiricMonsterDrainsHpFromThePlayerOnAMeleeHit", + "eliteChillingMonsterSlowsThePlayerOnAMeleeHit", + "eliteVolatileMonsterExplodesOnDeathDamagingAnAdjacentPlayer", + "eliteVolatileMonsterDoesNotBurstAnythingBeyondItsBlastRadius", + "eliteKillGrantsBonusXpOverThePlainSpeciesReward", + "vaultsPullThrowsALeverAndOpensASingleLeverVaultImmediately", + "vaultsPullOpensTheDoorOnlyOnceEveryLeverIsThrown", + "vaultsTreasureRollsAGuaranteedAffixOnABaseStrongerThanAnyFloorDrop", + "gamePullLeverOpensASingleLeverVaultAndTracksTheStat", + "gamePullLeverOnATwoLeverVaultWaitsForTheSecondPull", + "pullingAnAlreadyThrownLeverAgainDoesNotInflateTheVaultTally", + "movePlayerAutoPullsALeverItStepsOnto", + "vaultDoorBlocksMovementUntilItsLeversOpenIt", + "builderOccasionallyPlacesAVaultFromDepthFive", + "vaultsStayOffFloorsAboveDepthFive", + "builderOnlyEverPlacesASolvableVaultPuzzle", + "vaultFieldsSurviveSerialization", + "gameVaultsOpenedStatSurvivesSaveLoad", + "metaRenownForScalesWithVaultsOpened", + "metaRecordRunUnlocksVaultBreakerOnceAVaultOpens", + "runewordsSocketAppendsToTheChainInOrderAndCapsAtMaxRunes", + "runewordsSocketRefusesAnythingThatIsNotWeaponOrArmor", + "runewordsActiveWordMatchesOnlyAnExactChain", + "runewordsAttackAndDefenseBonusReadTheWielderSGearLive", + "gameSocketRuneAppliesItsRunewordBonusInActualCombat", + "gameSocketRuneFailsOnAnUnknownTargetOrANonRuneItem", + "builderOccasionallyPlacesARuneFromDepthThree", + "runesStayOffTheShallowestTwoFloors", + "runeChainFieldsSurviveSerialization", + "atmosphereHooksAreZeroForAnyConditionTheyDoNotGovern", + "atmosphereFoggyShrinksSightRadiusButNeverBelowOne", + "atmosphereConsecratedRegeneratesThePlayerEachTurn", + "atmosphereConsecratedNeverRegeneratesPastMaxHp", + "builderOccasionallyDrawsEachWeatherConditionFromDepthTwo", + "weatherNeverAppearsOnTheEntranceFloor", + "weatherFieldSurvivesSerialization", + "renderPanelReportsTheFloorSWeatherWhenPresent", + "biomesForDepthCyclesThroughTheCatalogInOrder", "biomesDescribeNamesTheBiomeAndItsAmbientText", } for _, name in ipairs(order) do