Skip to content

Instantly share code, notes, and snippets.

@valda
Created June 9, 2011 02:57
Show Gist options
  • Save valda/1015963 to your computer and use it in GitHub Desktop.
Save valda/1015963 to your computer and use it in GitHub Desktop.
CTAddPose 派生 mod から、ポーズ名称,kf/nif のパス等を yaml にダンプするスクリプト 要 WryeBash
# -*- mode: python; coding: utf-8-dos -*-
import sys
from optparse import OptionParser
import re
import yaml
import bosh
from bolt import GPath
parser = OptionParser(usage="usage: %prog [options] CTAddPose_Variant.esp")
parser.add_option("-o", dest="outfile", help="Output file path", metavar="FILE")
(opts, args) = parser.parse_args(sys.argv)
if len(args) != 2:
parser.print_help()
exit()
# bosh の初期化
bosh.initBosh()
bosh.initSettings()
bosh.modInfos = bosh.ModInfos()
bosh.modInfos.refresh()
class CtAddPoseReader:
def __init__(self,mod):
self.data = []
fileInfo = bosh.ModInfo(bosh.modInfos.dir, GPath(mod))
recClasses = (bosh.MreIdle,bosh.MreAnio,bosh.MreScpt)
loadFactory = bosh.LoadFactory(False,*recClasses)
self.modFile = bosh.ModFile(fileInfo,loadFactory)
self.modFile.load(True)
self.readPoses()
self.parseScript()
def readPoses(self):
'''メニューの major,minor ナンバーから kf/nif のパスへの dic を作成'''
animid_anios = {}
for rec in self.modFile.ANIO.getActiveRecords():
animid_anios[rec.animationId] = rec
self.majorminor_poses = {}
reEid = re.compile('^CTAddPose(\d{2})(\d{2})$', re.I)
for rec in self.modFile.IDLE.getActiveRecords():
m = reEid.match(rec.eid)
if m:
pose = {'path_kf':rec.model.modPath}
anio = animid_anios.get(rec.fid,None)
if anio:
pose['path_ob'] = anio.model.modPath
self.majorminor_poses[(int(m.group(1)), int(m.group(2)))] = pose
def parseScript(self):
def getMessageBoxArgs(scriptText, major):
re1 = re.compile('if major == %d(.*)elseif major == %d' % (major, major+1), re.M|re.S|re.I)
re2 = re.compile('^\s*MessageBox\s+"(.*)"\s*$', re.M|re.I)
re3 = re.compile(r'"\s*,\s*"')
m1 = re1.search(scriptText)
if m1:
m2 = re2.search(m1.group(1))
if m2:
return re3.split(m2.group(1))
return []
for rec in self.modFile.SCPT.getActiveRecords():
if rec.eid == 'a000CTAddPoseQuestScript':
scriptText = rec.scriptText
for major,majorName in enumerate(getMessageBoxArgs(scriptText, -1)[3:]):
poses = []
for minor, minorName in enumerate(getMessageBoxArgs(scriptText, major)[2:]):
pose = self.majorminor_poses.get((major, minor), None)
if pose:
pose['name'] = minorName.decode('mbcs')
poses.append(pose)
self.data.append({'group': majorName.decode('mbcs'), 'poses': poses})
break
def toYaml(self,e='utf8'):
return yaml.dump(self.data, encoding=e, allow_unicode=True, default_flow_style=False)
ctaddpose = CtAddPoseReader(args[1])
if opts.outfile:
with open(opts.outfile, 'w') as out:
out.write(ctaddpose.toYaml())
else:
print ctaddpose.toYaml('mbcs')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment