3 printf 'gamedata = {\n'
4 for base in mods/fantasycore mods/empyrean_campaign; do
5 find $base/animations $base/engine -name '*.txt' |while read -r file; do
6 file="${file#"${base}"}"
7 printf '"%s": {\n' "$file"
9 # read entire file into buffer
10 :X N; $!bX; s;$;\n;; s;^;\n;; s;\r\n;\n;g;
12 # Comment and empty lines
13 :Y s;\n#[^\n]*\n;\n;g; tY;
17 s;\nINCLUDE ([^\n]+)\n;\n"INCLUDE": "\1"\n;g;
19 # section heading, eg. [stance]
20 s;\n\[([^\n]+)\]\n(([^]\n[]+\n)+);"\1": {\n\2 },\n;g;
23 s;\nframes=[0-9]+\n;\n;g;
24 s;(\nframe=[^\n]+)+;\n"frames": [&;g;
26 # frame list, 8 angles isometric
27 s;frame=[0-9]+,0,([0-9,-]+)\nframe=[0-9]+,1,([0-9,-]+)\nframe=[0-9]+,2,([0-9,-]+)\nframe=[0-9]+,3,([0-9,-]+)\nframe=[0-9]+,4,([0-9,-]+)\nframe=[0-9]+,5,([0-9,-]+)\nframe=[0-9]+,6,([0-9,-]+)\nframe=[0-9]+,7,([0-9,-]+)\n;[[\1], [\2], [\3], [\4], [\5], [\6], [\7], [\8]],\n;g
28 # frame list, workaround for bug in avatar/female/dagger.txt
29 s;frame=[0-9]+,0,([0-9,-]+)\nframe=[0-9]+,1,([0-9,-]+)\nframe=[0-9]+,3,([0-9,-]+)\nframe=[0-9]+,4,([0-9,-]+)\nframe=[0-9]+,5,([0-9,-]+)\nframe=[0-9]+,6,([0-9,-]+)\nframe=[0-9]+,7,([0-9,-]+)\n;[[\1], [\2], [0,0,0,0,0,0], [\3], [\4], [\5], [\6], [\7]],\n;g
30 # frame list, workaround for bug in avatar/male/greatsword.txt
31 s;frame=[0-9]+,0,([0-9,-]+)\nframe=[0-9]+,1,([0-9,-]+)\nframe=[0-9]+,2,([0-9,-]+)\nframe=[0-9]+,3,([0-9,-]+)\nframe=[0-9]+,4,([0-9,-]+)\nframe=[0-9]+,5,([0-9,-]+)\nframe=[0-9]+,7,([0-9,-]+)\n;[[\1], [\2], [\3], [\4], [\5], [\6], [0,0,0,0,0,0], [\7]],\n;g
32 # frame list, workaround for bug in avatar/male/slingshot.txt
33 s;frame=[0-9]+,0,([0-9,-]+)\nframe=[0-9]+,1,([0-9,-]+)\nframe=[0-9]+,2,([0-9,-]+)\nframe=[0-9]+,4,([0-9,-]+)\nframe=[0-9]+,5,([0-9,-]+)\nframe=[0-9]+,6,([0-9,-]+)\nframe=[0-9]+,7,([0-9,-]+)\n;[[\1], [\2], [\3], [0,0,0,0,0,0], [\4], [\5], [\6], [\7]],\n;g
34 # frame list, 6 angles e.g. powers/freeze.txt
35 s;frame=[0-9]+,0,([0-9,-]+)\nframe=[0-9]+,1,([0-9,-]+)\nframe=[0-9]+,2,([0-9,-]+)\nframe=[0-9]+,3,([0-9,-]+)\nframe=[0-9]+,4,([0-9,-]+)\nframe=[0-9]+,5,([0-9,-]+)\n;[[\1], [\2], [\3], [\4], [\5], [\6]],\n;g
36 # frame list, 4 angles e.g. powers/spikes.txt
37 s;frame=[0-9]+,0,([0-9,-]+)\nframe=[0-9]+,1,([0-9,-]+)\nframe=[0-9]+,2,([0-9,-]+)\nframe=[0-9]+,3,([0-9,-]+)\n;[[\1], [\2], [\3], [\4]],\n;g
38 # frame list, 3 angles e.g. powers/quake.txt
39 s;frame=[0-9]+,0,([0-9,-]+)\nframe=[0-9]+,1,([0-9,-]+)\nframe=[0-9]+,2,([0-9,-]+)\n;[[\1], [\2], [\3]],\n;g
40 # frame list, 2 angles e.g. powers/blast.txt
41 s;frame=[0-9]+,0,([0-9,-]+)\nframe=[0-9]+,1,([0-9,-]+)\n;[[\1], [\2]],\n;g
42 # frame list, front angle only
43 s;frame=[0-9]+,0,([0-9,-]+)\n;[[\1]],\n;g
46 s;("frames": []\n,0-9 [-]+),;\1\n],;g;
48 # layer group (in engine/hero_layers.txt)
49 s;\nlayer=[0-9],([^\n]+)\n;\nlayers: [\1]\n;;
51 s;(\nlayers: [^\n]+)\nlayer=[0-9]+,([^\n]+)\n;\1,[\2]\n;;
54 s;(\nlayers: [^\n"]*)([],[])([^\n]*\n);\1"\2"\3;;
57 s;(\nlayers: [^\n]+)""([^\n]+\n);\1\2;;
59 s;\nlayers: "([^\n]+)"\n;\nlayers: [\1],\n;;
62 s;\n(duration)=([0-9]+)ms\n;\n"\1": \2,\n;g
63 s;\n(duration)=([0-9]+)s\n;\n"\1": \2000,\n;g
67 s;\n([^=\n]+)=([0-9-]+)\n;\n"\1": \2,\n;g
70 s;\n([^=\n]+)=([0-9,-]+)\n;\n"\1": [\2],\n;g
73 s;\n([^=\n]+)=([^\n]+)\n;\n"\1": "\2",\n;g