Differenze tra le versioni di "PanoramicaMUD"
Da MontelLUG WIKI.
m (cambiato menu) |
|||
(28 versioni intermedie di 7 utenti non mostrate) | |||
Riga 1: | Riga 1: | ||
+ | {{navmenu_exp| | ||
+ | padre= | ||
+ | YourCityMUD | ||
+ | }} | ||
+ | |||
+ | =FUNZIONAMENTO DEL SERVER= | ||
+ | |||
+ | ==Fase di Init== | ||
+ | |||
+ | Alla partenza il server fa le seguenti attività: | ||
+ | # Imposta la propria configurazione | ||
+ | ## Carica le impostazioni di default | ||
+ | ## Carica le impostazioni inserite nel file di configurazione | ||
+ | ### Ip del server PostgreSQL | ||
+ | ### Nome del database | ||
+ | ### Nome utente per il db | ||
+ | ### Password per il db | ||
+ | ### Tempo di persistenza in memoria location senza pg | ||
+ | ### Tempo massimo di inattività di un pg prima della disconnessione automatica | ||
+ | ### Tempo massimo lasciato agli utenti prima di spegnimento o riavvio | ||
+ | ### Utente che il server deve utilizzare | ||
+ | # Cambia l'utente del processo a quello indicato nella configurazione | ||
+ | # Connessione al database | ||
+ | ## Creazione connession al database | ||
+ | ## Test della connessione | ||
+ | # Congruenza con il database | ||
+ | ## Verifica del disegno del database se congruente con la versione del programma | ||
+ | ## Eventuale aggiornamento del disegno del db | ||
+ | # Pulizia dal database di tutti gli oggetti a tempo scaduti | ||
+ | # Caricamento in memoria di tutte le fakelocation | ||
+ | # '''Inizializza la lista dei pg connessi''' | ||
+ | # '''Inizializza la lista delle Location caricate in memoria''' | ||
+ | |||
+ | ==Ciclo principale== | ||
+ | |||
+ | # Aggiorna connessioni | ||
+ | ## Nuove richieste di connessione | ||
+ | ### Verifica login | ||
+ | ### Se la login è affermativa inserisci in coda alla lista dei pg connessi | ||
+ | ## Pg disconnessi senza logout | ||
+ | ### Verifica se qualcuno non agisce da troppo tempo | ||
+ | ### Togli dalla lista dei pg chi non agisce da troppo tempo | ||
+ | # Cicla sulla lista dei pg connessi e per ognuno esegui i seguenti passi: | ||
+ | ## Controlla il socket e vedi cosa ha chiesto di fare il pg | ||
+ | ## Esegui l'operazione richiesta dal pg | ||
+ | ## Invia la risposta al pg | ||
+ | # Aggiorna la lista delle Location Caricate in Memoria | ||
+ | ## Salva nel db le Location e tutto ciò che contengono he sono da troppo tempo senza nessun pg | ||
+ | ## Lancia metodo ''refresh'' della lista temporanea delle location | ||
+ | |||
+ | ==Fase di Spegnimento== | ||
+ | |||
+ | # Se la lista dei pg non è vuota | ||
+ | ## Invia ai pg un messaggio in cui li si avverte che in tot secondi si spegne/riavvia | ||
+ | ## Attendi tot secondi + 20 secondi | ||
+ | # Chiudi il socket server | ||
+ | # Per ognuno dei pg nella lista dei pg connessi | ||
+ | ## chiudi il socket | ||
+ | ## Salva il pg nel database | ||
+ | ## Distruggi il pg in memoria | ||
+ | # Per ognuna delle location nella lista delle Location caricate | ||
+ | ## Aggiorna nel database tutto quello che contiene la location (png ed oggetti) | ||
+ | ## Distruggi tutti gli oggetti e png della location caricati in memoria | ||
+ | ## Salva nel db la Location | ||
+ | ## Distruggi la Location dalla memoria. | ||
+ | # Chiudi la Connessione con il Database | ||
+ | # Distruggi gli altri oggetti come quelli che mantengono la configurazione. | ||
+ | # Chiudi il processo. | ||
+ | |||
+ | =DESCRIZIONE DELLE CLASSI= | ||
+ | |||
+ | ==Classi di Utilità== | ||
+ | |||
+ | Le classi di utilità sono quelle che non rappresentano un oggetto particolare all'interno del mud ma sono utilizzate per far funzionare le altre nel modo voluto. L'attività di ogni classe è descritta nella sua sezione. | ||
+ | |||
+ | ===Insieme temporaneo=== | ||
+ | |||
+ | La classe TempSet e' costruita sfruttando la ''multimap'' della stl per associare una scandenza agli oggetti inseriti. | ||
+ | Permette la ricerca e lo scorrimento tramite l'iteratore TSiter, definito ad hoc. | ||
+ | Si utilizza piu' o meno come il ''set'' delle STL. | ||
+ | La rimozione degli oggetti e' automatica. | ||
+ | |||
+ | ===Dizionario=== | ||
+ | |||
+ | E' una classe costruita ''Multimap'' della STL, sulla falsa riga del TempSet. E' una classe che contiene una lista di coppie chiave/valore. | ||
+ | *La chiave e' una qualunque classe con una relazione d'ordine, per noi una ''string'' | ||
+ | *Il valore e' un intero che rappresenta la quantità dell'attributo (ad esempio Nuotare si conosce al livello 25) | ||
+ | |||
+ | Si utilizza una Multimap e non una Map perchè, perchè ci possono essere più elementi della mappa con la stessa chiave. Infatti è comune che sul livello di una caratteristica influiscano più cose contemporaneamente, ognuna con la sua scadenza. Ad esempio avrò: | ||
+ | * Abilità Nuotare valore +20 senza scadenza per il mio livello. | ||
+ | * Abilità Nuotare valore +5 senza scadenza per la classe. | ||
+ | * Abilità Nuotare valore +30 scadenza 21:43 12/10/2004 per una pozione. | ||
+ | * Abilità Nuotare valore +15 scadenza 12:33 12/08/2004 per una magia. | ||
+ | |||
+ | => Oggi la mia abilità Nuotare è 55, dopo le 12:33 del 12/08/2004 sarà 40, e dopo il 12:33 del 12/08/2004 sarà 25. | ||
+ | |||
+ | ===Connessione al Database=== | ||
+ | |||
+ | Questa classe DbConn fa da interfaccia tra db e server. Il server, per accedere al db interroga solo questa classe che è l'unica parte dell'applicazione ad accedere direttamente al db. In questo modo, per cambiare il db basta modificare questa classe. Le attività che dovrà fare la classe sono: | ||
+ | * Eseguire query di selezione | ||
+ | * Eseguire query di update | ||
+ | * Recuperare l'elenco dei database nel server | ||
+ | * Recuperare l'elenco delle tabelle in ogni database | ||
+ | * Reuperare la descrizione delle tabelle secondo: | ||
+ | ** Nome colonna | ||
+ | ** Tipo (integer, float, varchar(xx), char(xx)) | ||
+ | ** Flag Not Null | ||
+ | ** Flag Primary Key | ||
+ | |||
+ | [[Classe di connessione al db | Connection]] | ||
+ | |||
+ | ===Configurazione=== | ||
+ | |||
+ | La classe Configuration si occupa della gestione del file e dei parametri di configurazione. Contiene l'informazione sui path in cui cercare il file di configurazione. Contiene l'indicazione dei valori di default non specificati nel file di configurazione. Questa classe si occupa di fare il parsing del file di conf e di offrire al database una lista di chiave/valore. In questo modo se nascesse la necessità di dividere i file di configurazione in più parti, oppure si volesse cambiarne la sintassi, basterebbe modificare questa classe. | ||
+ | |||
==Mappa== | ==Mappa== | ||
La mappa e' realizzata tramite 3 classi: ''Location'', ''FakeLocation'' e ''Connection''. | La mappa e' realizzata tramite 3 classi: ''Location'', ''FakeLocation'' e ''Connection''. | ||
Riga 9: | Riga 124: | ||
E' lo scheletro della location, mantenuto sempre in memoria per rappresentare la mappa. Contiene un'identificativo, un puntatore alla ''Location'' di cui e' scheletro, i puntatori alle ''Connection'' vicine e la lista dei personaggi giocanti. | E' lo scheletro della location, mantenuto sempre in memoria per rappresentare la mappa. Contiene un'identificativo, un puntatore alla ''Location'' di cui e' scheletro, i puntatori alle ''Connection'' vicine e la lista dei personaggi giocanti. | ||
+ | Contiene inoltre un puntatore alla lista a tempo in cui inserire le ''Location''. | ||
'''Connection''' | '''Connection''' | ||
Riga 22: | Riga 138: | ||
==Permessi== | ==Permessi== | ||
+ | |||
+ | Gli oggetti, le connection, i dialoghi etc. non possono essere accessibili da tutti. Ad esempio, per attraversare una connection potrebbe essere necessario saper volare, o scalare o nuotare; per poter usare un oggetto può essere necessario essere un mago, o un elfo, o avere una determinata forza. Object, connection, dialog e answer contengono tutti un oggetto access, esemplare di una classe che rappresenta le condizioni per cui un oggetto è utilizzabile, una connection attraversabile, un dialogo udibile e una risposta sceglibile. | ||
+ | Nella classe access sono contenute condizioni nella forma: | ||
+ | |||
+ | -Skills da avere almeno tot | ||
+ | |||
+ | -Skills da ''non'' avere o avere fino a tot | ||
+ | |||
+ | -Feats da avere | ||
+ | |||
+ | -Feats da ''non'' avere. | ||
+ | |||
+ | -Classe o Razza a cui appartenere o meno | ||
+ | |||
+ | Le condizioni imposte dagli oggetti (es. se hai una corda puoi attraversare una connection in salita) si risolvono associando agli oggetti delle skill o feature (quando si raccoglie una corda si attiva la feature "scalata" o simili) | ||
==Personaggi== | ==Personaggi== | ||
+ | |||
+ | I personaggi si dividono in giocanti (PG) e non giocanti (PNG), che derivano dalla medesima classe ''Character''. | ||
+ | |||
+ | '''Character''' | ||
+ | Deve contenere un nome, una descrizione, razza (elfo, nano, umano, ...) e classe (chierico, mago, ladro, ...), le Features e le skill, memorizzata in TempList, gli spell, quelli attivi in una TempList, uno zaino con roba dentro, dei puntatori mano dx, mano sx, testa ecc. per ospitare armi, elmi, scudi, anelli, diademi, ecc. | ||
+ | |||
+ | '''PG''' | ||
+ | Deve inoltre contenere le quest del personaggio, traccia di quelle già fatte e i punti esperienza. | ||
+ | |||
+ | |||
+ | '''PNG''' | ||
+ | Deve avere una lista Dialoghi da fare, ordinata in base alle caratteristiche del PG (un PG esperto farà dialoghi più profondi e accederà a quest più difficili :). | ||
==Oggetti== | ==Oggetti== | ||
Riga 43: | Riga 186: | ||
Contiene un testo, degli accessi per decidere se visualizzarla, un'azione che il personaggio parlante fa e un puntatore alla frase successiva. | Contiene un testo, degli accessi per decidere se visualizzarla, un'azione che il personaggio parlante fa e un puntatore alla frase successiva. | ||
− | Esempio | + | '''Esempio''': |
+ | |||
+ | Dialogo n° 45:(lo possono sentire solo gli elfi ricchioni). La prima frase è la n° 123 | ||
+ | |||
+ | Frase n° 123: "Vai a baciare l'orco omofobico". Risposte possibili: "Va bene", "Fottiti" | ||
+ | |||
+ | Risposta "Va bene": vai alla frase n° 324. | ||
− | - | + | Risposta "Fottiti": azione -> attacca (il png che stà dicendo il dialogo attacca il personaggio). |
==Quest== | ==Quest== | ||
Riga 70: | Riga 219: | ||
- Vai a prendere quell'oggetto e portamelo. | - Vai a prendere quell'oggetto e portamelo. | ||
− | - Uccidi dolorosamente | + | - Uccidi dolorosamente tizio, caio e sempronio (che saranno di una gilda avversa e alla portata). |
− | - | + | - etc. |
Versione attuale delle 19:07, 4 feb 2005
Menu | ||
---|---|---|
MontelLUG frontpage | ||
Aiuto: Come modificare le pagine | ||
Torna indietro |
FUNZIONAMENTO DEL SERVER
Fase di Init
Alla partenza il server fa le seguenti attività:
- Imposta la propria configurazione
- Carica le impostazioni di default
- Carica le impostazioni inserite nel file di configurazione
- Ip del server PostgreSQL
- Nome del database
- Nome utente per il db
- Password per il db
- Tempo di persistenza in memoria location senza pg
- Tempo massimo di inattività di un pg prima della disconnessione automatica
- Tempo massimo lasciato agli utenti prima di spegnimento o riavvio
- Utente che il server deve utilizzare
- Cambia l'utente del processo a quello indicato nella configurazione
- Connessione al database
- Creazione connession al database
- Test della connessione
- Congruenza con il database
- Verifica del disegno del database se congruente con la versione del programma
- Eventuale aggiornamento del disegno del db
- Pulizia dal database di tutti gli oggetti a tempo scaduti
- Caricamento in memoria di tutte le fakelocation
- Inizializza la lista dei pg connessi
- Inizializza la lista delle Location caricate in memoria
Ciclo principale
- Aggiorna connessioni
- Nuove richieste di connessione
- Verifica login
- Se la login è affermativa inserisci in coda alla lista dei pg connessi
- Pg disconnessi senza logout
- Verifica se qualcuno non agisce da troppo tempo
- Togli dalla lista dei pg chi non agisce da troppo tempo
- Nuove richieste di connessione
- Cicla sulla lista dei pg connessi e per ognuno esegui i seguenti passi:
- Controlla il socket e vedi cosa ha chiesto di fare il pg
- Esegui l'operazione richiesta dal pg
- Invia la risposta al pg
- Aggiorna la lista delle Location Caricate in Memoria
- Salva nel db le Location e tutto ciò che contengono he sono da troppo tempo senza nessun pg
- Lancia metodo refresh della lista temporanea delle location
Fase di Spegnimento
- Se la lista dei pg non è vuota
- Invia ai pg un messaggio in cui li si avverte che in tot secondi si spegne/riavvia
- Attendi tot secondi + 20 secondi
- Chiudi il socket server
- Per ognuno dei pg nella lista dei pg connessi
- chiudi il socket
- Salva il pg nel database
- Distruggi il pg in memoria
- Per ognuna delle location nella lista delle Location caricate
- Aggiorna nel database tutto quello che contiene la location (png ed oggetti)
- Distruggi tutti gli oggetti e png della location caricati in memoria
- Salva nel db la Location
- Distruggi la Location dalla memoria.
- Chiudi la Connessione con il Database
- Distruggi gli altri oggetti come quelli che mantengono la configurazione.
- Chiudi il processo.
DESCRIZIONE DELLE CLASSI
Classi di Utilità
Le classi di utilità sono quelle che non rappresentano un oggetto particolare all'interno del mud ma sono utilizzate per far funzionare le altre nel modo voluto. L'attività di ogni classe è descritta nella sua sezione.
Insieme temporaneo
La classe TempSet e' costruita sfruttando la multimap della stl per associare una scandenza agli oggetti inseriti. Permette la ricerca e lo scorrimento tramite l'iteratore TSiter, definito ad hoc. Si utilizza piu' o meno come il set delle STL. La rimozione degli oggetti e' automatica.
Dizionario
E' una classe costruita Multimap della STL, sulla falsa riga del TempSet. E' una classe che contiene una lista di coppie chiave/valore.
- La chiave e' una qualunque classe con una relazione d'ordine, per noi una string
- Il valore e' un intero che rappresenta la quantità dell'attributo (ad esempio Nuotare si conosce al livello 25)
Si utilizza una Multimap e non una Map perchè, perchè ci possono essere più elementi della mappa con la stessa chiave. Infatti è comune che sul livello di una caratteristica influiscano più cose contemporaneamente, ognuna con la sua scadenza. Ad esempio avrò:
- Abilità Nuotare valore +20 senza scadenza per il mio livello.
- Abilità Nuotare valore +5 senza scadenza per la classe.
- Abilità Nuotare valore +30 scadenza 21:43 12/10/2004 per una pozione.
- Abilità Nuotare valore +15 scadenza 12:33 12/08/2004 per una magia.
=> Oggi la mia abilità Nuotare è 55, dopo le 12:33 del 12/08/2004 sarà 40, e dopo il 12:33 del 12/08/2004 sarà 25.
Connessione al Database
Questa classe DbConn fa da interfaccia tra db e server. Il server, per accedere al db interroga solo questa classe che è l'unica parte dell'applicazione ad accedere direttamente al db. In questo modo, per cambiare il db basta modificare questa classe. Le attività che dovrà fare la classe sono:
- Eseguire query di selezione
- Eseguire query di update
- Recuperare l'elenco dei database nel server
- Recuperare l'elenco delle tabelle in ogni database
- Reuperare la descrizione delle tabelle secondo:
- Nome colonna
- Tipo (integer, float, varchar(xx), char(xx))
- Flag Not Null
- Flag Primary Key
Configurazione
La classe Configuration si occupa della gestione del file e dei parametri di configurazione. Contiene l'informazione sui path in cui cercare il file di configurazione. Contiene l'indicazione dei valori di default non specificati nel file di configurazione. Questa classe si occupa di fare il parsing del file di conf e di offrire al database una lista di chiave/valore. In questo modo se nascesse la necessità di dividere i file di configurazione in più parti, oppure si volesse cambiarne la sintassi, basterebbe modificare questa classe.
Mappa
La mappa e' realizzata tramite 3 classi: Location, FakeLocation e Connection.
Location
Contiene una descrizione dell'ambiente e la lista di oggetti e personaggi non giocanti presenti all'interno dell'ambiente. Le informazioni contenute nella location sono normalmente immagazzinate nel db (su disco); vengono caricate in memoria solo quando almeno un personaggio giocante è nella location. Dopo tot tempo in cui nella location non vi è più nessun pg, viene salvata nel db e tolta dalla memoria.
FakeLocation
E' lo scheletro della location, mantenuto sempre in memoria per rappresentare la mappa. Contiene un'identificativo, un puntatore alla Location di cui e' scheletro, i puntatori alle Connection vicine e la lista dei personaggi giocanti. Contiene inoltre un puntatore alla lista a tempo in cui inserire le Location.
Connection
Rappresenta la connessione tra FakeLocation. Gestisce i permessi di accesso alle FakeLocation da parte dei pg.
Esempio
Per muoversi un giocatore controlla la FakeLocation in cui si trova e chiama un metodo della sua FakeLocation per andare a nord. La FakeLocation chiede alla Connection se il personaggio puo' passare e in caso di risposta positiva modifica il puntatore FakeLocation del personaggio, altrimenti gli notifica il rifiuto.
Permessi
Gli oggetti, le connection, i dialoghi etc. non possono essere accessibili da tutti. Ad esempio, per attraversare una connection potrebbe essere necessario saper volare, o scalare o nuotare; per poter usare un oggetto può essere necessario essere un mago, o un elfo, o avere una determinata forza. Object, connection, dialog e answer contengono tutti un oggetto access, esemplare di una classe che rappresenta le condizioni per cui un oggetto è utilizzabile, una connection attraversabile, un dialogo udibile e una risposta sceglibile. Nella classe access sono contenute condizioni nella forma:
-Skills da avere almeno tot
-Skills da non avere o avere fino a tot
-Feats da avere
-Feats da non avere.
-Classe o Razza a cui appartenere o meno
Le condizioni imposte dagli oggetti (es. se hai una corda puoi attraversare una connection in salita) si risolvono associando agli oggetti delle skill o feature (quando si raccoglie una corda si attiva la feature "scalata" o simili)
Personaggi
I personaggi si dividono in giocanti (PG) e non giocanti (PNG), che derivano dalla medesima classe Character.
Character Deve contenere un nome, una descrizione, razza (elfo, nano, umano, ...) e classe (chierico, mago, ladro, ...), le Features e le skill, memorizzata in TempList, gli spell, quelli attivi in una TempList, uno zaino con roba dentro, dei puntatori mano dx, mano sx, testa ecc. per ospitare armi, elmi, scudi, anelli, diademi, ecc.
PG Deve inoltre contenere le quest del personaggio, traccia di quelle già fatte e i punti esperienza.
PNG
Deve avere una lista Dialoghi da fare, ordinata in base alle caratteristiche del PG (un PG esperto farà dialoghi più profondi e accederà a quest più difficili :).
Oggetti
Dialoghi
I dialoghi sono il punto distintivo di questo MUD. Anche i png fanno dialoghi sensati ed interattivi. I dialoghi sono tutti salvati nel db e vengono caricati in memoria a bisogna. Ogni dialogo è formato da frasi.
Dialog
Il dialogo ha dei permessi per essere sentito ed un link alla frase iniziale.
Phrase
La frase ha un testo che la rappsenta e una lista di possibili risposte. Ogni risposta viene presentata solo se consentito dai permessi di ogni risposta.
Answer
Contiene un testo, degli accessi per decidere se visualizzarla, un'azione che il personaggio parlante fa e un puntatore alla frase successiva.
Esempio:
Dialogo n° 45:(lo possono sentire solo gli elfi ricchioni). La prima frase è la n° 123
Frase n° 123: "Vai a baciare l'orco omofobico". Risposte possibili: "Va bene", "Fottiti"
Risposta "Va bene": vai alla frase n° 324.
Risposta "Fottiti": azione -> attacca (il png che stà dicendo il dialogo attacca il personaggio).
Quest
Vediamo una quest come una "maglietta" che il pg indossa, su cui ci sono scritti i dialoghi dei png (personaggi non giocanti) che incontra e le informazioni sull'avanzamento della quest (persone uccise, oggetti trovati, membra smembrate, posti visitati etc.).
Ci sono due tipi di quest all'interno del mud:
- quelle autogenerate;
- quelle create ad hoc dagli amministratori.
Create ad hoc
Le scritte sulla maglietta sono create da un amministratore (probabilmente tramite interfaccia web). L'amministratore potendo creare i dialoghi e potendo scegliere chi e in che situazione li pronuncia, può creare qualsiasi tipo di avventura.
Autogenerate
Una funzione si occupa di creare una quest in base a determinati modelli. Ad esempio:
- Vai a prendere quell'oggetto e portamelo.
- Uccidi dolorosamente tizio, caio e sempronio (che saranno di una gilda avversa e alla portata).
- etc.