예제 #1
0
파일: data.py 프로젝트: Carlovan/aaritmud
    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))
예제 #2
0
    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))
예제 #3
0
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)
예제 #4
0
파일: wild.py 프로젝트: Carlovan/aaritmud
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)
예제 #5
0
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)
예제 #6
0
 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))
예제 #7
0
파일: loop.py 프로젝트: Onirik79/aaritmud
 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)
예제 #8
0
파일: data.py 프로젝트: Carlovan/aaritmud
 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))
예제 #9
0
파일: engine.py 프로젝트: Carlovan/aaritmud
    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)))
예제 #10
0
    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)))