Come devo verificare se un giocatore ha completato un risultato?


13

Sto realizzando un gioco MMO e sono appena arrivato al punto in cui devo implementare i risultati ... Come posso farlo? La cosa più semplice da fare sarebbe eseguirla una volta ogni 100 ms:

for a in achievements
    for p in players
        if a.meetsRequirements(p) then p.completeAchievement(a)

Ma questo solleva ancora più complicazioni. Ad esempio, come posso verificare se il risultato è stato effettivamente completato? I giocatori hanno proprietà personalizzate su se stessi solo per un obiettivo specifico? Ho fatto questo genere di cose con le missioni, perché sono principalmente "colleziona 100 legni", quindi le missioni attive su un giocatore lo controllano. Inoltre, ci dovrebbe essere un momento migliore per verificarlo, questo rallenterebbe periodicamente il mio server, credo.


7
Perché non eseguire solo controlli pertinenti quando vengono eseguite le azioni? Vale a dire se l'utente raccoglie il legno, controlla se corrispondono alla specifica "raccogli 100 legni".
Mike Cluck,

1
Quel tipo sembra troppo disordinato ... Ci sarebbero tonnellate di controlli dappertutto. Penso che
seguirò

10
Ci sono modi per renderlo meno disordinato: come avere un gestore di eventi "OnChange" quindi collegare "oggetti" di realizzazione a quelli e gestire lì la logica. Comprendi anche che con la tua configurazione attuale hai un livello di complessità O (n ^ 2) che significa che il tuo gioco diventa molto più lento con più personaggi. Un problema per un MMO
Mike Cluck,

Risposte:


23

Quello che fai dipende dalla natura del risultato. A meno che tutti i tuoi risultati non si adattino tutti a un modello semplice (raccogli il numero X di Y), dovrai in qualche modo affrontarli in modo speciale.

Utilizzando un sistema di comunicazione basato su messaggi, è possibile fornire hook che rendono localizzata la codifica dei casi speciali. È possibile che determinate azioni attivino i messaggi per gli ascoltatori che si registrano. Quindi il tuo codice / script di realizzazione può semplicemente registrarsi con gli ascoltatori appropriati e fare tutto il test necessario per licenziare il risultato.

Avresti messaggi per gli eventi tipici che potresti desiderare che i risultati siano ascoltati. Cose come "il giocatore ha acquisito l'oggetto X" o "l'entità Y ha ucciso l'entità Z". In questo modo, puoi tenere traccia di cose come quante Z sono state uccise dal giocatore.

Questo è probabilmente il meglio che puoi fare per un sistema per i risultati. Centralizza il codice il più possibile e mette l'onere sugli ascoltatori per l'effettivo rilevamento dei risultati.

Inoltre, va notato che, per i sistemi di risultati centralizzati (X-Box Live, risultati di Steam), i progressi verso i risultati sono generalmente memorizzati sul server. Quindi, per i risultati accumulati ("esegui il numero di attività XY volte"), lo script dei risultati rileva solo quando X è stato eseguito e aumenta il conteggio del server. Per altri tipi di risultati ("esegui attività X"), il risultato del server è binario: o l'hai fatto o no.


+1 Questa è un'ottima informazione. Anche utile senza che io abbia bisogno di implementare risultati in questo momento.
Joshua Hedges,

Grazie! Non vedo l'ora di implementarlo, vorrei aver avuto questa idea prima ...
jcora,

3

A seconda della natura dei tuoi risultati, potresti anche introdurre una sorta di "risultato marcatore".

Se hai ad esempio 3 risultati consecutivi:
Legno 1 - Raccogli 100 legni
Legno 2 - Raccogli 500 legni
Legno 3 - Raccogli 1k legni

Quindi sarebbe logico registrare un evento OnChange per il primo risultato fino a quando il giocatore non lo ha completato. Al completamento è possibile registrare l'oggetto obiettivo successivo.

Ciò ovviamente richiede la progettazione (o il calcolo) di un albero delle dipendenze dei risultati.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.