Public Access
Complete Milestone 6 acceptance and runtime cleanup (#74)
Build / build (push) Canceled after 0s
Build / build (push) Canceled after 0s
This commit is contained in:
1 parent
44205f80e0
commit
c2c2d7a6f8
9 files changed
+155
-19
No files matched your search
@@ -289,8 +289,9 @@ public final class AgeBlockInstability {
|
||||
|
||||
public static AgeInstabilityPlan effectivePlan(ServerLevel level, AgeDefinition age) {
|
||||
int blockScore = score(level, age);
|
||||
if (blockScore == 0 && RivencraftConfig.instabilityDifficulty() == 2) return age.instabilityPlan();
|
||||
int combined = effectiveScore(level, age);
|
||||
int difficulty = RivencraftConfig.instabilityDifficulty();
|
||||
if (blockScore == 0 && difficulty == 2) return age.instabilityPlan();
|
||||
int combined = difficultyScore((long) age.instability().score() + blockScore, difficulty);
|
||||
AgeInstability effective = new AgeInstability(AgeInstability.CURRENT_VERSION, combined,
|
||||
java.util.List.of(new AgeInstability.Contribution("effective_block_profile", -1, combined,
|
||||
"Saved writing score plus sampled excess blocks")));
|
||||
|
||||
@@ -93,8 +93,9 @@ public final class AgeEnvironmentalProviders {
|
||||
return METEORS.equals(id) || BURNING.equals(id) || EROSION.equals(id);
|
||||
}
|
||||
|
||||
static void tickPlanned(ServerLevel level, AgeDefinition age, long tick) {
|
||||
List<AgeInstabilityPlan.ProviderLevel> cards = AgeBlockInstability.effectivePlan(level, age).providers().stream()
|
||||
static void tickPlanned(ServerLevel level, AgeDefinition age, long tick,
|
||||
List<AgeInstabilityPlan.ProviderLevel> providers) {
|
||||
List<AgeInstabilityPlan.ProviderLevel> cards = providers.stream()
|
||||
.filter(card -> isEnvironmental(card.id())).toList();
|
||||
boolean optInErosion = RivencraftConfig.erosionEnabled()
|
||||
&& AgeBlockInstability.effectiveScore(level, age) >= InstabilityProviderCatalog.Deck.DESTRUCTIVE.entryCost();
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
package net.dnorberg.rivencraft.book;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import net.dnorberg.rivencraft.writing.OrderedWriting;
|
||||
import net.dnorberg.rivencraft.writing.SymbolReference;
|
||||
import net.dnorberg.rivencraft.writing.SymbolSemantics;
|
||||
@@ -44,11 +48,14 @@ public record AgeGenerationPlan(int version, long ageSeed, OrderedWriting writin
|
||||
if (version >= 3 && !symbols.isEmpty() && activeSymbolIndices.isEmpty()) {
|
||||
throw new IllegalArgumentException("Version 3 Age plan has no active symbols");
|
||||
}
|
||||
if (activeSymbolIndices.stream().distinct().count() != activeSymbolIndices.size()) {
|
||||
throw new IllegalArgumentException("Age plan repeats an active symbol index");
|
||||
}
|
||||
Set<Integer> resolvedIndices = new HashSet<>();
|
||||
for (ResolvedSymbol symbol : symbols) resolvedIndices.add(symbol.index());
|
||||
Set<Integer> seenActive = new HashSet<>();
|
||||
for (int index : activeSymbolIndices) {
|
||||
if (symbols.stream().noneMatch(symbol -> symbol.index() == index)) {
|
||||
if (!seenActive.add(index)) {
|
||||
throw new IllegalArgumentException("Age plan repeats an active symbol index");
|
||||
}
|
||||
if (!resolvedIndices.contains(index)) {
|
||||
throw new IllegalArgumentException("Active symbol is not in the saved writing: " + index);
|
||||
}
|
||||
}
|
||||
@@ -107,8 +114,13 @@ public record AgeGenerationPlan(int version, long ageSeed, OrderedWriting writin
|
||||
}
|
||||
|
||||
public List<ResolvedSymbol> activeSymbols() {
|
||||
return activeSymbolIndices.stream().map(index -> symbols.stream()
|
||||
.filter(symbol -> symbol.index() == index).findFirst().orElseThrow()).toList();
|
||||
Map<Integer, ResolvedSymbol> byIndex = new HashMap<>(symbols.size());
|
||||
for (ResolvedSymbol symbol : symbols) byIndex.putIfAbsent(symbol.index(), symbol);
|
||||
return activeSymbolIndices.stream().map(index -> {
|
||||
ResolvedSymbol symbol = byIndex.get(index);
|
||||
if (symbol == null) throw new IllegalStateException("Missing active symbol " + index);
|
||||
return symbol;
|
||||
}).toList();
|
||||
}
|
||||
|
||||
public CompoundTag save() {
|
||||
|
||||
@@ -55,9 +55,10 @@ public final class AgeHazardProviders {
|
||||
}
|
||||
|
||||
/** Roll every selected hazard card each scheduler pass, independently of other providers. */
|
||||
static void tickPlanned(ServerLevel level, AgeDefinition age, long tick) {
|
||||
static void tickPlanned(ServerLevel level, AgeDefinition age, long tick,
|
||||
List<AgeInstabilityPlan.ProviderLevel> providers) {
|
||||
if (!RivencraftConfig.hazardsEnabled()) return;
|
||||
List<AgeInstabilityPlan.ProviderLevel> hazards = AgeBlockInstability.effectivePlan(level, age).providers().stream()
|
||||
List<AgeInstabilityPlan.ProviderLevel> hazards = providers.stream()
|
||||
.filter(provider -> isHazard(provider.id())).toList();
|
||||
if (hazards.isEmpty()) return;
|
||||
List<ChunkPos> chunks = loadedChunksNearPlayers(level, RivencraftConfig.hazardsMaxChunks());
|
||||
|
||||
@@ -55,16 +55,16 @@ public final class AgeInstabilityRuntime {
|
||||
if (!admitted(state.eligible, level.dimension().location(), tick / cooldown,
|
||||
RivencraftConfig.instabilityMaxAges())) return;
|
||||
AgeDefinition age = AgeRegistrySavedData.get(level).findByDimension(level.dimension().location()).orElse(null);
|
||||
if (age == null || AgeBlockInstability.effectivePlan(level, age).providers().isEmpty()
|
||||
|| !AgeInstabilityControls.get(level).enabled(age.id())) return;
|
||||
if (age == null || !AgeInstabilityControls.get(level).enabled(age.id())) return;
|
||||
List<AgeInstabilityPlan.ProviderLevel> providers = AgeBlockInstability.effectivePlan(level, age).providers();
|
||||
if (providers.isEmpty()) return;
|
||||
// Legacy's per-chunk hazards must not wait for the rotating two-provider sample.
|
||||
AgeHazardProviders.tickPlanned(level, age, tick);
|
||||
AgeEnvironmentalProviders.tickPlanned(level, age, tick);
|
||||
AgeHazardProviders.tickPlanned(level, age, tick, providers);
|
||||
AgeEnvironmentalProviders.tickPlanned(level, age, tick, providers);
|
||||
List<ChunkPos> chunks = loadedChunksNearPlayers(level, RivencraftConfig.instabilityMaxChunks());
|
||||
if (chunks.isEmpty()) return;
|
||||
Budget budget = new Budget(RivencraftConfig.instabilityMaxActions());
|
||||
Context context = new Context(level, age, chunks, tick, budget);
|
||||
List<AgeInstabilityPlan.ProviderLevel> providers = AgeBlockInstability.effectivePlan(level, age).providers();
|
||||
int first = (int) Math.floorMod(tick / cooldown + age.seed(), providers.size());
|
||||
int ran = 0;
|
||||
for (int offset = 0; offset < providers.size() && ran < RivencraftConfig.instabilityMaxProviders()
|
||||
|
||||
Reference in new issue
Block a user