X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fcommon%2Feffects%2Feffectinfo.qc;h=474d41d1e74f5eba38f77312cd5f367529aaca4b;hp=f4df3237d4e5ef046bb5909e84652004d2da9f59;hb=44aa8946945001e43f22bb2ca8c7b725dc8c9513;hpb=7f64f637f43db3555fbe00e2424c68474de7bcc0 diff --git a/qcsrc/common/effects/effectinfo.qc b/qcsrc/common/effects/effectinfo.qc index f4df3237d4..474d41d1e7 100644 --- a/qcsrc/common/effects/effectinfo.qc +++ b/qcsrc/common/effects/effectinfo.qc @@ -1,144 +1,145 @@ -#define EFFECTINFO_PARSER(on) \ +#include "effectinfo.qh" +#define EFFECTINFO_PARSER(on, MY) \ on(type, MY(type) \ - ,{ ASSERT(n == 1 && "type"); MY(type) = strzone(argv(1)); \ + ,{ demand(n == 1 && "type"); MY(type) = strzone(argv(1)); \ }, sprintf(" %s", (MY(type)) \ )) \ on(airfriction, MY(airfriction) \ - ,{ ASSERT(n == 1 && "airfriction"); MY(airfriction) = stof(argv(1)); \ + ,{ demand(n == 1 && "airfriction"); MY(airfriction) = stof(argv(1)); \ }, sprintf(" %s", ftos(MY(airfriction)) \ )) \ on(alpha, MY(alpha_min) || MY(alpha_max) || MY(alpha_fade) \ - ,{ ASSERT(n == 3 && "alpha"); MY(alpha_min) = stof(argv(1)); MY(alpha_max) = stof(argv(2)); MY(alpha_fade) = stof(argv(3)); \ + ,{ demand(n == 3 && "alpha"); MY(alpha_min) = stof(argv(1)); MY(alpha_max) = stof(argv(2)); MY(alpha_fade) = stof(argv(3)); \ }, sprintf(" %s %s %s", ftos(MY(alpha_min)), ftos(MY(alpha_max)), ftos(MY(alpha_fade)) \ )) \ on(blend, MY(blend) \ - ,{ ASSERT(n == 1 && "blend"); MY(blend) = strzone(argv(1)); \ + ,{ demand(n == 1 && "blend"); MY(blend) = strzone(argv(1)); \ }, sprintf(" %s", (MY(blend)) \ )) \ on(bounce, MY(bounce) \ - ,{ ASSERT(n == 1 && "bounce"); MY(bounce) = stof(argv(1)); \ + ,{ demand(n == 1 && "bounce"); MY(bounce) = stof(argv(1)); \ }, sprintf(" %s", ftos(MY(bounce)) \ )) \ on(color, MY(color_min) || MY(color_max) \ - ,{ ASSERT(n == 2 && "color"); MY(color_min) = strzone(argv(1)); MY(color_max) = strzone(argv(2)); \ + ,{ demand(n == 2 && "color"); MY(color_min) = strzone(argv(1)); MY(color_max) = strzone(argv(2)); \ }, sprintf(" %s %s", (MY(color_min)), (MY(color_max)) \ )) \ on(countabsolute, MY(countabsolute) \ - ,{ ASSERT(n == 1 && "countabsolute"); MY(countabsolute) = stof(argv(1)); \ + ,{ demand(n == 1 && "countabsolute"); MY(countabsolute) = stof(argv(1)); \ }, sprintf(" %s", ftos(MY(countabsolute)) \ )) \ on(count, MY(count) \ - ,{ ASSERT(n == 1 && "count"); MY(count) = stof(argv(1)); \ + ,{ demand(n == 1 && "count"); MY(count) = stof(argv(1)); \ }, sprintf(" %s", ftos(MY(count)) \ )) \ on(gravity, MY(gravity) \ - ,{ ASSERT(n == 1 && "gravity"); MY(gravity) = stof(argv(1)); \ + ,{ demand(n == 1 && "gravity"); MY(gravity) = stof(argv(1)); \ }, sprintf(" %s", ftos(MY(gravity)) \ )) \ on(lightcolor, MY(lightcolor) \ - ,{ ASSERT(n == 3 && "lightcolor"); MY(lightcolor) = vec3(stof(argv(1)), stof(argv(2)), stof(argv(3))); \ + ,{ demand(n == 3 && "lightcolor"); MY(lightcolor) = vec3(stof(argv(1)), stof(argv(2)), stof(argv(3))); \ }, sprintf(" %v", (MY(lightcolor)) \ )) \ on(lightradiusfade, MY(lightradiusfade) \ - ,{ ASSERT(n == 1 && "lightradiusfade"); MY(lightradiusfade) = stof(argv(1)); \ + ,{ demand(n == 1 && "lightradiusfade"); MY(lightradiusfade) = stof(argv(1)); \ }, sprintf(" %s", ftos(MY(lightradiusfade)) \ )) \ on(lightradius, MY(lightradius) \ - ,{ ASSERT(n == 1 && "lightradius"); MY(lightradius) = stof(argv(1)); \ + ,{ demand(n == 1 && "lightradius"); MY(lightradius) = stof(argv(1)); \ }, sprintf(" %s", ftos(MY(lightradius)) \ )) \ on(lighttime, MY(lighttime) \ - ,{ ASSERT(n == 1 && "lighttime"); MY(lighttime) = stof(argv(1)); \ + ,{ demand(n == 1 && "lighttime"); MY(lighttime) = stof(argv(1)); \ }, sprintf(" %s", ftos(MY(lighttime)) \ )) \ on(liquidfriction, MY(liquidfriction) \ - ,{ ASSERT(n == 1 && "liquidfriction"); MY(liquidfriction) = stof(argv(1)); \ + ,{ demand(n == 1 && "liquidfriction"); MY(liquidfriction) = stof(argv(1)); \ }, sprintf(" %s", ftos(MY(liquidfriction)) \ )) \ on(notunderwater, MY(notunderwater) \ - ,{ ASSERT(n == 0 && "notunderwater"); MY(notunderwater) = true; \ + ,{ demand(n == 0 && "notunderwater"); MY(notunderwater) = true; \ }, "" \ ) \ on(orientation, MY(orientation) \ - ,{ ASSERT(n == 1 && "orientation"); MY(orientation) = strzone(argv(1)); \ + ,{ demand(n == 1 && "orientation"); MY(orientation) = strzone(argv(1)); \ }, sprintf(" %s", (MY(orientation)) \ )) \ on(originjitter, MY(originjitter) \ - ,{ ASSERT(n == 3 && "originjitter"); MY(originjitter) = vec3(stof(argv(1)), stof(argv(2)), stof(argv(3))); \ + ,{ demand(n == 3 && "originjitter"); MY(originjitter) = vec3(stof(argv(1)), stof(argv(2)), stof(argv(3))); \ }, sprintf(" %v", (MY(originjitter)) \ )) \ on(originoffset, MY(originoffset) \ - ,{ ASSERT(n == 3 && "originoffset"); MY(originoffset) = vec3(stof(argv(1)), stof(argv(2)), stof(argv(3))); \ + ,{ demand(n == 3 && "originoffset"); MY(originoffset) = vec3(stof(argv(1)), stof(argv(2)), stof(argv(3))); \ }, sprintf(" %v", (MY(originoffset)) \ )) \ on(relativeoriginoffset, MY(relativeoriginoffset) \ - ,{ ASSERT(n == 3 && "relativeoriginoffset"); MY(relativeoriginoffset) = vec3(stof(argv(1)), stof(argv(2)), stof(argv(3))); \ + ,{ demand(n == 3 && "relativeoriginoffset"); MY(relativeoriginoffset) = vec3(stof(argv(1)), stof(argv(2)), stof(argv(3))); \ }, sprintf(" %v", (MY(relativeoriginoffset)) \ )) \ on(relativevelocityoffset, MY(relativevelocityoffset) \ - ,{ ASSERT(n == 3 && "relativevelocityoffset"); MY(relativevelocityoffset) = vec3(stof(argv(1)), stof(argv(2)), stof(argv(3))); \ + ,{ demand(n == 3 && "relativevelocityoffset"); MY(relativevelocityoffset) = vec3(stof(argv(1)), stof(argv(2)), stof(argv(3))); \ }, sprintf(" %v", (MY(relativevelocityoffset)) \ )) \ on(rotate, MY(startangle_min) || MY(startangle_max) || MY(spin_min) || MY(spin_max) \ - ,{ ASSERT(n == 4 && "rotate"); MY(startangle_min) = stof(argv(1)); MY(startangle_max) = stof(argv(2)); MY(spin_min) = stof(argv(3)); MY(spin_max) = stof(argv(4)); \ + ,{ demand(n == 4 && "rotate"); MY(startangle_min) = stof(argv(1)); MY(startangle_max) = stof(argv(2)); MY(spin_min) = stof(argv(3)); MY(spin_max) = stof(argv(4)); \ }, sprintf(" %s %s %s %s", ftos(MY(startangle_min)), ftos(MY(startangle_max)), ftos(MY(spin_min)), ftos(MY(spin_max)) \ )) \ on(sizeincrease, MY(sizeincrease) \ - ,{ ASSERT(n == 1 && "sizeincrease"); MY(sizeincrease) = stof(argv(1)); \ + ,{ demand(n == 1 && "sizeincrease"); MY(sizeincrease) = stof(argv(1)); \ }, sprintf(" %s", ftos(MY(sizeincrease)) \ )) \ on(size, MY(size_min) || MY(size_max) \ - ,{ ASSERT(n == 2 && "size"); MY(size_min) = stof(argv(1)); MY(size_max) = stof(argv(2)); \ + ,{ demand(n == 2 && "size"); MY(size_min) = stof(argv(1)); MY(size_max) = stof(argv(2)); \ }, sprintf(" %s %s", ftos(MY(size_min)), ftos(MY(size_max)) \ )) \ on(staincolor, MY(staincolor_min) || MY(staincolor_max) \ - ,{ ASSERT(n == 2 && "staincolor"); MY(staincolor_min) = strzone(argv(1)); MY(staincolor_max) = strzone(argv(2)); \ + ,{ demand(n == 2 && "staincolor"); MY(staincolor_min) = strzone(argv(1)); MY(staincolor_max) = strzone(argv(2)); \ }, sprintf(" %s %s", (MY(staincolor_min)), (MY(staincolor_max)) \ )) \ on(stainsize, MY(stainsize_min) || MY(stainsize_max) \ - ,{ ASSERT(n == 2 && "stainsize"); MY(stainsize_min) = stof(argv(1)); MY(stainsize_max) = stof(argv(2)); \ + ,{ demand(n == 2 && "stainsize"); MY(stainsize_min) = stof(argv(1)); MY(stainsize_max) = stof(argv(2)); \ }, sprintf(" %s %s", ftos(MY(stainsize_min)), ftos(MY(stainsize_max)) \ )) \ on(staintex, MY(staintex_min) || MY(staintex_max) \ - ,{ ASSERT(n == 2 && "staintex"); MY(staintex_min) = stof(argv(1)); MY(staintex_max) = stof(argv(2)); \ + ,{ demand(n == 2 && "staintex"); MY(staintex_min) = stof(argv(1)); MY(staintex_max) = stof(argv(2)); \ }, sprintf(" %s %s", ftos(MY(staintex_min)), ftos(MY(staintex_max)) \ )) \ on(stretchfactor, MY(stretchfactor) \ - ,{ ASSERT(n == 1 && "stretchfactor"); MY(stretchfactor) = stof(argv(1)); \ + ,{ demand(n == 1 && "stretchfactor"); MY(stretchfactor) = stof(argv(1)); \ }, sprintf(" %s", ftos(MY(stretchfactor)) \ )) \ on(tex, MY(tex_min) || MY(tex_max) \ - ,{ ASSERT(n == 2 && "tex"); MY(tex_min) = stof(argv(1)); MY(tex_max) = stof(argv(2)); \ + ,{ demand(n == 2 && "tex"); MY(tex_min) = stof(argv(1)); MY(tex_max) = stof(argv(2)); \ }, sprintf(" %s %s", ftos(MY(tex_min)), ftos(MY(tex_max)) \ )) \ on(time, MY(time_min) || MY(time_max) \ - ,{ ASSERT(n == 2 && "time"); MY(time_min) = stof(argv(1)); MY(time_max) = stof(argv(2)); \ + ,{ demand(n == 2 && "time"); MY(time_min) = stof(argv(1)); MY(time_max) = stof(argv(2)); \ }, sprintf(" %s %s", ftos(MY(time_min)), ftos(MY(time_max)) \ )) \ on(trailspacing, MY(trailspacing) \ - ,{ ASSERT(n == 1 && "trailspacing"); MY(trailspacing) = stof(argv(1)); \ + ,{ demand(n == 1 && "trailspacing"); MY(trailspacing) = stof(argv(1)); \ }, sprintf(" %s", ftos(MY(trailspacing)) \ )) \ on(underwater, MY(underwater) \ - ,{ ASSERT(n == 0 && "underwater"); MY(underwater) = true; \ + ,{ demand(n == 0 && "underwater"); MY(underwater) = true; \ }, "" \ ) \ on(velocityjitter, MY(velocityjitter) \ - ,{ ASSERT(n == 3 && "velocityjitter"); MY(velocityjitter) = vec3(stof(argv(1)), stof(argv(2)), stof(argv(3))); \ + ,{ demand(n == 3 && "velocityjitter"); MY(velocityjitter) = vec3(stof(argv(1)), stof(argv(2)), stof(argv(3))); \ }, sprintf(" %v", (MY(velocityjitter)) \ )) \ on(velocitymultiplier, MY(velocitymultiplier) \ - ,{ ASSERT(n == 1 && "velocitymultiplier"); MY(velocitymultiplier) = stof(argv(1)); \ + ,{ demand(n == 1 && "velocitymultiplier"); MY(velocitymultiplier) = stof(argv(1)); \ }, sprintf(" %s", ftos(MY(velocitymultiplier)) \ )) \ on(velocityoffset, MY(velocityoffset) \ - ,{ ASSERT(n == 3 && "velocityoffset"); MY(velocityoffset) = vec3(stof(argv(1)), stof(argv(2)), stof(argv(3))); \ + ,{ demand(n == 3 && "velocityoffset"); MY(velocityoffset) = vec3(stof(argv(1)), stof(argv(2)), stof(argv(3))); \ }, sprintf(" %v", (MY(velocityoffset)) \ )) \ /**/ CLASS(EffectInfo, Object) - ATTRIB(EffectInfo, effectinfo_name, string, string_null) + ATTRIB(EffectInfo, effectinfo_name, string); CONSTRUCTOR(EffectInfo, string s) { CONSTRUCT(EffectInfo); this.effectinfo_name = s; @@ -193,11 +194,13 @@ CLASS(EffectInfo, Object) MY(velocityoffset, vector, '0 0 0') \ /**/ - #define MY(f, type, val) ATTRIB(EffectInfo, effectinfo_##f, type, val) + #define MY(f, type, val) ATTRIB(EffectInfo, effectinfo_##f, type, val); FIELDS(MY) #undef MY - METHOD(EffectInfo, describe, string(EffectInfo this)) { + METHOD(EffectInfo, describe, string(EffectInfo this)) + { + TC(EffectInfo, this); string s = sprintf("SUB(%s) {\n", this.effectinfo_name); #define str_bool(it) (it ? "true" : "false") #define str_float(it) ftos(it) @@ -206,15 +209,16 @@ CLASS(EffectInfo, Object) #define p(f, type, default) if (this.effectinfo_##f) { s = strcat(s, "\t", "MY("#f") = ", str_##type(this.effectinfo_##f), ";\n"); } FIELDS(p) #undef p - #undef MY return strcat(s, "}\n"); } - METHOD(EffectInfo, dump, string(EffectInfo this)) { + METHOD(EffectInfo, dump, string(EffectInfo this)) + { + TC(EffectInfo, this); string s = sprintf("effect %s\n", this.effectinfo_name); #define MY(f) this.effectinfo_##f #define p(k, isset, parse, unparse) if (isset) { s = strcat(s, "\t", #k, unparse, "\n"); } - EFFECTINFO_PARSER(p) + EFFECTINFO_PARSER(p, MY) #undef p #undef MY return s; @@ -224,8 +228,8 @@ CLASS(EffectInfo, Object) ENDCLASS(EffectInfo) CLASS(EffectInfoGroup, Object) - ATTRIBARRAY(EffectInfoGroup, children, EffectInfo, 16) - ATTRIB(EffectInfoGroup, children_count, int, 0) + ATTRIBARRAY(EffectInfoGroup, children, EffectInfo, 16); + ATTRIB(EffectInfoGroup, children_count, int, 0); ENDCLASS(EffectInfoGroup) void effectinfo_read() @@ -238,19 +242,19 @@ void effectinfo_read() n--; string k = argv(0); if (k == "effect") { - ASSERT(n == 1); + demand(n == 1); info = NEW(EffectInfo, strzone(argv(1))); continue; } - ASSERT(info != NULL); + demand(info != NULL); switch (k) { #define MY(f) info.effectinfo_##f #define p(k, isset, parse, unparse) case #k: parse break; - EFFECTINFO_PARSER(p) + EFFECTINFO_PARSER(p, MY) #undef p #undef MY default: - LOG_WARNINGF("Unknown property '%s'\n", k); + LOG_WARNF("Unknown property '%s'", k); break; } } @@ -259,10 +263,7 @@ void effectinfo_read() void effectinfo_dump(int fh, bool alsoprint) { - #define WRITE(s) do { \ - fputs(fh, s); \ - if (alsoprint) LOG_INFO(s); \ - } while (0) + #define WRITE(str) write_String_To_File(fh, str, alsoprint) WRITE("// ********************************************** //\n"); WRITE("// ** WARNING - DO NOT MANUALLY EDIT THIS FILE ** //\n"); WRITE("// ** ** //\n"); @@ -299,20 +300,20 @@ GENERIC_COMMAND(dumpeffectinfo, "Dump all effectinfo to effectinfo_dump.txt") int fh = fopen(filename, FILE_WRITE); if (fh >= 0) { effectinfo_dump(fh, alsoprint); - LOG_INFOF("Dumping effectinfo... File located at ^2data/data/%s^7.\n", filename); - LOG_INFOF("Reload with ^2cl_particles_reloadeffects data/%s^7.\n", filename); + LOG_INFOF("Dumping effectinfo... File located at ^2data/data/%s^7.", filename); + LOG_INFOF("Reload with ^2cl_particles_reloadeffects data/%s^7.", filename); fclose(fh); } else { - LOG_WARNINGF("Could not open file '%s'!\n", filename); + LOG_WARNF("Could not open file '%s'!", filename); } return; } default: case CMD_REQUEST_USAGE: { - LOG_INFO(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " dumpeffectinfo [filename]")); - LOG_INFO(" Where 'filename' is the file to write (default is effectinfo_dump.txt),\n"); - LOG_INFO(" if supplied with '-' output to console as well as default,\n"); - LOG_INFO(" if left blank, it will only write to default.\n"); + LOG_INFO("Usage:^3 ", GetProgramCommandPrefix(), " dumpeffectinfo [filename]"); + LOG_INFO(" Where 'filename' is the file to write (default is effectinfo_dump.txt),"); + LOG_INFO(" if supplied with '-' output to console as well as default,"); + LOG_INFO(" if left blank, it will only write to default."); return; } } @@ -323,7 +324,7 @@ REGISTRY(EffectInfos, BITS(9)) #define EffectInfos_from(i) _EffectInfos_from(i, NULL) REGISTER_REGISTRY(EffectInfos) #define EFFECTINFO(name) \ - [[accumulate]] void effectinfo_##name(EffectInfoGroup parent, EffectInfo this) { } \ + ACCUMULATE void effectinfo_##name(EffectInfoGroup parent, EffectInfo this) { } \ REGISTER(EffectInfos, EFFECTINFO, name, m_id, NEW(EffectInfoGroup)) { \ effectinfo_##name(this, NULL); \ } @@ -331,8 +332,8 @@ REGISTER_REGISTRY(EffectInfos) #define MY(f) this.effectinfo_##f #define DEF(name) EFFECTINFO(name) #define SUB(name) \ - [[accumulate]] void effectinfo_##name(EffectInfoGroup parent, EffectInfo this) { parent = EFFECTINFO_##name; parent.children[parent.children_count++] = this = NEW(EffectInfo, #name); } \ - [[accumulate]] void effectinfo_##name(EffectInfoGroup parent, EffectInfo this) + ACCUMULATE void effectinfo_##name(EffectInfoGroup parent, EffectInfo this) { parent = EFFECTINFO_##name; parent.children[parent.children_count++] = this = NEW(EffectInfo, #name); } \ + ACCUMULATE void effectinfo_##name(EffectInfoGroup parent, EffectInfo this) #include "effectinfo.inc" #undef MY #undef DEF