def check_max_global_quantity(self): from src.database import database if self.max_global_quantity <= 0: return code = self.code + "#" counter = 0 for en in database[self.ACCESS_ATTR.replace("proto_", "")].itervalues(): if en.code.startswith(code): counter += en.quantity if counter > self.max_global_quantity: log.booting("Il prototipo %s si trova istanziato %d volte ma il suo massimo sarebbe %d" % ( self.code, counter, self.max_global_quantity))
def check_max_global_quantity(self): from src.database import database if self.max_global_quantity <= 0: return code = self.code + "#" counter = 0 for en in database[self.ACCESS_ATTR.replace("proto_", "")].itervalues(): if en.code.startswith(code): counter += en.quantity if counter > self.max_global_quantity: log.booting( "Il prototipo %s si trova istanziato %d volte ma il suo massimo sarebbe %d" % (self.code, counter, self.max_global_quantity))
def load_wild(): """ Carica l'immagine relative alla wild, le altitudini e i settori. """ log.booting("-> altitudes") altitudes_file_path = "wild/altitudes.png" try: altitudes_image = Image.open(altitudes_file_path) except IOError: log.bug("Impossibile aprire l'immagine %s" % altitudes_file_path) return log.booting("-> sectors") sectors_file_path = "wild/sectors.png" try: sectors_image = Image.open(sectors_file_path) except IOError: log.bug("Impossibile aprire l'immagine %s" % sectors_file_path) return global wild_width global wild_height global wild_altitudes global wild_sectors wild_width = altitudes_image.size[0] wild_height = altitudes_image.size[1] # Inizializza le liste multidimensionali alla grandezza dell'immagine wild_altitudes = [[0 for y in xrange(wild_height)] for x in xrange(wild_width)] wild_sectors = [[SECTOR.SEA for y in xrange(wild_height)] for x in xrange(wild_width)] # Ricava tutte le informazioni dai colori delle immagini for pixel in altitudes_image.getdata(): if pixel in altitude_colors: # (BB) erroraccio per x e y wild_altitudes[x][y] = altitude_colors[pixel] for pixel in sectors_image.getdata(): if pixel in sector_colors: # (BB) erroraccio per x e y wild_sectors[x][y] = sector_colors[pixel] # Converte le liste in tuple wild_altitudes = tuple(wild_altitudes) wild_sectors = tuple(wild_sectors)
def _import_all_gamescripts(root_name, dir_names, import_gamescripts_function): """ Cerca i moduli python tra i dati e prova a caricarli come gamescripts. """ if not root_name: log.bug("root_name non è un parametro valido: %r" % root_name) return if not dir_names: log.bug("dir_names non è un parametro valido: %r" % dir_names) return if not import_gamescripts_function: log.bug("import_gamescripts_function non è un parametro valido: %r" % import_gamescripts_function) return # ------------------------------------------------------------------------- for dir_name in dir_names: log.booting("-> %s" % dir_name) folder_name = "%s/%s" % (root_name, dir_name) for root, dirs, files in os.walk(folder_name): for filename in files: if filename[0] == "_" or not filename.endswith(".py"): continue code = os.path.splitext(filename)[0] if not code: log.bug( "Il nome del file %s/%s del dato non è valido: %r" % (root, filename, code)) continue if code not in database[dir_name]: log.bug( "Il dato con il codice %s non è stato caricato nel database." % code) # Nonostante sia intercorso un errore non interrompe il # ciclo provando comunque a caricare i gamescript data = database[dir_name][code] data.gamescripts = import_gamescripts_function(data)
def check_for_icon_files(self): for attr_name in ("icon", "icon_night"): path = getattr(self, attr_name) if path and not os.path.isfile("www/" + path): log.booting("File d'immagine inesistente per l'%s: %s" % (attr_name, "www/" + path))
def start(self, seconds=0): log.booting("-> %s" % self.__class__.__name__) if seconds == 0: attr_name = from_capitalized_words(self.__class__.__name__) + "_seconds" seconds = getattr(config, attr_name) super(UnstoppableLoop, self).start(seconds)
def check_for_icon_files(self): for attr_name in ("icon", "icon_night"): path = getattr(self, attr_name) if path and not os.path.isfile("www/" + path): log.booting("File d'immagine inesistente per l'%s: %s" % ( attr_name, "www/" + path))
def start(self): from src.calendar import calendar from src.config import config from src.database import database from src.log import log starting_time = time.time() self.booting = True log.platform_infos() print "Cancella tutti i file compilati per forzarne la ricompilazione" remove_compiled_files() try: # Dona maggiori informazioni sotto gli OS Linux e simili log.booting("Avvio del gioco sul server %s per l'utente %s al gruppo %s" % (socket.gethostname(), os.geteuid(), os.getgid())) except: log.booting("Avvio del gioco sul server %s" % socket.gethostname()) log.booting("===========================================================================") log.booting("Carica il file di configurazione %s" % self.options.config_filename) config.load(self.options.config_filename) self.check_the_mode() log.booting("Carica la data del calendario gdr") calendar.load() from src.entity import load_little_words log.booting("Carica da file le little words da utilizzare per filtrare le keywords") load_little_words() from src.account import load_forbidden_names log.booting("Carica da file la lista dei nomi proibiti per nuovi account e giocatori") load_forbidden_names() log.booting("Carica tutti gli input nelle differenti lingue") from src.database import fread_list from src.input import Input import src.interpret as interpret_module interpret_module.inputs_command_it = fread_list("data/inputs_command_it.list", Input, "inputs_command_it[%d]") interpret_module.inputs_command_en = fread_list("data/inputs_command_en.list", Input, "inputs_command_en[%d]") interpret_module.inputs_skill_it = fread_list("data/inputs_skill_it.list", Input, "inputs_skill_it[%d]") interpret_module.inputs_skill_en = fread_list("data/inputs_skill_en.list", Input, "inputs_skill_en[%d]") interpret_module.inputs_social_it = fread_list("data/inputs_social_it.list", Input, "inputs_social_it[%d]") interpret_module.inputs_social_en = fread_list("data/inputs_social_en.list", Input, "inputs_social_en[%d]") # (TD) per ora inutilizzato #from grammar import vocabulary, EntryWord #log.booting("Caricamento del vocabolario grammaticale") #vocabulary = fread_list("data/vocabulary.list", EntryWord, "vocabulary[%d]") from src.database import database log.booting("Carica il Database:") database.load(use_spelling=self.options.spelling) from src.gamescript import create_init_files log.booting("Si assicura dell'esistenza dei file __init__ per importare i gamescript") create_init_files("data", ("proto_rooms", "proto_mobs", "proto_items")) create_init_files("persistence", ("rooms", "mobs", "items", "players")) from src.gamescript import import_all_proto_gamescripts log.booting("Aggiunge i riferimenti ai gamescript dei dati prototipo") import_all_proto_gamescripts("data", ("proto_rooms", "proto_mobs", "proto_items")) from src.gamescript import import_all_instance_gamescripts log.booting("Aggiunge i riferimenti ai gamescript dei dati delle istanze") import_all_instance_gamescripts("persistence", ("rooms", "mobs", "items")) import_all_instance_gamescripts("data", ("players", )) from src.gamescript import import_all_area_gamescripts log.booting("Aggiunge i riferimenti ai gamescript delle aree") import_all_area_gamescripts() from src.games.wumpus import import_all_wumpus_gamescripts log.booting("Aggiunge i riferimenti ai gamescript delle aree wumpus") import_all_wumpus_gamescripts() from src.site import site log.booting("Prepara il web server del gioco") reactor.listenTCP(config.http_port, site) from src.forum_db import forum_db log.booting("Carica il Forum") forum_db.load() # (TD) molto in futuro saranno più di una from src.wild import load_wild log.booting("Carica le informazioni sulla Wild") #load_wild() from src.element import create_elements_list_page log.booting("Crea dinamicamente la pagina web della lista degli elementi") create_elements_list_page() from src.fight import create_damages_page log.booting("Crea dinamicamente la pagina web della lista dei danni") create_damages_page() from src.reset import finalize_room_resets log.booting("Inizializza eventuali valori impliciti nella date dei reset.") finalize_room_resets() from src.reset import start_repop_laters log.booting("Prepara le informazioni di repop per tutti i dati caricati dalla persistenza") start_repop_laters() from src.reset import defer_all_reset_events log.booting("Prepara le aree in gioco eseguendo i primi reset.") defer_all_reset_events() from src.entitypes.plant import restart_all_planting log.booting("Rinizia da capo eventuali stadi di crescita lasciati a metà dal precedente shutdown.") restart_all_planting() from src.loops.aggressiveness import aggressiveness_loop from src.loops.blob import blob_loop from src.entitypes.corpse import decomposer_loop from src.loops.digestion import digestion_loop from src.fight import fight_loop from src.game import game_loop from src.maintenance import maintenance_loop from src.behaviour import room_behaviour_loop log.booting("Avvia tutti i loop") aggressiveness_loop.start() blob_loop.start() decomposer_loop.start() digestion_loop.start() fight_loop.start() game_loop.start() maintenance_loop.start() room_behaviour_loop.start() from src.gamescript import triggering_on_booting log.booting("Attivazione dei trigger on_booting") triggering_on_booting() log.booting("Finalizza e controlla la configurazione caricata precedentemente.") config.finalize() config.get_error_message() log.booting("Esegue un controllo al nome dei metodi della singleton log.") log.check_log_methods() # Se sono stati trovati degli errori sui riferimenti, controllati dal # metodo _search_the_reference o altri tipo di errori pesanti o # bloccanti, allora blocca il boot del gioco, a meno che non sia stato # avviato ignorando esplicitamente tale cosa if self.critical_errors > 0: if self.critical_errors > 1: message = "Sono stati riscontrati %d errori critici" % self.critical_errors elif self.critical_errors == 1: message = "E' stato riscontrato 1 errore critico" log.booting("===>> %s al caricamento del Gioco (ignora l'eventuale blocco dell'avvio con l'opzione d'avvio -i) <<===" % message) if self.options.mode == "official" and not self.options.ignore: sys.exit(1) log.booting("allow_web_robots=%s: le pagine %sverranno indicizzate dai motori di ricerca" % ( config.allow_web_robots, "NON " if not config.allow_web_robots else "")) self.boot_seconds = time.time() - starting_time log.booting("Esecuzione del boot in %d secondi" % self.boot_seconds) from src.color import remove_colors log.booting("Il gioco %s è pronto alla porta http %d" % (remove_colors(config.game_name), config.http_port)) if self.options.boot_only: print "Esecuzione del solo boot terminata." sys.exit(0) log.booting("===========================================================================") self.booting = False try: if config.use_profiler: log.booting("%s è stato avviato in modalità di profiling" % remove_colors(config.game_name)) now = datetime.datetime.now() cProfile.run("from twisted.internet import reactor; reactor.run()", "profile_%dy_%dm_%dd_%dh_%dm_%ds.results" % ( now.year, now.month, now.day, now.hour, now.minute, now.second)) else: reactor.run() except (KeyboardInterrupt, SystemExit): # Sono eccezioni accettabili e non comportano il reboot automatico pass except: self.automatic_reboot = True finally: self.stop() # Nel qual caso vi sia stato un'eccezione sconosciuta e che il # gioco sia quello ufficiale (e quindi è sottinteso che debba # sempre rimanere up and running) allora tenta di riavviarlo # con le stesse opzioni utilizzate per questa istanza morente if self.automatic_reboot and self.options.mode == "official": os.system("%s %s" % (sys.executable, " ".join(sys.argv)))
def start(self): from src.calendar import calendar from src.config import config from src.database import database from src.log import log starting_time = time.time() self.booting = True log.platform_infos() print "Cancella tutti i file compilati per forzarne la ricompilazione" remove_compiled_files() try: # Dona maggiori informazioni sotto gli OS Linux e simili log.booting( "Avvio del gioco sul server %s per l'utente %s al gruppo %s" % (socket.gethostname(), os.geteuid(), os.getgid())) except: log.booting("Avvio del gioco sul server %s" % socket.gethostname()) log.booting( "===========================================================================" ) log.booting("Carica il file di configurazione %s" % self.options.config_filename) config.load(self.options.config_filename) self.check_the_mode() log.booting("Carica la data del calendario gdr") calendar.load() from src.entity import load_little_words log.booting( "Carica da file le little words da utilizzare per filtrare le keywords" ) load_little_words() from src.account import load_forbidden_names log.booting( "Carica da file la lista dei nomi proibiti per nuovi account e giocatori" ) load_forbidden_names() log.booting("Carica tutti gli input nelle differenti lingue") from src.database import fread_list from src.input import Input import src.interpret as interpret_module interpret_module.inputs_command_it = fread_list( "data/inputs_command_it.list", Input, "inputs_command_it[%d]") interpret_module.inputs_command_en = fread_list( "data/inputs_command_en.list", Input, "inputs_command_en[%d]") interpret_module.inputs_skill_it = fread_list( "data/inputs_skill_it.list", Input, "inputs_skill_it[%d]") interpret_module.inputs_skill_en = fread_list( "data/inputs_skill_en.list", Input, "inputs_skill_en[%d]") interpret_module.inputs_social_it = fread_list( "data/inputs_social_it.list", Input, "inputs_social_it[%d]") interpret_module.inputs_social_en = fread_list( "data/inputs_social_en.list", Input, "inputs_social_en[%d]") # (TD) per ora inutilizzato #from grammar import vocabulary, EntryWord #log.booting("Caricamento del vocabolario grammaticale") #vocabulary = fread_list("data/vocabulary.list", EntryWord, "vocabulary[%d]") from src.database import database log.booting("Carica il Database:") database.load(use_spelling=self.options.spelling) from src.gamescript import create_init_files log.booting( "Si assicura dell'esistenza dei file __init__ per importare i gamescript" ) create_init_files("data", ("proto_rooms", "proto_mobs", "proto_items")) create_init_files("persistence", ("rooms", "mobs", "items", "players")) from src.gamescript import import_all_proto_gamescripts log.booting("Aggiunge i riferimenti ai gamescript dei dati prototipo") import_all_proto_gamescripts( "data", ("proto_rooms", "proto_mobs", "proto_items")) from src.gamescript import import_all_instance_gamescripts log.booting( "Aggiunge i riferimenti ai gamescript dei dati delle istanze") import_all_instance_gamescripts("persistence", ("rooms", "mobs", "items")) import_all_instance_gamescripts("data", ("players", )) from src.gamescript import import_all_area_gamescripts log.booting("Aggiunge i riferimenti ai gamescript delle aree") import_all_area_gamescripts() from src.games.wumpus import import_all_wumpus_gamescripts log.booting("Aggiunge i riferimenti ai gamescript delle aree wumpus") import_all_wumpus_gamescripts() from src.site import site log.booting("Prepara il web server del gioco") reactor.listenTCP(config.http_port, site) from src.forum_db import forum_db log.booting("Carica il Forum") forum_db.load() # (TD) molto in futuro saranno più di una from src.wild import load_wild log.booting("Carica le informazioni sulla Wild") #load_wild() from src.element import create_elements_list_page log.booting( "Crea dinamicamente la pagina web della lista degli elementi") create_elements_list_page() from src.fight import create_damages_page log.booting("Crea dinamicamente la pagina web della lista dei danni") create_damages_page() from src.reset import finalize_room_resets log.booting( "Inizializza eventuali valori impliciti nella date dei reset.") finalize_room_resets() from src.reset import start_repop_laters log.booting( "Prepara le informazioni di repop per tutti i dati caricati dalla persistenza" ) start_repop_laters() from src.reset import defer_all_reset_events log.booting("Prepara le aree in gioco eseguendo i primi reset.") defer_all_reset_events() from src.entitypes.plant import restart_all_planting log.booting( "Rinizia da capo eventuali stadi di crescita lasciati a metà dal precedente shutdown." ) restart_all_planting() from src.loops.aggressiveness import aggressiveness_loop from src.loops.blob import blob_loop from src.entitypes.corpse import decomposer_loop from src.loops.digestion import digestion_loop from src.fight import fight_loop from src.game import game_loop from src.maintenance import maintenance_loop from src.behaviour import room_behaviour_loop log.booting("Avvia tutti i loop") aggressiveness_loop.start() blob_loop.start() decomposer_loop.start() digestion_loop.start() fight_loop.start() game_loop.start() maintenance_loop.start() room_behaviour_loop.start() from src.gamescript import triggering_on_booting log.booting("Attivazione dei trigger on_booting") triggering_on_booting() log.booting( "Finalizza e controlla la configurazione caricata precedentemente." ) config.finalize() config.get_error_message() log.booting( "Esegue un controllo al nome dei metodi della singleton log.") log.check_log_methods() # Se sono stati trovati degli errori sui riferimenti, controllati dal # metodo _search_the_reference o altri tipo di errori pesanti o # bloccanti, allora blocca il boot del gioco, a meno che non sia stato # avviato ignorando esplicitamente tale cosa if self.critical_errors > 0: if self.critical_errors > 1: message = "Sono stati riscontrati %d errori critici" % self.critical_errors elif self.critical_errors == 1: message = "E' stato riscontrato 1 errore critico" log.booting( "===>> %s al caricamento del Gioco (ignora l'eventuale blocco dell'avvio con l'opzione d'avvio -i) <<===" % message) if self.options.mode == "official" and not self.options.ignore: sys.exit(1) log.booting( "allow_web_robots=%s: le pagine %sverranno indicizzate dai motori di ricerca" % (config.allow_web_robots, "NON " if not config.allow_web_robots else "")) self.boot_seconds = time.time() - starting_time log.booting("Esecuzione del boot in %d secondi" % self.boot_seconds) from src.color import remove_colors log.booting("Il gioco %s è pronto alla porta http %d" % (remove_colors(config.game_name), config.http_port)) if self.options.boot_only: print "Esecuzione del solo boot terminata." sys.exit(0) log.booting( "===========================================================================" ) self.booting = False try: if config.use_profiler: log.booting("%s è stato avviato in modalità di profiling" % remove_colors(config.game_name)) now = datetime.datetime.now() cProfile.run( "from twisted.internet import reactor; reactor.run()", "profile_%dy_%dm_%dd_%dh_%dm_%ds.results" % (now.year, now.month, now.day, now.hour, now.minute, now.second)) else: reactor.run() except (KeyboardInterrupt, SystemExit): # Sono eccezioni accettabili e non comportano il reboot automatico pass except: self.automatic_reboot = True finally: self.stop() # Nel qual caso vi sia stato un'eccezione sconosciuta e che il # gioco sia quello ufficiale (e quindi è sottinteso che debba # sempre rimanere up and running) allora tenta di riavviarlo # con le stesse opzioni utilizzate per questa istanza morente if self.automatic_reboot and self.options.mode == "official": os.system("%s %s" % (sys.executable, " ".join(sys.argv)))