mirror of
https://github.com/ddnet/ddnet.git
synced 2024-11-10 01:58:19 +00:00
214 lines
4.9 KiB
Python
214 lines
4.9 KiB
Python
import os, imp, sys
|
|
import datatypes
|
|
import content
|
|
import network
|
|
|
|
|
|
def create_enum_table(names, num):
|
|
lines = []
|
|
lines += ["enum", "{"]
|
|
lines += ["\t%s=0,"%names[0]]
|
|
for name in names[1:]:
|
|
lines += ["\t%s,"%name]
|
|
lines += ["\t%s" % num, "};"]
|
|
return lines
|
|
|
|
gen_content_header = False
|
|
gen_content_source = True
|
|
|
|
|
|
# collect sprites
|
|
sprites = []
|
|
for set in content.Sprites:
|
|
sprites += set.sprites
|
|
|
|
|
|
if gen_content_header:
|
|
|
|
print """
|
|
struct SOUND
|
|
{
|
|
int id;
|
|
const char *filename;
|
|
};
|
|
|
|
struct SOUNDSET
|
|
{
|
|
int num_sounds;
|
|
SOUND *sound;
|
|
};
|
|
|
|
struct IMAGE
|
|
{
|
|
int id;
|
|
const char *filename;
|
|
};
|
|
|
|
struct SPRITESET
|
|
{
|
|
IMAGE *image;
|
|
int gridx;
|
|
int gridy;
|
|
};
|
|
|
|
struct SPRITE
|
|
{
|
|
SPRITESET *set;
|
|
int x, y, w, h;
|
|
};
|
|
|
|
"""
|
|
|
|
def generate_struct(this, name, parent_name):
|
|
print "struct %s" % name
|
|
|
|
print "{"
|
|
if parent_name:
|
|
print "\t%s base;" % parent_name
|
|
for var in this.fields[this.baselen:]:
|
|
for l in var.emit_declaration(): print "\t"+l
|
|
print "};"
|
|
|
|
generate_struct(content.WeaponBase, "WEAPONSPEC", None)
|
|
for weapon in content.Weapons:
|
|
generate_struct(weapon, "WEAPONSPEC_%s"%weapon.name.upper(), "WEAPONSPEC")
|
|
|
|
# generate enums
|
|
for l in create_enum_table(["SOUND_"+o.name.upper() for o in content.Sounds], "NUM_SOUNDS"): print l
|
|
for l in create_enum_table(["IMAGE_"+o.name.upper() for o in content.Images], "NUM_IMAGES"): print l
|
|
for l in create_enum_table(["SPRITE_"+o.name.upper() for o in sprites], "NUM_SPRITES"): print l
|
|
|
|
for l in create_enum_table(["WEAPONTYPE_"+o.name.upper() for o in content.Weapons], "NUM_WEAPONTYPES"): print l
|
|
|
|
if gen_content_source:
|
|
# generate data
|
|
for s in content.Sounds:
|
|
print "static SOUND sounds_%s[%d] = {" % (s.name, len(s.files))
|
|
for filename in s.files:
|
|
print '\t{%d, "%s"},' % (-1, filename)
|
|
print "};"
|
|
|
|
print "static SOUNDSET soundsets[%d] = {" % len(content.Sounds)
|
|
for s in content.Sounds:
|
|
print "\t{%d, sounds_%s}," % (len(s.files), s.name)
|
|
#for filename in s.files:
|
|
# print "\t{%d, '%s'}," % (-1, filename)
|
|
print "};"
|
|
|
|
print "static IMAGE images[%d] = {" % len(content.Images)
|
|
for i in content.Images:
|
|
print '\t{%d, "%s"},' % (-1, i.filename)
|
|
print "};"
|
|
|
|
print "static SPRITESET spritesets[%d] = {" % len(content.Sprites)
|
|
for set in content.Sprites:
|
|
if set.image:
|
|
print '\t{&images[IMAGE_%s], %d, %d},' % (set.image.upper(), set.grid[0], set.grid[1])
|
|
else:
|
|
print '\t{0, %d, %d},' % (set.grid[0], set.grid[1])
|
|
print "};"
|
|
|
|
print "static SPRITE sprites[%d] = {" % len(sprites)
|
|
spritesetid = 0
|
|
for set in content.Sprites:
|
|
for sprite in set.sprites:
|
|
print '\t{&spritesets[%d], %d, %d, %d, %d},' % (spritesetid, sprite.pos[0], sprite.pos[1], sprite.pos[2], sprite.pos[3])
|
|
spritesetid += 1
|
|
print "};"
|
|
|
|
for weapon in content.Weapons:
|
|
print "static WEAPONSPEC_%s weapon_%s = {" % (weapon.name.upper(), weapon.name)
|
|
for var in weapon.fields:
|
|
for l in var.emit_definition(): print "\t"+l,
|
|
print ","
|
|
print "};"
|
|
|
|
print "struct WEAPONS"
|
|
print "{"
|
|
print "\tWEAPONSPEC *id[%d];" % len(content.Weapons)
|
|
for w in content.Weapons:
|
|
print "\tWEAPONSPEC_%s &weapon_%s;" % (w.name.upper(), w.name)
|
|
print ""
|
|
print "};"
|
|
|
|
print "static WEAPONS weapons = {{%s}," % (",".join(["&weapon_%s.base"%w.name for w in content.Weapons]))
|
|
for w in content.Weapons:
|
|
print "\tweapon_%s," % w.name
|
|
print "};"
|
|
|
|
|
|
|
|
print """
|
|
struct DATACONTAINER
|
|
{
|
|
int num_sounds;
|
|
SOUNDSET *sounds;
|
|
|
|
int num_images;
|
|
IMAGE *images;
|
|
|
|
int num_sprites;
|
|
SPRITE *sprites;
|
|
|
|
WEAPONS &weapons;
|
|
};"""
|
|
|
|
print "DATACONTAINER data = {"
|
|
print "\t%d, soundsets," % len(content.Sounds)
|
|
print "\t%d, images," % len(content.Images)
|
|
print "\t%d, sprites," % len(content.Sprites)
|
|
print "\tweapons,"
|
|
print "};"
|
|
|
|
|
|
# NETWORK
|
|
if 0:
|
|
|
|
|
|
for e in network.Enums:
|
|
for l in create_enum_table(["%s_%s"%(e.name, v) for v in e.values], "NUM_%sS"%e.name): print l
|
|
print ""
|
|
|
|
for l in create_enum_table([o.enum_name for o in network.Objects], "NUM_NETOBJTYPES"): print l
|
|
print ""
|
|
for l in create_enum_table([o.enum_name for o in network.Messages], "NUM_NETMSGTYPES"): print l
|
|
print ""
|
|
|
|
for item in network.Objects + network.Messages:
|
|
for line in item.emit_declaration():
|
|
print line
|
|
print ""
|
|
|
|
|
|
if 0:
|
|
# create names
|
|
lines = []
|
|
lines += ["static const char *netobj_names[] = {"]
|
|
lines += ['\t"%s",' % o.name for o in network.Objects]
|
|
lines += ['\t""', "};", ""]
|
|
|
|
for l in lines:
|
|
print l
|
|
|
|
for item in network.Objects:
|
|
for line in item.emit_validate():
|
|
print line
|
|
print ""
|
|
|
|
# create validate tables
|
|
lines = []
|
|
lines += ["typedef int(*VALIDATEFUNC)(void *data, int size);"]
|
|
lines += ["static VALIDATEFUNC validate_funcs[] = {"]
|
|
lines += ['\tvalidate_%s,' % o.name for o in network.Objects]
|
|
lines += ["\t0x0", "};", ""]
|
|
|
|
lines += ["int netobj_validate(int type, void *data, int size)"]
|
|
lines += ["{"]
|
|
lines += ["\tif(type < 0 || type >= NUM_NETOBJTYPES) return -1;"]
|
|
lines += ["\treturn validate_funcs[type](data, size);"]
|
|
lines += ["};", ""]
|
|
|
|
for l in lines:
|
|
print l
|
|
|