-- Progresso de missao por personagem.
--
-- A MISSAO fica no arquivo (server/Data/Quests/Quest.ini, 730 delas); aqui vai so o que o
-- jogador fez, que e o que precisa sobreviver a um restart.
--
-- A coluna `ciclo` e o que faz os tres tipos de repeticao caberem numa tabela so, sem
-- coluna de tipo e sem caso especial no codigo:
--
--     unica       ciclo = ''             o indice unico impede uma segunda linha, pra sempre
--     diaria      ciclo = 'AAAA-MM-DD'   uma linha por dia; amanha e outro ciclo
--     repetivel   ciclo = '1','2','3'    contador; cada entrega abre o proximo
--
-- Quem decide qual e o tipo e o Quest.ini, nao esta tabela. Enquanto a coluna `repeticao`
-- de la nao estiver preenchida, TUDO e tratado como unica -- errar pra unica so impede
-- repetir, e errar pra repetivel deixa farmar a recompensa. O estrago nao e simetrico.
--
-- entity_id, e nao personagem_id: e a chave que dbo.personagem_item ja usa, e o servidor
-- carrega o entity_id na mao o tempo todo.

IF OBJECT_ID('dbo.personagem_missao', 'U') IS NULL
BEGIN
    CREATE TABLE dbo.personagem_missao (
        personagem_missao_id int IDENTITY(1,1) NOT NULL
            CONSTRAINT PK_personagem_missao PRIMARY KEY,
        entity_id     int          NOT NULL,
        quest_id      int          NOT NULL,
        estado        tinyint      NOT NULL CONSTRAINT DF_pm_estado    DEFAULT (0),  -- 0 aceita, 1 concluida
        progresso     int          NOT NULL CONSTRAINT DF_pm_progresso DEFAULT (0),
        ciclo         nvarchar(10) NOT NULL CONSTRAINT DF_pm_ciclo     DEFAULT (''),
        aceita_em     datetime2    NOT NULL CONSTRAINT DF_pm_aceita    DEFAULT (SYSUTCDATETIME()),
        concluida_em  datetime2    NULL
    );

    -- Impede aceitar duas vezes o mesmo ciclo. E a trava de "missao unica nao repete":
    -- sem ela, dois cliques rapidos criariam duas linhas e a recompensa sairia dobrada.
    CREATE UNIQUE INDEX UX_personagem_missao_ciclo
        ON dbo.personagem_missao (entity_id, quest_id, ciclo);

    -- A consulta quente e "o que este personagem tem em aberto", feita a cada entrada no mundo.
    CREATE INDEX IX_personagem_missao_personagem
        ON dbo.personagem_missao (entity_id, estado);
END
