永い後日談のネクロニカ ココフォリア フォーマットコンバータ

記事投稿がかなりご無沙汰ですが

ネクロニカのキャラクターシートといえば
「キャラクターシート保管所様」ですが
キャラシを手動管理する点においてはお世話になっていますが
管理しているデータを他のオンラインツールで参照する際は別で
窓を開いてキャラシを確認してセッションを行うわけですが
結構手間な上間違ってキャラシページを閉じてしまったりあまり
セッションしながらキャラシを運用するのには向いてないように
思います
つい最近ココフォリアでネクロニカを遊ぶ機会が多く
セッション中だけでもいいからココフォリアのみでデータ管理を
簡単にすべく今回のクラスを作りました
ココフォリア上でのネクロニカの駒のフォーマットも同時に定義
していますがあくまで私個人がこの形で運用するのがいいのでは
ないかという判断で作成しています

基本的な使い方としては下記クラスにキャラクターシート保管所様より
ココフォリアフォーマット化したいキャラクターのテキストデータを出力して
テキストをファイルに保存して
保存したファイルを下記クラスに渡してClip_Out()を実行すれば
ココフォリア用のデータに変換されたデータがクリップボードに
書き込まれますので
ココフォリアを開いて盤面上の右クリックメニューから貼り付けを実行すると
盤面に駒が生成されます。

改善点等ありましたら是非お聞かせください


```Python
import pyperclip

class charsheet:
    mpdat = []#読み込んだかけらを名前と内容に分けた配列が入る
    mntxt = []#１行ずつ読み込んだマニューバの文字列が入る
    mndat = []#マニューバを各項目で分割したデータ配列が入る
    pntxt = ""#名前が入る
    potxt = ""#ポジションが入る
    cmtxt = ""#メインクラスが入る
    cstxt = ""#サブクラスが入る
    antxt = ""#暗示が入る
    intxt = ""#行動値が入る
    lptxt = ""#寵愛点が入る
    oltxt = ""#年齢が入る
    bupnt = ""#武装レベル
    hepnt = ""#変異レベル
    kapnt = ""#改造レベル
    memotxt = ""#シートのメモが入る
    pts = {}
    chp = ""
    fp = ""
    def __init__(self,path:str):
        with open(path,'r',encoding='utf-8-sig')as r:
            self.fp = r.read().replace('　',' ')
        self.mn()
        self.mp()
        self.pd()
        self.plv()
        self.memo()
        self.mns()
        self.chp()

    def chp(self):
        self.chp = '1NC 行動判定\n1NC +1 行動判定\n1NC +2 行動判定\n1NC +3 行動判定\n'
        self.chp += '1NC 対話判定\n1NC +1 対話判定\n1NC +2 対話判定\n1NC +3 対話判定\n'
        self.chp += '1NC 狂気判定\n1NC +1 狂気判定\n1NC +2 狂気判定\n1NC +3 狂気判定\n'
        self.chp += '1NA 攻撃判定\n1NA +1 攻撃判定\n1NA +2 攻撃判定\n1NA +3 攻撃判定\n'
        for i in self.mntxt:
            self.chp += str(i) + '\n'

    def plv(self):
        for i in self.fp.splitlines()[18:]:
            if '=合計=' in i:
                pnt = i.replace('   ',' ').split(' ')
                self.bupnt = pnt[1]
                self.hepnt = pnt[2]
                self.kapnt = pnt[3]
                break

    def mp(self):
        data = str(self.fp).replace('   ','|').replace('  ','|').replace('|||','|').replace('||','|').splitlines()
        for i in data[18:]:
            if len(i)==0:
                break
            line = i.split('|')
            if len(line) == 1:
                self.mpdat.append([line[0],'NO DATA'])
            else:
                self.mpdat.append(line)

    def mn(self):
        data = self.fp.splitlines()
        mnbool = False
        lines = []
        for i in data[18:]:
            if '[部位]' in i:
                mnbool = True
            if len(i) == 0:
                mnbool = False
            if mnbool and not '[部位]' in i and not i[:2] == '[]':
                lines.append(i.replace(' ',''))
        self.mntxt = lines
    def pd(self):

        data = self.fp.splitlines()[:19]
        self.pntxt = data[1].split('：')[1]
        self.oltxt = data[4].split('：')[1]
        self.intxt = data[12].split('：')[1]
        self.potxt = data[9].split('：')[1]
        self.cmtxt = data[10].split('：')[1].replace(' / ',':').split(':')[0]
        self.cstxt = data[10].split('：')[1].replace(' / ', ':').split(':')[1]
        self.antxt = data[16].split('：')[1]
        for i in self.fp.splitlines():
            if '寵愛点：' in i:
                self.lptxt = i.split('：')[1].replace('点','')

    def memo(self):
        data = self.fp.splitlines()
        for c,i in enumerate(data):
            if 'メモ：' in i:
                memo = data[c:]
                temp = ''
                for j in memo:
                    temp += str(j + '\n')
                self.memotxt = temp

    def mns(self):
        temp = []
        dict = {'[頭]':0,'[腕]':0,'[胴]':0,'[脚]':0,'[ポジション]':0,'[メインクラス]':0,'[サブクラス]':0}
        for i in self.mntxt:
            temp.append(i.replace(']',']:').split(':'))
        self.mndat = temp
        for i in temp:
            if len(i[0]) > 0:
                dict[i[0]] += 1
        self.pts = dict
    def Clip_Out(self):
        data = {}
        mpd = ''
        mnd = ''
        for i in self.mpdat:
            mpd += f'{i[0]}:{i[1]}\n'
        for i in self.mntxt:
            mnd += i + '\n'
        memodat =   f'カルマ\nシナリオ:\n戦闘:\n\nきおくのかけら一覧\n{mpd}\nマニューバ一覧\n{mnd}\n破損パーツ一覧\n\nその他\n{self.memotxt}'
        data.setdefault('kind', 'character')
        status = [{'label': '記憶のかけら', 'max': len(self.mpdat)},
                  {'label': '頭D10-10', 'value': self.pts['[頭]'], 'max': self.pts['[頭]']},
                  {'label': '腕D10-09', 'value': self.pts['[腕]'], 'max': self.pts['[腕]']},
                  {'label': '胴D10-08', 'value': self.pts['[胴]'], 'max': self.pts['[胴]']},
                  {'label': '脚D10-07', 'value': self.pts['[脚]'], 'max': self.pts['[脚]']},
                  {'label': 'PC1への未練', 'value': 3, 'max': 4},
                  {'label': 'PC2への未練', 'value': 3, 'max': 4},
                  {'label': 'PC3への未練', 'value': 3, 'max': 4},
                  {'label': 'PC4への未練', 'value': 3, 'max': 4},
                  {'label': 'たからものへの未練', 'value': 3, 'max': 4}]
        params = [{'label': self.potxt, 'value': self.potxt},
                  {'label': self.cmtxt, 'value': self.cmtxt},
                  {'label': self.cstxt, 'value': self.cstxt},
                  {'label': '武装', 'value': self.bupnt},
                  {'label': '変異', 'value': self.hepnt},
                  {'label': '改造', 'value': self.kapnt},
                  {'label': '寵愛', 'value': self.lptxt}]
        data.setdefault('data', {'name': self.pntxt,
                                 'initiative': int(self.intxt),
                                 'memo': memodat,
                                 'commands':self.chp,
                                 'status': status,
                                 'params': params})
        pyperclip.copy(str(data).replace('\'', '"'))
```