예제 #1
0
파일: import.py 프로젝트: kalhartt/yadnss
 def import_slevels(self, slevelfiles):
     """Import skilllevels from skillleveltable_characterx.dnt to django models."""
     # Ugly and inefficient
     # Should avoid loading all slevels into memory before parsing
     rows = []
     for f in slevelfiles:
         slevelfile = DNTFile(f)
         log.info('import_slevels\tfile\t%s' % slevelfile.filename)
         slevelfile.read_all()
         log.info('import_slevels\tParsed DNT File')
         rows.extend(slevelfile.rows)
     desc_re = re.compile(r'\{(\d+)\}')
     repl = lambda m: self._uistring[int(m.group(1))]
     # sort the rows so it goes 1-pve, 1-pvp, 2-pve, 2-pvp...
     rows.sort(key=lambda x: (x.SkillLevel, x.id))
     for oldid, newid in self._skillmap.iteritems():
         skill = Skill.objects.filter(id=newid).get()
         flt = lambda x: x.SkillIndex == oldid and x.SkillLevel <= 100
         slevels = filter(flt, rows)
         if len(slevels) < 2 or len(slevels) % 2 != 0:
             continue
         skill.description = self._uistring[slevels[0].SkillExplanationID]
         skill.save(update_fields=['description'])
         sp_cumulative = 0
         for pve, pvp in zip(slevels[::2], slevels[1::2]):
             pve_params = desc_re.sub(repl, pve.SkillExplanationIDParam)
             pvp_params = desc_re.sub(repl, pvp.SkillExplanationIDParam)
             sp_cumulative += pve.NeedSkillPoint
             assert pve.SkillLevel == pvp.SkillLevel, 'Slevel ordering error'
             slevel = SkillLevel(
                 level=pve.SkillLevel,
                 description_params_pve=pve_params,
                 description_params_pvp=pvp_params,
                 required_level=pve.LevelLimit,
                 skill=skill,
                 sp_cost=pve.NeedSkillPoint,
                 sp_cost_cumulative=sp_cumulative,
                 cooldown_pve=pve.DelayTime*0.001,
                 cooldown_pvp=pvp.DelayTime*0.001,
                 mp_cost_pve=pve.DecreaseSP*0.1,
                 mp_cost_pvp=pvp.DecreaseSP*0.1)
             slevel.save()
     log.info('Parsed %d SkillLevels' % SkillLevel.objects.all().count())
예제 #2
0
 def import_slevels(self, slevelfiles):
     """Import skilllevels from skillleveltable_characterx.dnt to django models."""
     # Ugly and inefficient
     # Should avoid loading all slevels into memory before parsing
     rows = []
     for f in slevelfiles:
         slevelfile = DNTFile(f)
         log.info('import_slevels\tfile\t%s' % slevelfile.filename)
         slevelfile.read_all()
         log.info('import_slevels\tParsed DNT File')
         rows.extend(slevelfile.rows)
     desc_re = re.compile(r'\{(\d+)\}')
     repl = lambda m: self._uistring[int(m.group(1))]
     # sort the rows so it goes 1-pve, 1-pvp, 2-pve, 2-pvp...
     rows.sort(key=lambda x: (x.SkillLevel, x.id))
     for oldid, newid in self._skillmap.iteritems():
         skill = Skill.objects.filter(id=newid).get()
         flt = lambda x: x.SkillIndex == oldid and x.SkillLevel <= 100
         slevels = filter(flt, rows)
         if len(slevels) < 2 or len(slevels) % 2 != 0:
             continue
         skill.description = self._uistring[slevels[0].SkillExplanationID]
         skill.save(update_fields=['description'])
         sp_cumulative = 0
         for pve, pvp in zip(slevels[::2], slevels[1::2]):
             pve_params = desc_re.sub(repl, pve.SkillExplanationIDParam)
             pvp_params = desc_re.sub(repl, pvp.SkillExplanationIDParam)
             sp_cumulative += pve.NeedSkillPoint
             assert pve.SkillLevel == pvp.SkillLevel, 'Slevel ordering error'
             slevel = SkillLevel(level=pve.SkillLevel,
                                 description_params_pve=pve_params,
                                 description_params_pvp=pvp_params,
                                 required_level=pve.LevelLimit,
                                 skill=skill,
                                 sp_cost=pve.NeedSkillPoint,
                                 sp_cost_cumulative=sp_cumulative,
                                 cooldown_pve=pve.DelayTime * 0.001,
                                 cooldown_pvp=pvp.DelayTime * 0.001,
                                 mp_cost_pve=pve.DecreaseSP * 0.1,
                                 mp_cost_pvp=pvp.DecreaseSP * 0.1)
             slevel.save()
     log.info('Parsed %d SkillLevels' % SkillLevel.objects.all().count())
예제 #3
0
    def handle(self, *args, **options):
        """Main import function."""
        log.info('skill.management.commands.import')
        filedir = args[0]
        assert os.path.isdir(filedir), 'Argument must be a directory path'
        filename = [os.path.join(filedir, x) for x in _dntlist]
        missing = [x for x in filename if not os.path.isfile(x)]
        assert len(missing) == 0, 'Files %s not found' % missing
        log.info('Resource checks passed.')

        log.info('Cleaning database')
        SkillLevel.objects.all().delete()
        Skill.objects.all().delete()
        Job.objects.all().delete()

        log.info('Beginning Import')
        self.import_uistring(filename[0])
        self.import_jobs(DNTFile(filename[1]))
        self.import_skills(DNTFile(filename[2]))
        self.import_slevels(filename[4:])
        self.import_skilltree(DNTFile(filename[3]))

        log.info('Cleaning Unnessecary Skills')
        Skill.objects.filter(tree_index=None).delete()
예제 #4
0
_SQLTYPEMAP = {
        column.Varchar : sqla.String(255),
        column.Boolean : sqla.Boolean,
        column.Integer : sqla.Integer,
        column.Float : sqla.Float
        }

engine = sqla.create_engine('sqlite:///dnt.db', echo=False)
metadata = sqla.MetaData()

for dnt_filename in dnt_filenames:
    if os.stat(dnt_filename).st_size == 0:
        continue
    
    print dnt_filename
    dntfile = DNTFile(dnt_filename)
    dntfile.read_all()

    ## Column and Table Setup
    table_name = os.path.basename(dnt_filename[:-4])
    table_cols = []
    for col in dntfile.columns:
        if col.name == 'id':
            table_cols.append( sqla.Column('id', sqla.Integer, primary_key=True) )
        else:
            table_cols.append( sqla.Column(col.name, _SQLTYPEMAP[type(col)]) )
    table = sqla.Table(table_name, metadata, *table_cols)
    metadata.create_all(engine)

    col_names = [ x.name for x in dntfile.columns ]
    data = [ dict(zip(col_names, row['data'])) for row in dntfile.rows ]