Pular para o conteúdo principal

Dungeons geradas

Uma dungeon gerada não tem mundo modelo. Você constrói pequenas salas uma vez, descreve como elas se conectam, e um gerador monta um novo layout a cada run: de uma sala inicial, passando por salas normais, de tesouro e secretas, até a sala do chefe.

Dungeons fixas e geradas compartilham as mesmas runs, menus, baús, NPCs, mobs, eventos e facts. O que muda é de onde vêm as salas.

As peças​

PeçaEntryO que é
Tipo de portaDungeon Connector TypeO tamanho da abertura de uma porta, o bloco que veda uma porta não usada e quais tipos podem ser unidos.
SalaDungeon Room TemplateUma estrutura salva (uma estrutura .nbt do Paper guardada como artifact) com sua categoria, portas e marcadores.
PoolDungeon Room PoolUma lista ponderada de modelos de sala.
GeradorDungeon GeneratorAs regras: quais pools, quantas salas, a que profundidade fica o chefe, com que frequência um caminho se ramifica.
AffixDungeon AffixUm modificador da run sorteado ao acaso, como "mobs rápidos".
DungeonDungeon InstanceO campo generator dela a transforma em uma dungeon gerada.

Construa uma, passo a passo​

  1. Tipos de porta. Adicione pelo menos um Dungeon Connector Type. Defina width e height (3 por 3 por padrão), o sealBlock que fecha uma porta não usada (minecraft:stone_bricks por padrão) e, se você tiver vários tipos, compatibleWith. Um tipo sempre pode ser unido a ele mesmo.
  2. Salas. Para cada sala, adicione um Dungeon Room Template e use o editor no jogo para capturar seus blocos e colocar suas portas e marcadores. Escolha a category dela.
  3. Pools. Adicione um Dungeon Room Pool para as salas iniciais, um para as salas de chefe, um (ou mais) para as outras salas e, opcionalmente, um para corredores. Um pool de início, de chefe ou de corredor contém apenas modelos dessa categoria. Um pool normal pode misturar modelos NORMAL, TREASURE e SECRET.
  4. Gerador. Adicione um Dungeon Generator e defina startPool, bossPool, opcionalmente corridorPool, e normalPools com um peso cada.
  5. Dungeon. Na sua Dungeon Instance, defina generator. Deixe templateWorld vazio: uma dungeon gerada não tem mundo modelo. O isolamento deve ser AUTO ou WORLD_PER_RUN.
  6. Lógica do jogo. Use os triggers onEnter e onClear dos modelos de sala, os marcadores TRIGGER, os eventos de sala, as entries Dungeon Mob Spawn nos marcadores MOB, e termine a run com Dungeon Complete.

Se os pools e modelos não conseguem formar uma dungeon, o lançamento é recusado e o log do servidor diz por quê (por exemplo, um pool sem nenhuma sala inicial, ou um modelo sem uma captura legível). O campo messages do gerador guarda os motivos reportados a você, o autor. O jogador vê apenas um texto curto tirado dos snippets content.dungeon_generated.refusal.setup (os pools e modelos não conseguem formar uma dungeon) e content.dungeon_generated.refusal.paste (as salas não puderam ser coladas), que você pode editar no painel web. Nada é cobrado nesses casos. A linha que anuncia os affixes de uma run é o snippet content.dungeon_generated.affix.announcement.

Categorias de sala​

A category de um modelo de sala diz que papel ele pode ter.

CategoriaPapel
STARTA run começa aqui. Uma por dungeon. Deve conter um marcador SPAWN.
NORMALUma sala comum.
TREASURESempre em um ramo, nunca no caminho até o chefe.
CORRIDORInserido entre duas salas que não podem se tocar diretamente.
SECRETSempre um beco sem saída.
BOSSA última sala. Uma por dungeon.

As salas são unidas porta a porta, então uma sala sem portas só pode ser um START sem saída. Uma porta com required ativado deve ser unida a outra sala: um modelo que não consegue preencher todas as suas portas obrigatórias nunca é usado. Uma porta pela qual ninguém passou é fechada com o sealBlock do seu tipo.

Marcadores​

Um marcador é um ponto de interesse dentro de uma sala. Cada um tem um kind:

TipoO que fazCampo a preencher
SPAWNOnde os jogadores aparecem quando a run começa. Apenas o primeiro SPAWN da sala inicial é usado.nenhum
CHESTUm baú de loot é colocado aqui. A posição e o yaw dele substituem a localização da entry. Um baú nomeado por um marcador é sempre colocado, mesmo que a entry dele esteja em manualMode.chest: um Dungeon Loot Chest
TRIGGEROs triggers são disparados para o jogador que chega à sala.triggers
NPCUm Dungeon NPC Instance fica aqui, exibido aos membros da run.npc
MOBUm Dungeon Mob Spawn faz seus mobs aparecerem aqui, na primeira vez que um membro da run entra na sala.mob

O yaw de um marcador vira um baú (ele fica voltado de volta para o yaw) e um NPC (ele olha na direção dele). O marcador é vinculado à sua entry pela posição dele na lista markers.

Salas em jogo​

Quando um jogador entra em uma sala de uma dungeon gerada, os triggers onEnter do modelo dela disparam, depois os triggers dos marcadores TRIGGER e os mobs dos marcadores MOB. Com enterOnce ativado (o padrão para modelos), eles disparam apenas na primeira vez que cada jogador entra na sala em uma run.

Os triggers onClear disparam uma vez por run quando uma action Dungeon Clear Room é executada enquanto o jogador está na sala. A plataforma nunca decide sozinha que uma sala foi limpa: você decide, por exemplo a partir do evento de morte de mob quando o último monstro morre.

Os triggers de uma sala leem estes valores do contexto (com um interaction_context_variable):

ChaveValor
RUN_IDId da run.
SEEDSeed da dungeon, em decimal.
ROOMNúmero da sala: 0 é a sala inicial, depois na ordem em que o gerador as posicionou.
ROOM_TEMPLATEId da entry do modelo de sala.
DIFFICULTYO difficulty do gerador.
POSITIONO bloco do marcador para um marcador TRIGGER, caso contrário a posição do jogador.

Os triggers de um affix leem apenas RUN_ID, SEED e DIFFICULTY. Uma dungeon fixa não fornece nenhuma dessas chaves.

Seeds, affixes e dificuldade​

A mesma seed sempre gera a mesma dungeon, então um layout pode ser repetido. Uma nova seed é sorteada a cada run. A seed é salva com a run, então um reload reconstrói a mesma dungeon em memória. Se ela não puder ser reconstruída, a run é fechada na inicialização em vez de ser adotada com salas que ninguém conhece.

Os affixes são sorteados depois do layout, a partir dos affixes do gerador pelo seu weight, affixCount deles sem repetição. O sorteio segue a seed, mas nunca altera o layout. Seus modifiers e triggers se aplicam a cada membro quando a run começa.

difficulty é apenas um número entregue aos seus triggers pelo contexto: ele não altera o layout por si só.

Ajustes do gerador que importam​

CampoPadrãoNotas
minRooms, maxRooms6, 10Total de salas incluindo início e chefe, excluindo corredores. Intervalo permitido: 2 a 256.
minBossDepth3O chefe fica a pelo menos esta quantidade de passos do início.
branchRatePercent40Chance, em porcentagem, de uma sala além do caminho principal abrir um ramo lateral.
quotasnenhumLimites no número de salas NORMAL, TREASURE e SECRET. Uma categoria sem limite é ilimitada.
trialBudget, replans20000, 5O quanto a busca tenta antes de falhar. O trial budget vezes (replans + 1) deve ficar dentro de 5 000 000.
baseY64Altura do piso da sala inicial no mundo da run.
roomsPerTick4Salas coladas por tick do servidor. Menor mantém os ticks curtos; maior é mais rápido.
pasteTimeoutSeconds120Passado esse tempo, o lançamento é cancelado, o custo devolvido e o mundo descartado.
naturalSpawningdesativadoMonstros e animais surgem sozinhos no mundo da run. Desativado por padrão.
verticalMargin1.0Blocos adicionados acima do teto e abaixo do piso de cada sala ao decidir se um jogador está dentro.
pasterSTRUCTUREUsa a API de estruturas do Paper: nenhum outro plugin é necessário.

Um modelo de sala tem no máximo 256 blocos em cada lado, com no máximo 64 portas e 1024 marcadores.

O editor no jogo​

Abra um Dungeon Room Template no painel web e clique no editor de conteúdo do campo artifactId. Você recebe um conjunto de ferramentas na sua hotbar:

FerramentaUso
Varinha de cantosClique esquerdo em um bloco para o canto A, clique direito em um bloco para o canto B.
CapturaSalva os blocos da caixa como a estrutura do modelo.
Ferramenta de portaClique direito em um bloco de uma parede para adicionar uma porta (o bloco é o centro inferior da abertura). Clique esquerdo para remover as portas ali.
Tipo de portaClique direito para o próximo tipo de conector, clique esquerdo para o anterior.
Alternar obrigatóriaAlterna se as próximas portas são obrigatórias.
Ferramenta de marcadorClique direito em um bloco para adicionar um marcador na frente dele. Clique esquerdo para remover os marcadores ali.
Tipo de marcadorClique direito para o próximo tipo, clique esquerdo para o anterior.
SalvarGrava as portas e os marcadores na entry.

Uma boss bar mostra o tamanho da caixa, o número de portas e marcadores e se você tem trabalho não salvo. O tamanho da sala é lido da estrutura salva, nunca digitado. Você deve criar e publicar pelo menos um tipo de conector antes de poder adicionar uma porta.

As capturas ignoram entidades por padrão, porque uma entidade viva altera a sala a cada captura e volta como um mob solto em cada cópia. Esses comportamentos e todos os textos do editor são snippets do Typewriter em content.dungeon_room_template., então você pode alterá-los ou traduzi-los no painel web:

SnippetPadrãoSignificado
capture.include_entitiesfalseSe uma captura salva as entidades da caixa.
capture.max_volume262144O máximo de blocos que uma captura lê. Ela é lida em um único tick do servidor: uma caixa muito grande segura esse tick.
capture.timeout_seconds30Segundos de espera por uma captura antes de desistir.
sound.confirmentity.experience_orb.pickupSom após uma captura ou um salvamento. Vazio: nenhum.

Limites e boas práticas​

  • As dungeons geradas usam apenas WORLD_PER_RUN: cada run cria um mundo e o apaga depois.
  • O editor das salas fixas (nós) tem seus próprios snippets em content.dungeon_room. (mensagens node.*, save.*, editor.*, ferramentas tool.add, tool.remove, tool.save).
  • Construa as salas de modo que duas portas unidas do mesmo tipo se alinhem. Uma largura de abertura par tem o bloco extra no x ou z mais alto do modelo. O gerador desliza uma sala em um bloco quando uma abertura par exige.
  • A dungeon inteira deve caber entre o bloco mais baixo e o mais alto do mundo, contando a partir de baseY.
  • Não conte com um número fixo de salas: use marcadores e eventos em vez de números de sala.

Relacionado​