Skip to main content

Condenser & Strain

Este documento especifica o sistema de Strain (tensão da Trama) e o Weave Condenser (Condensador de Trama). A base existe no código recuperado, mas seus comportamentos ainda precisam de regressão na build atual.

Visão Geral​

Strain representa o esforço de contenção da Trama quando a rede está sendo usada intensamente. Não é uma punição mecânica, mas uma consequência natural do throughput alto: quanto mais payloads fluem simultaneamente, mais energia é necessária para manter a Trama estável.

Weave Condenser é um bloco opcional que amortiza Strain e oferece benefícios secundários à rede, sempre com trade-offs energéticos.


Strain — Tensão da Trama​

Conceito​

Strain é uma métrica de uso real da rede, não capacidade teórica.

  • Rede ociosa (poucos payloads fluindo) → Strain baixo → Overhead energético mínimo
  • Rede sob carga (throughput alto) → Strain alto → Overhead energético aumenta
  • Rede em colapso (BROWNOUT) → Strain visual aumenta (capacidade reduzida pelo capacityActiveRatio)

Filosofia de design:

  • Strain não pune o jogador por usar a rede
  • Strain reflete realidade física: contenção intensa exige mais energia
  • Strain oferece feedback visual claro sobre estado da rede
  • Condenser amortiza Strain, mas não é obrigatório (player pode resolver com mais geração de energia)

Cálculo de Strain​

Métrica base: Throughput médio nos últimos 30 segundos (600 ticks)

// 1. Somar todas as transferências de todos os payloads
totalThroughput = lastTickItemTransfers +
lastTickEnergyTransfers +
lastTickFluidTransfers +
lastTickRedstoneSignalStrength;

// 2. Calcular média móvel dos últimos 600 ticks
avgThroughput = sum(throughput[últimos 600 ticks]) / 600;

// 3. Calcular capacidade máxima teórica da rede
maxThroughput = channelsTotal × (itemRate + energyRate + fluidRate + redstoneRate);

// 4. Strain final (0.0 → 1.0)
rawStrain = avgThroughput / maxThroughput;

// 5. Aplicar redução de Condensers (se houver)
finalStrain = rawStrain × (1 - 0.15 × effectiveCondenserCount);

Observações importantes:

  • Strain reflete uso REAL, medido tick a tick
  • Janela de 30 segundos suaviza variações bruscas
  • Strain considera capacityActiveRatio automaticamente (throughput cai quando energia cai)
  • Condensers reduzem Strain final (amortização)

Efeito Mecânico: Overhead Energético​

Consumo de standby aumenta proporcionalmente ao Strain:

actualStandbyCost = baseStandbyCost × (1 + finalStrain × 0.20)

Tabela de overhead:

StrainOverhead EnergéticoExemplo (base 1000 FE/t)
0% (ociosa)+0%1000 FE/t
25%+5%1050 FE/t
50%+10%1100 FE/t
75%+15%1150 FE/t
100% (carga máxima)+20%1200 FE/t

Importante:

  • Overhead aplica-se ao standby total da rede (Controller + Ports + Fibers + Condensers)
  • Não afeta throughput (payloads não ficam lentos)
  • Não afeta tempo de reconfiguração
  • Apenas aumenta custo energético para refletir esforço de contenção

Feedback Visual​

Controller & Condensers​

Thresholds visuais:

StrainVisualPartículasDescrição
0-20%Cor natural do tierNenhumaRede em uso leve
20-50%Glow suave (amarelo/laranja)OcasionaisRede em uso moderado
50-80%Glow intenso (laranja/vermelho)FrequentesRede sob carga alta
80-100%Glow pulsante (vermelho intenso)Densas e contínuasRede em carga máxima

Animação especial (Condenser):

  • Condensers "absorvem" partículas da Trama (efeito cosmético)
  • Partículas fluem das Fibers adjacentes para o Condenser
  • Intensidade aumenta com Strain

Fibers​

Opcional (Marco 7 — acabamento visual):

  • Textura levemente avermelhada quando Strain > 70%
  • Transição suave de cor (lerp) baseada em Strain

UI do Controller​

Barra de Strain:

  • Posição: Abaixo da barra de energia
  • Formato: 0-100% com código de cor (verde → amarelo → vermelho)
  • Tooltip: "Strain: 65% — Network under moderate load (+13% energy cost)"

Analytics (Marco 7):

  • Gráfico de throughput médio (últimos 10 segundos)
  • Breakdown por payload (Items, Energy, Fluids, Redstone)

Sinergia com Estados Operacionais​

Strain continua sendo calculado em todos os estados ONLINE:

EstadoStrain Tracking?Comportamento
OFFLINE❌Strain = 0% (sem rede ativa)
BOOTING❌Strain = 0% (inicializando)
ONLINE✅Cálculo normal
RECONFIGURING✅Cálculo normal (rede ainda opera)
BROWNOUT✅Cálculo normal + sinergia visual
COLLAPSE❌Strain reseta para 0%
REBOOT❌Strain reseta para 0%

Sinergia com BROWNOUT:

Quando a rede entra em BROWNOUT:

  1. capacityActiveRatio reduz capacidade efetiva (energia baixa)
  2. Throughput cai proporcionalmente (menos payloads processados)
  3. Mas demanda continua alta (máquinas externas ainda tentam transferir)
  4. Strain aumenta visualmente (throughput/capacidade reduzida = ratio maior)
  5. Rede fica avermelhada (feedback visual perfeito de colapso iminente)

Exemplo:

Rede T3 ONLINE com 80% energia:
→ capacityActiveRatio = 0.8
→ Throughput efetivo = 80% do máximo
→ Se demanda = 100%, Strain aparente aumenta
→ Visual: Glow avermelhado + partículas densas = "rede sufocando"

Design: Strain vira indicador visual de saúde da rede (não apenas carga).


Weave Condenser — Condensador de Trama​

Conceito​

Bloco opcional que condensa a Trama em uma região específica, absorvendo e contendo energia etérea para benefício da rede inteira.

Lore:

  • Condenser "absorve" a Trama em um raio de 16 blocos
  • Trama condensada reduz Strain e melhora estabilidade
  • Múltiplos Condensers próximos competem pela mesma Trama local (eficiência dividida)
  • Condensação exige energia adicional (trade-off)

Filosofia de design:

  • Sempre opcional (rede funciona 100% sem Condenser)
  • Benefícios reais mas não essenciais
  • Trade-off claro: reduz overhead de Strain, mas aumenta standby
  • Requer planejamento espacial (espaçamento de 16+ blocos)

Benefícios​

1. Strain Reduction (Principal)​

Cada Condenser ativo e eficiente reduz Strain global:

finalStrain = rawStrain × (1 - 0.15 × effectiveCondenserCount)

Eficiência por Condenser:

Condensers dividem eficiência quando estão no raio de 16 blocos uns dos outros:

Condensers no raioEficiência individualTotal de redução
1 (sozinho)100%-15% Strain
250% cada-15% Strain
333% cada-15% Strain
4+25% cada-15% Strain

Exemplo prático:

Cenário A: 3 Condensers espaçados (>16 blocos entre si)
Raw Strain: 80%
→ Cada Condenser: 100% eficiência
→ finalStrain = 0.80 × (1 - 0.15×3) = 0.80 × 0.55 = 0.44 (44%)
→ Overhead: 44% × 0.20 = +8.8% consumo (ao invés de +16%)
→ Economia: ~7.2% de energia total

Cenário B: 3 Condensers juntos (<16 blocos)
Raw Strain: 80%
→ Cada Condenser: 33% eficiência (100% / 3)
→ Total efetivo: 1 Condenser equivalente
→ finalStrain = 0.80 × (1 - 0.15×1) = 0.80 × 0.85 = 0.68 (68%)
→ Overhead: 68% × 0.20 = +13.6% consumo
→ Economia: ~2.4% de energia total (ineficiente!)

Conclusão: Espaçamento correto é crítico para eficiência máxima.


2. Buffer Energético Global​

Cada Condenser aumenta buffer total da rede:

bonusBuffer = baseBuffer × 0.05 × effectiveCondenserCount

Limite: Máximo 4 Condensers efetivos (+20% buffer total)

Exemplo:

Rede T3 (base buffer: 500k FE)
→ 2 Condensers espaçados: 500k × 1.10 = 550k FE (+10%)
→ 4 Condensers espaçados: 500k × 1.20 = 600k FE (+20%)

Benefício: Maior resistência a picos de consumo, delay maior antes de BROWNOUT.


3. Tempo de Reconfiguração Reduzido​

Cada Condenser reduz cooldown de reconfiguração:

reconfigTime = baseReconfigTime × (1 - 0.10 × effectiveCondenserCount)

Limite prático: 4 Condensers (-40% tempo)

Exemplo:

Base: 20 ticks (1 segundo)
→ 1 Condenser: 18 ticks
→ 2 Condensers: 16 ticks
→ 4 Condensers: 12 ticks (limite efetivo)

Benefício: Rede reconecta mais rápido após mudanças topológicas (adicionar/remover blocos).


Trade-off: Custo Energético​

Cada Condenser ativo aumenta standby cost:

condenserStandbyCost = portBaseCost × 2.0 × (1 + strain × 0.20)

Custo base: ~2 Ports de standby (dobro de uma Port)

Tabela de custos por tier:

TierPort BaseCondenser BaseCondenser (Strain 50%)Condenser (Strain 100%)
T140 FE/t80 FE/t88 FE/t96 FE/t
T280 FE/t160 FE/t176 FE/t192 FE/t
T3160 FE/t320 FE/t352 FE/t384 FE/t
T4320 FE/t640 FE/t704 FE/t768 FE/t

Design: Condenser custa caro, mas reduz overhead da rede inteira (ROI positivo em redes grandes).


Regras de Topologia​

1. Placement e Remoção (Anti-Duping)​

Placement (Colocação):

  • Condenser só pode ser colocado sobre Weave Fiber existente
  • Quando colocado: Fiber vira Condenser (substitui o bloco no mundo)
  • Não pode ser colocado em:
    • Air (bloco vazio)
    • Blocos normais (stone, dirt, etc.)
    • Outros blocos do mod (Port, Controller, etc.)
    • Nem mesmo com criativo ou commands (previne duping)

Remoção (Removal):

  1. Com Tuning Key (Config mode) + Shift+Right-Click:

    • Drop: Condenser item (1x)
    • Fiber volta ao lugar (reaparece no mundo como Weave Fiber)
    • Remoção não-destrutiva (preserva Fiber)
  2. Quebrar bloco (sem Tuning Key, ou outro método):

    • Drop: Condenser item + Fiber item (2 itens)
    • Bloco removido completamente
    • Player recupera ambos os componentes

Design Philosophy:

  • Condenser é "upgrade in-place" de Fiber (não adiciona nova Fiber ao mundo)
  • Previne duping de Fiber (não cria Fiber do nada)
  • Tuning Key permite remoção estratégica sem perder Fiber no mundo

Exemplo prático:

1. Player tem rede com Fiber:
Controller → Fiber → Fiber → Port

2. Player quer otimizar (adicionar Condenser):
- Right-click com Condenser item na Fiber central
- Fiber vira Condenser no mundo
- Controller → Fiber → Condenser → Port ✅

3. Player quer remover (com Tuning Key):
- Shift+Right-click com Tuning Key (Config mode)
- Drop: Condenser item
- Fiber reaparece: Controller → Fiber → Fiber → Port ✅

4. Player quebra Condenser (sem Tuning Key):
- Drop: Condenser item + Fiber item
- Mundo: Controller → [air] → Port ❌ (rede desconectada!)

2. Continuidade Linear Apenas​

Condenser conecta apenas 2 faces opostas (herda topologia da Fiber original):

  • Eixo de conexão: Determinado pelo facing do bloco
  • 4 faces laterais NÃO conectam (bloqueadas)
  • Se colocado em cruz de Fibers: desconecta 2 lados

Placement:

  • NORTH face (facing property) = oposto à direção do jogador (igual Furnace)
  • Eixo depende de rotação:
    • NORTH/SOUTH → conecta NORTH ↔ SOUTH
    • EAST/WEST → conecta EAST ↔ WEST
    • UP/DOWN → conecta UP ↔ DOWN (se jogador olhar up/down)

Exemplo visual:

Configuração válida (linha reta):
Fiber → Condenser (NORTH-SOUTH axis) → Fiber
✅ ✅ ✅

Configuração inválida (cruz):
Fiber (NORTH) ❌
|
Fiber ← Condenser (EAST-WEST axis) → Fiber
| ✅
Fiber (SOUTH) ❌

Resultado: Apenas EAST ↔ WEST conectam, NORTH/SOUTH desconectam.

Design: Força planejamento intencional (Condenser não é "drop-in replacement" universal).


3. Regra de Eficiência Espacial​

Raio de verificação: 16 blocos (Manhattan distance)

Condensers no mesmo raio dividem eficiência total:

efficiency = 1.0f / Math.min(4, condensersInRadius);

Distância recomendada: 32+ blocos entre Condensers (evita overlap de raios)

Design:

  • Força espaçamento estratégico
  • Lore: Condenser "absorve Trama local" (múltiplos competem pela mesma fonte)
  • Incentiva construção distribuída de Condensers ao longo da rede

Verificação no mundo:

Condensers escaneiam raio de 16 blocos a cada 20 ticks
→ Contam outros Condensers ativos
→ Ajustam eficiência individual
→ UI mostra eficiência atual ("Efficiency: 100%" ou "Efficiency: 50% (1 nearby)")

Estados Operacionais​

Estado da RedeCondenser Ativo?Strain Reduction?Consome Energia?
OFFLINE❌❌❌
BOOTING❌❌❌
ONLINE✅✅✅
RECONFIGURING✅✅✅
BROWNOUT✅✅✅
COLLAPSE❌❌❌
REBOOT❌❌❌

Observação: Condenser funciona em qualquer rede com Controller + Core energizado (T1-T7).


Configuração (Datapack)​

Arquivo: data/weave_network/config/condenser.json

{
"condenser": {
"strain_reduction_per_unit": 0.15,
"buffer_bonus_per_unit": 0.05,
"reconfig_reduction_per_unit": 0.10,
"max_effective_units": 4,
"standby_cost_multiplier": 2.0,
"efficiency_radius": 16
},
"strain": {
"enabled": true,
"measurement_window_ticks": 600,
"max_energy_overhead": 0.20,
"visual_threshold": 0.20
}
}

Parâmetros ajustáveis:

ParâmetroPadrãoDescrição
strain_reduction_per_unit0.15Redução de Strain por Condenser (15%)
buffer_bonus_per_unit0.05Aumento de buffer por Condenser (5%)
reconfig_reduction_per_unit0.10Redução de tempo de reconfig (10%)
max_effective_units4Limite de Condensers efetivos
standby_cost_multiplier2.0Custo base do Condenser (2× Port)
efficiency_radius16Raio de competição entre Condensers
measurement_window_ticks600Janela de medição de Strain (30s)
max_energy_overhead0.20Overhead máximo de energia (20%)
visual_threshold0.20Strain mínimo para efeitos visuais (20%)

Craft​

Resultado: 1× Weave Condenser

Materiais (placeholder — definir durante a progressão jogável):

  • 1× Weave Core (qualquer tier)
  • 4× Weave Matrix
  • 2× Redstone Block
  • 2× Quartz Block

Observação: Recipe via Loom ou Crafting Table (a definir).


Casos de Uso​

Cenário 1: Early Game (T1-T2)​

Situação: Rede pequena (8-12 Ports), uso moderado.

Strain típico: 20-40% (overhead +4-8%)

Condenser?

  • ❌ Não recomendado
  • Custo de Condenser (80-160 FE/t) > economia de overhead
  • Melhor investir energia em expandir geração

Cenário 2: Mid Game (T3)​

Situação: Rede média (20-30 Ports), uso alto (automação de processamento).

Strain típico: 50-70% (overhead +10-14%)

Condenser?

  • ✅ Recomendado (1-2 unidades)
  • Reduz Strain para ~35-55% (overhead +7-11%)
  • Economia: ~3-4% do consumo total
  • Benefício adicional: +5-10% buffer (amortece picos)

Cenário 3: Late Game (T4 + Singularities)​

Situação: Rede grande (50+ Ports), throughput máximo (múltiplos canais ativos).

Strain típico: 80-100% (overhead +16-20%)

Condenser?

  • ✅✅ Altamente recomendado (3-4 unidades espaçadas)
  • Reduz Strain para ~35-55% (overhead +7-11%)
  • Economia: ~9-12% do consumo total (milhares de FE/t)
  • Benefícios:
    • +15-20% buffer (previne BROWNOUT)
    • -30-40% tempo de reconfig (QoL para mudanças)
    • Rede visualmente mais "estável" (menos partículas)

Implementação Técnica​

WeaveGraph (core)​

public class WeaveGraph {
// Strain tracking
private final RingBuffer<Integer> throughputHistory = new RingBuffer<>(600);
private float currentStrain = 0.0f;
private int effectiveCondenserCount = 0;

/**
* Atualiza strain baseado em throughput médio dos últimos 30s.
* Chamado a cada tick quando estado = ONLINE, RECONFIGURING ou BROWNOUT.
*/
public void updateStrain() {
// 1. Somar todas as transferências
int totalTransfers = lastTickItemTransfers +
lastTickEnergyTransfers +
lastTickFluidTransfers +
lastTickRedstoneSignalStrength;

// 2. Adicionar ao histórico (ring buffer de 600 ticks)
throughputHistory.add(totalTransfers);

// 3. Calcular média móvel
int avgThroughput = throughputHistory.average();

// 4. Calcular capacidade máxima teórica
int maxThroughput = calculateMaxThroughput();

// 5. Strain bruto
float rawStrain = maxThroughput > 0
? (float) avgThroughput / maxThroughput
: 0.0f;

// 6. Aplicar redução de Condensers
float strainReduction = effectiveCondenserCount * 0.15f;
this.currentStrain = Math.max(0, rawStrain * (1 - strainReduction));
}

/**
* Retorna multiplicador de overhead energético baseado em strain.
* Exemplo: strain 0.5 → retorna 1.10 (10% overhead)
*/
public float getEnergyOverheadMultiplier() {
return 1.0f + (currentStrain * 0.20f); // max +20%
}

/**
* Atualiza contagem de Condensers efetivos.
* Chamado quando topologia muda.
*/
public void updateCondenserCount(List<WeaveCondenserBlockEntity> condensers) {
// Calcular eficiência total considerando overlap de raios
float totalEfficiency = condensers.stream()
.map(WeaveCondenserBlockEntity::getEfficiency)
.reduce(0.0f, Float::sum);

this.effectiveCondenserCount = Math.min(4, (int) totalEfficiency);
}
}

WeaveCondenserBlockEntity (impl)​

public class WeaveCondenserBlockEntity extends WeaveNodeBlockEntity {

@Override
public int getStandbyCost() {
int baseCost = getTier().getPortBaseCost() * 2; // 2× Port
float strain = getGraph().getCurrentStrain();
float overhead = 1.0f + (strain * 0.20f);
return (int) (baseCost * overhead);
}

/**
* Calcula eficiência baseada em Condensers próximos.
* Retorna 1.0 (100%) se sozinho, 0.5 (50%) se 2 no raio, etc.
*/
public float getEfficiency() {
int nearbyCount = countCondensersInRadius(16);
return 1.0f / Math.min(4, nearbyCount);
}

/**
* Conta Condensers ativos no raio de 16 blocos (Manhattan distance).
*/
private int countCondensersInRadius(int radius) {
BlockPos pos = getBlockPos();
int count = 0;

for (int x = -radius; x <= radius; x++) {
for (int y = -radius; y <= radius; y++) {
for (int z = -radius; z <= radius; z++) {
if (Math.abs(x) + Math.abs(y) + Math.abs(z) > radius) continue;

BlockPos checkPos = pos.offset(x, y, z);
if (checkPos.equals(pos)) continue;

if (level.getBlockEntity(checkPos) instanceof WeaveCondenserBlockEntity other) {
if (other.isActive()) count++;
}
}
}
}

return count + 1; // +1 = include self
}

/**
* Verifica se Condenser está ativo (rede ONLINE/RECONFIGURING/BROWNOUT).
*/
public boolean isActive() {
WeaveGraph graph = getGraph();
if (graph == null) return false;

RuntimeState state = WeaveRuntime.getInstance().getState(graph.getUUID());
return state == RuntimeState.ONLINE ||
state == RuntimeState.RECONFIGURING ||
state == RuntimeState.BROWNOUT;
}
}

WeaveCondenserBlock (impl)​

public class WeaveCondenserBlock extends Block {

public static final DirectionProperty FACING = BlockStateProperties.FACING;

@Override
public BlockState getStateForPlacement(BlockPlaceContext context) {
// FACING = oposto à direção do player (igual Furnace)
Direction facing = context.getNearestLookingDirection().getOpposite();
return defaultBlockState().setValue(FACING, facing);
}

/**
* Define quais faces conectam com Fiber.
* Apenas 2 faces opostas no eixo do FACING conectam.
*/
@Override
public boolean canConnectRedstone(BlockState state, BlockGetter level, BlockPos pos, @Nullable Direction direction) {
if (direction == null) return false;

Direction facing = state.getValue(FACING);

// Conecta apenas nas faces opostas do eixo
return direction == facing || direction == facing.getOpposite();
}
}

Inventário da implementação recuperada​

CapacidadeEstado em setembro de 2026
Bloco, BlockEntity e tracking de Strain no grafoImplementado; regressão atual pendente.
Overhead energético e integração com o runtimeImplementado; fórmulas precisam ser confrontadas com esta especificação.
Topologia linear, FACING e placementImplementado; cenários de mundo ainda não foram repetidos.
Eficiência espacial e atualização periódicaImplementado; quantidades e distâncias ainda não foram revalidadas.
Benefícios de buffer e redução de reconfiguraçãoImplementado via datapack; integração pendente de regressão.
Partículas por StrainImplementado; leitura visual em jogo pendente.
Barra de Strain no ControllerPlanejado; não foi encontrada interface de Controller no código atual.
Glow, pulsação e alteração visual das FibersParcial ou planejado; assets existem, mas o comportamento completo descrito historicamente não foi comprovado.

Considerações de Balanceamento​

ROI de Condensers​

Break-even point: Strain > 60% em redes com 30+ Ports

Exemplo:

Rede T3 com 30 Ports (standby base: ~5000 FE/t)
Strain 70% → Overhead +14% → +700 FE/t

Adicionar 2 Condensers:
→ Custo: 2 × 320 FE/t = 640 FE/t
→ Strain reduzido: 70% → 40% (redução de 30%)
→ Overhead reduzido: +14% → +8% (-6%)
→ Economia: 6% × 5000 = 300 FE/t
→ Custo líquido: 640 - 300 = +340 FE/t

Resultado: Custo líquido positivo, MAS benefícios secundários:
- +10% buffer (prevenção de BROWNOUT)
- -20% reconfig time (QoL)
- Rede visualmente mais estável

Conclusão: Condenser é investimento estratégico, não otimização essencial.


Tuning para Packmakers​

Multiplicadores ajustáveis via datapack:

  • Strain muito punitivo? → Reduzir max_energy_overhead (0.20 → 0.15)
  • Condenser muito fraco? → Aumentar strain_reduction_per_unit (0.15 → 0.20)
  • Condenser muito caro? → Reduzir standby_cost_multiplier (2.0 → 1.5)
  • Redes muito próximas? → Reduzir efficiency_radius (16 → 12)

Filosofia: Valores padrão equilibrados para vanilla, flexíveis para modpacks.


Perguntas Frequentes​

Condenser é obrigatório?​

Não. Rede funciona 100% sem Condenser. Ele apenas otimiza overhead energético e oferece benefícios secundários.

O que acontece se eu não usar Condenser em uma rede com Strain alto?​

Overhead energético aumenta até +20%. Se você tem geração suficiente, não há problema.

Condensers funcionam em qualquer tier?​

Sim, desde que a rede tenha Controller + Core energizado (T1-T7).

Posso colocar Condensers em cruz/diagonal?​

Não. Condenser só conecta 2 faces opostas (linha reta). Se colocado em cruz, desconecta 2 lados.

Quantos Condensers devo usar?​

Depende do tamanho da rede e Strain típico. Regra geral:

  • Redes pequenas (T1-T2): 0
  • Redes médias (T3): 1-2
  • Redes grandes (T4+): 3-4 (espaçados 32+ blocos)

Condenser funciona em BROWNOUT?​

Sim. Strain continua sendo calculado em BROWNOUT, e Condenser continua reduzindo overhead.


Referências​