- Inicio
- Documentación
- Arquitectura de plugins
Documentación
DOC-05 · Planificado, especificación publicada
Arquitectura de plugins
El sistema de callouts está diseñado y su interfaz está publicada más abajo. No está implementado. Esta página existe para discutir el diseño antes de construirlo, no para que alguien desarrolle sobre él hoy.
La interfaz planificada
En orden: identidad y presentación; después, las condiciones en las que el dispatch puede elegir la llamada; luego, el ciclo de vida que recorre, y por último, lo que paga.
GetID() / GetDisplayName() / GetRadioCode()
GetValidDistricts() / GetTimeWindow() / GetMinRank()
GetLocationCandidates() -> array<Vector4>
OnDispatch() / OnPlayerArrived() / OnResolved() / OnFailed() / OnCleanup()
GetPayout() / GetXP()La regla que el diseño debe cumplir
Cada dispatch es un plugin. Un tercero tiene que poder añadir un callout nuevo con un solo archivo .reds y sin tocar nada del núcleo. Si la arquitectura no lo permite, está mal.Esa es la prueba con la que se va a medir la implementación, y la razón de que la interfaz de arriba sea amplia a propósito: un callout tiene que poder declarar dónde y cuándo es válido sin que el planificador sepa nada concreto de él.
Clase abstracta, no interfaz
Pese a su nombre, ICallout será una clase abstract. El código vanilla nunca usa la palabra clave interface: CDPR escribe sus propios contratos como abstract o importonly class. Seguir las convenciones del motor del juego vale más que seguir las que sugeriría otro lenguaje.
Reglas de la casa para quien colabore
Rigen el núcleo hoy y regirán los plugins cuando exista el cargador.
- 01
@wrapMethod siempre
@replaceMethod está prohibido salvo que un comentario justo encima de la función explique por escrito por qué envolverla no basta. Reemplazar un método vanilla es la principal causa de incompatibilidad entre mods.
- 02
Todo bajo module NCPDFR.*
Ningún identificador global, ni uno. Un submódulo por sistema, y el nombre lo da la ruta del módulo, no un prefijo de texto en cada tipo.
- 03
Código y comentarios en inglés
Identificadores, comentarios en línea y mensajes de log. La documentación para usuarios puede estar en otro idioma; el código fuente, no.
- 04
TweakDBIDs centralizados
Todos los TweakDBID viven en Core/Constants.reds. Nada de literales t"..." sueltos, desperdigados por los sistemas que los usan.
- 05
Todo cast seguido de IsDefined()
Sin excepciones. Todo lo que se genera se vuelve a validar antes de usarlo otra vez: puede que el jugador se haya alejado y que el streaming lo haya descargado.
- 06
Un archivo, un sistema
Cuando un archivo pasa de unas 300 líneas, se divide. Los números de balance van a la configuración, no metidos en la lógica como valores mágicos.
- 07
Nunca dar por hecha una dependencia opcional
Detéctala y, si falta, degrada con suavidad. El contenido de Phantom Liberty es el ejemplo de siempre: Dogtown queda detrás de una comprobación porque la expansión puede no estar instalada.
Propón un callout
Esta interfaz se publicó antes de escribirse para poder discutirla mientras cambiarla todavía no cuesta nada. Si un callout que quieres no encaja en la forma de arriba, dilo en Discord. Lo que está en discusión es la forma, no que vaya a haber una.