seems that demo compression causes desync
[awish.git] / tools / labellist.bob
blobd48696d098a219d2fc17eca6ddc30a51caed408a
1 /* coded by Ketmar // Vampire Avalon (psyc://ketmar.no-ip.org/~Ketmar)
2  * Understanding is not required. Only obedience.
3  *
4  * This program is free software. It comes without any warranty, to
5  * the extent permitted by applicable law. You can redistribute it
6  * and/or modify it under the terms of the Do What The Fuck You Want
7  * To Public License, Version 2, as published by Sam Hocevar. See
8  * http://sam.zoy.org/wtfpl/COPYING for more details. */
9 require("fileex");
12 define abort (msg) {
13   writeln("ERROR: ", msg);
14   quit(1);
18 LB_GVAR = 0;
19 LB_TVAR = 1;
20 LB_SVAR = 2;
21 LB_CODE = 3;
22 LB_CONST = 4;
25 types = \[
26   \["GVAR", "findGVarIndex"],
27   \["TVAR", "findTVarIndex"],
28   \["SVAR", "findSVarIndex"],
29   \["CODE", "findPC"],
30   \["CONST", "findConst"]
34 list = \[];
37 fl = new File("awish.vmd", "rb");
38 if (!fl) abort("no code file");
39 sign = fl.readBuf(4);
40 if (sign != "AVM0") abort("invalid code file");
41 csz = fl.readWord();
42 fl.readBuf(csz);
43 lcnt = fl.readWord();
45 //writeln(csz, " ", lcnt);
46 for (local f = 0; f < lcnt; ++f) {
47   local type = fl.getc(), value, name, nlen, vname, v;
48   //
49   if (type == LB_GVAR || type == LB_TVAR) {
50     value = fl.getc();
51   } else if (type == LB_CODE) {
52     value = fl.readWord();
53   } else if (type == LB_CONST) {
54     value = fl.readWord();
55     if (value >= 32768) value -= 65536;
56   } else {
57     abort("invalid code file");
58   }
59   nlen = fl.getc();
60   name = fl.readBuf(nlen);
61   for (local f = 0; f < name.length; ++f) name[f] ^= 0xa5;
62   vname = ""+name;
63   for (local f = 0; f < vname.length; ++f) {
64     local ch = vname[f];
65     //
66     if (ch != '_') {
67       if (ch < '0' || (ch > '9' && ch < 'A') || (ch > 'Z' && ch < 'a')) ch = '_';
68     }
69     vname[f] = ch;
70   }
71   vname = types[type][0]+"_"+vname.toUpper();
72   v = \[type, name, vname];
73   list.push(v);
76 fl.close();
79 fo = new File("vm_gamelabels.h", "w");
80 foreach (local v with list.items()) {
81   fo.writeln("extern int %s;".format(v[2]));
83 fo.close();
85 fo = new File("vm_gamelabelsdef.c", "w");
86 foreach (local v with list.items()) {
87   fo.writeln("int %s;".format(v[2]));
89 fo.close();
91 fo = new File("vm_gamelabelsinit.c", "w");
92 foreach (local v with list.items()) {
93   fo.writeln("  %s = %s(\"%s\");".format(v[2], types[v[0]][1], v[1]));
95 fo.close();