summaryrefslogtreecommitdiff
path: root/hercules/code/server/npcs.py
blob: 7157c314bf6ab912fe0c45fc9c535bdd88cc87bd (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# -*- coding: utf8 -*-
#
# Copyright (C) 2014  Evol Online
# Author: Andrei Karas (4144)

import re

from code.fileutils import *
from code.stringutils import *

mapsConfFile = "newserverdata/conf/maps.conf"
mapsIndexFile = "newserverdata/db/map_index.txt"
mapsIndex = 1
scriptRe = re.compile("^(?P<map>[^/](.+))[.]gat,([ ]*)(?P<x>[\d]+),([ ]*)(?P<y>[\d]+),([ ]*)(?P<dir>[\d]+)(|,(?P<gender>[\d]+))" +
    "[\t](?P<tag>script)[\t](?P<name>[\w#' ]+)[\t]"
    "(?P<class>[\d]+)((,((?P<xs>[\d]+),(?P<ys>[\d]+)))|)(|;(?P<size>[\d]+))(|,|;){$")

class ScriptTracker:
    pass

def convertNpcs():
    processNpcDir("oldserverdata/npc/", "newserverdata/npc/")

def processNpcDir(srcDir, dstDir):
    makeDir(dstDir)
    files = os.listdir(srcDir)
    for file1 in files:
        if file1[0] == '.':
            continue
        srcPath = os.path.abspath(srcDir + os.path.sep + file1)
        dstPath = os.path.abspath(dstDir + os.path.sep + file1)
        if not os.path.isfile(srcPath):
            processNpcDir(srcPath, dstPath)
        else:
            if file1[-5:] == ".conf" or file1[-4:] == ".txt":
                processNpcFile(srcPath, dstPath)

def processNpcFile(srcFile, dstFile):
#    print "file: " + srcFile
    tracker = ScriptTracker()
    tracker.insideScript = False
    with open(srcFile, "r") as r:
        with open(dstFile, "w") as w:
            tracker.w = w
            for line in r:
                tracker.line = line
                res = convertTextLine(tracker)
                if res:
                    w.write(tracker.line)

def convertTextLine(tracker):
    line = tracker.line
    if line[:5] == "map: ":
        processScriptMapLine(line)
        return False
    idx = line.find("\tscript\t")
    if idx >= 0:
        processScript(tracker)
        return False
    return True

def processScriptMapLine(line):
    global mapsIndex
    line = stripNewLine(line)
    if line[-4:] == ".gat":
        line = line[:-4]
    with open(mapsConfFile, "a") as w:
        w.write(line + "\n")

    with open(mapsIndexFile, "a") as w:
        w.write("{0} {1}\n".format(line, mapsIndex))
    mapsIndex = mapsIndex + 1

def processScript(tracker):
    line = tracker.line
    w = tracker.w
    if line[:9] == "function\t":
        tracker.w.write(line)
        return

    m = scriptRe.search(line)
    if m == None:
        print "error in parsing: " + line
        w.write("!!!error parsing line")
        w.write(line)
        return
#    print "source=" + line[:-1]
#    print "map={0} x={1} y={2} dir={3} gender={4} tag={5} name={6} class={7}, xs={8}, ys={9}, size={10}".format(
#        m.group("map"), m.group("x"), m.group("y"), m.group("dir"), m.group("gender"),
#        m.group("tag"), m.group("name"), m.group("class"), m.group("xs"), m.group("ys"), m.group("size"))

    if m.group("gender") != None:
        w.write("// Gender = {0}\n".format(m.group("gender")));
    if m.group("size") != None:
        w.write("// Size = {0}\n".format(m.group("size")));

    if m.group("x") == 0 and m.group("y") == 0 and m.group("class") == 0: # float npc
        w.write("-")
    else:
        w.write("{0},{1},{2},{3}".format(m.group("map"), m.group("x"), m.group("y"), m.group("dir")))
    w.write("\tscript\t{0}\t{1}".format(m.group("name"), m.group("class")));

    if m.group("xs") != None:
        w.write(",{0},{1}".format(m.group("xs"), m.group("ys")));
    w.write(",{\n");