Saltar al contenido

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.

  1. 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.

  2. 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.

  3. 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.

  4. 04

    TweakDBIDs centralizados

    Todos los TweakDBID viven en Core/Constants.reds. Nada de literales t"..." sueltos, desperdigados por los sistemas que los usan.

  5. 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.

  6. 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.

  7. 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.