X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Futil.qc;h=f9b96031ab0a481d6d219f455b1f20c625a1d681;hb=dc891780036706390bcaa27975dcb71e499deeae;hp=1f71690f5933d56fcbd0ec5d75a7f3809549070d;hpb=2960683440f7cbd9cf6e94aa2ef3f5c58582aeb8;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/util.qc b/qcsrc/common/util.qc index 1f71690f5..15cde708a 100644 --- a/qcsrc/common/util.qc +++ b/qcsrc/common/util.qc @@ -203,7 +203,6 @@ string ftos_decimals(float number, float decimals) return sprintf("%.*f", decimals, number); } -float time; vector colormapPaletteColor(float c, float isPants) { switch(c) @@ -242,7 +241,7 @@ vector colormapPaletteColor(float c, float isPants) string fstrunzone(string s) { string sc; - if not(s) + if (!s) return s; sc = strcat(s, ""); strunzone(s); @@ -409,22 +408,6 @@ void buf_save(float buf, string pFilename) fclose(fh); } -string format_time(float seconds) -{ - float days, hours, minutes; - seconds = floor(seconds + 0.5); - days = floor(seconds / 864000); - seconds -= days * 864000; - hours = floor(seconds / 36000); - seconds -= hours * 36000; - minutes = floor(seconds / 600); - seconds -= minutes * 600; - if (days > 0) - return sprintf(_("%d days, %02d:%02d:%02d"), days, hours, minutes, seconds); - else - return sprintf(_("%02d:%02d:%02d"), hours, minutes, seconds); -} - string mmsss(float tenths) { float minutes; @@ -883,7 +866,7 @@ float cvar_settemp(string tmp_cvar, string tmp_value) created_saved_value = 0; - if not(tmp_cvar || tmp_value) + if (!(tmp_cvar || tmp_value)) { dprint("Error: Invalid usage of cvar_settemp(string, string); !\n"); return 0; @@ -891,7 +874,7 @@ float cvar_settemp(string tmp_cvar, string tmp_value) if(!cvar_type(tmp_cvar)) { - print(sprintf("Error: cvar %s doesn't exist!\n", tmp_cvar)); + printf("Error: cvar %s doesn't exist!\n", tmp_cvar); return 0; } @@ -928,7 +911,7 @@ float cvar_settemp_restore() ++i; } else - print(sprintf("Error: cvar %s doesn't exist anymore! It can still be restored once it's manually recreated.\n", e.netname)); + printf("Error: cvar %s doesn't exist anymore! It can still be restored once it's manually recreated.\n", e.netname); } return i; @@ -1329,7 +1312,7 @@ string find_last_color_code(string s) ++carets; // check if carets aren't all escaped - if (carets == 1 || mod(carets, 2) == 1) // first check is just an optimization + if (carets & 1) { if(i+1 <= len) if(strstrofs("0123456789", substring(s, i+1, 1), 0) >= 0) @@ -1493,7 +1476,7 @@ float isGametypeInFilter(float gt, float tp, float ts, string pattern) if(strstrofs(strcat(",", pattern, ","), subpattern2, 0) < 0) if(strstrofs(strcat(",", pattern, ","), subpattern3, 0) < 0) { - if not(subpattern4) + if (!subpattern4) return 0; if(strstrofs(strcat(",", pattern, ","), subpattern4, 0) < 0) return 0; @@ -1729,7 +1712,7 @@ void check_unacceptable_compiler_bugs() error("fteqcc bug introduced with revision 3178 detected. Please upgrade fteqcc to a later revision, downgrade fteqcc to revision 3177, or pester Spike until he fixes it. You can set _allow_unacceptable_compiler_bugs 1 to skip this check, but expect stuff to be horribly broken then."); string s = ""; - if not(s) + if (!s) error("The empty string counts as false. We do not want that!"); } @@ -1848,10 +1831,13 @@ void RandomSelection_Add(entity e, float f, string s, float weight, float priori } } -vector healtharmor_maxdamage(float h, float a, float armorblock) +#ifndef MENUQC +vector healtharmor_maxdamage(float h, float a, float armorblock, float deathtype) { // NOTE: we'll always choose the SMALLER value... float healthdamage, armordamage, armorideal; + if (deathtype == DEATH_DROWN) // Why should armor help here... + armorblock = 0; vector v; healthdamage = (h - 1) / (1 - armorblock); // damage we can take if we could use more health armordamage = a + (h - 1); // damage we can take if we could use more armor @@ -1870,14 +1856,17 @@ vector healtharmor_maxdamage(float h, float a, float armorblock) return v; } -vector healtharmor_applydamage(float a, float armorblock, float damage) +vector healtharmor_applydamage(float a, float armorblock, float deathtype, float damage) { vector v; + if (deathtype == DEATH_DROWN) // Why should armor help here... + armorblock = 0; v_y = bound(0, damage * armorblock, a); // save v_x = bound(0, damage - v_y, damage); // take v_z = 0; return v; } +#endif string getcurrentmod() { @@ -1900,6 +1889,22 @@ float ReadInt24_t() v += ReadByte(); // note: this is unsigned return v; } +vector ReadInt48_t() +{ + vector v; + v_x = ReadInt24_t(); + v_y = ReadInt24_t(); + v_z = 0; + return v; +} +vector ReadInt72_t() +{ + vector v; + v_x = ReadInt24_t(); + v_y = ReadInt24_t(); + v_z = ReadInt24_t(); + return v; +} #else void WriteInt24_t(float dst, float val) { @@ -1907,6 +1912,17 @@ void WriteInt24_t(float dst, float val) WriteShort(dst, (v = floor(val / 256))); WriteByte(dst, val - v * 256); // 0..255 } +void WriteInt48_t(float dst, vector val) +{ + WriteInt24_t(dst, val_x); + WriteInt24_t(dst, val_y); +} +void WriteInt72_t(float dst, vector val) +{ + WriteInt24_t(dst, val_x); + WriteInt24_t(dst, val_y); + WriteInt24_t(dst, val_z); +} #endif #endif @@ -2036,7 +2052,7 @@ float get_model_parameters(string m, float sk) } get_model_parameters_fixbone = 0; - if not(m) + if (!m) return 1; if(substring(m, -9, 5) == "_lod1" || substring(m, -9, 5) == "_lod2") @@ -2090,6 +2106,8 @@ float get_model_parameters(string m, float sk) get_model_parameters_weight = stof(s); if(c == "age") get_model_parameters_age = stof(s); + if(c == "description") + get_model_parameters_description = s; if(c == "bone_upperbody") get_model_parameters_bone_upperbody = s; if(c == "bone_weapon") @@ -2270,11 +2288,11 @@ float xdecode(string s) float lowestbit(float f) { - f &~= f * 2; - f &~= f * 4; - f &~= f * 16; - f &~= f * 256; - f &~= f * 65536; + f &= ~(f * 2); + f &= ~(f * 4); + f &= ~(f * 16); + f &= ~(f * 256); + f &= ~(f * 65536); return f; } @@ -2476,6 +2494,28 @@ float cubic_speedfunc_is_sane(float startspeedfactor, float endspeedfactor) // (3, [0..3]) // (3.5, [0.2..2.3]) // (4, 1) + + /* + On another note: + inflection point is always at (2s + e - 3) / (3s + 3e - 6). + + s + e - 2 == 0: no inflection + + s + e > 2: + 0 < inflection < 1 if: + 0 < 2s + e - 3 < 3s + 3e - 6 + 2s + e > 3 and 2e + s > 3 + + s + e < 2: + 0 < inflection < 1 if: + 0 > 2s + e - 3 > 3s + 3e - 6 + 2s + e < 3 and 2e + s < 3 + + Therefore: there is an inflection point iff: + e outside (3 - s)/2 .. 3 - s*2 + + in other words, if (s,e) in triangle (1,1)(0,3)(0,1.5) or in triangle (1,1)(3,0)(1.5,0) + */ } .float FindConnectedComponent_processing; @@ -2520,6 +2560,30 @@ void FindConnectedComponent(entity e, .entity fld, findNextEntityNearFunction_t queue_start.FindConnectedComponent_processing = 0; } +#ifdef SVQC +vector combine_to_vector(float x, float y, float z) +{ + vector result; result_x = x; result_y = y; result_z = z; + return result; +} + +vector get_corner_position(entity box, float corner) +{ + switch(corner) + { + case 1: return combine_to_vector(box.absmin_x, box.absmin_y, box.absmin_z); + case 2: return combine_to_vector(box.absmax_x, box.absmin_y, box.absmin_z); + case 3: return combine_to_vector(box.absmin_x, box.absmax_y, box.absmin_z); + case 4: return combine_to_vector(box.absmin_x, box.absmin_y, box.absmax_z); + case 5: return combine_to_vector(box.absmax_x, box.absmax_y, box.absmin_z); + case 6: return combine_to_vector(box.absmin_x, box.absmax_y, box.absmax_z); + case 7: return combine_to_vector(box.absmax_x, box.absmin_y, box.absmax_z); + case 8: return combine_to_vector(box.absmax_x, box.absmax_y, box.absmax_z); + default: return '0 0 0'; + } +} +#endif + // todo: this sucks, lets find a better way to do backtraces? #ifndef MENUQC void backtrace(string msg) @@ -2604,21 +2668,165 @@ void dedicated_print(string input) // print(), but only print if the server is n #endif #ifndef MENUQC -float Announcer_PickNumber(float num) +float Announcer_PickNumber(float type, float num) { - switch(num) + switch(type) { - case 10: num = ANNCE_NUM_10; break; - case 9: num = ANNCE_NUM_9; break; - case 8: num = ANNCE_NUM_8; break; - case 7: num = ANNCE_NUM_7; break; - case 6: num = ANNCE_NUM_6; break; - case 5: num = ANNCE_NUM_5; break; - case 4: num = ANNCE_NUM_4; break; - case 3: num = ANNCE_NUM_3; break; - case 2: num = ANNCE_NUM_2; break; - case 1: num = ANNCE_NUM_1; break; + case CNT_GAMESTART: + { + switch(num) + { + case 10: return ANNCE_NUM_GAMESTART_10; + case 9: return ANNCE_NUM_GAMESTART_9; + case 8: return ANNCE_NUM_GAMESTART_8; + case 7: return ANNCE_NUM_GAMESTART_7; + case 6: return ANNCE_NUM_GAMESTART_6; + case 5: return ANNCE_NUM_GAMESTART_5; + case 4: return ANNCE_NUM_GAMESTART_4; + case 3: return ANNCE_NUM_GAMESTART_3; + case 2: return ANNCE_NUM_GAMESTART_2; + case 1: return ANNCE_NUM_GAMESTART_1; + } + break; + } + case CNT_IDLE: + { + switch(num) + { + case 10: return ANNCE_NUM_IDLE_10; + case 9: return ANNCE_NUM_IDLE_9; + case 8: return ANNCE_NUM_IDLE_8; + case 7: return ANNCE_NUM_IDLE_7; + case 6: return ANNCE_NUM_IDLE_6; + case 5: return ANNCE_NUM_IDLE_5; + case 4: return ANNCE_NUM_IDLE_4; + case 3: return ANNCE_NUM_IDLE_3; + case 2: return ANNCE_NUM_IDLE_2; + case 1: return ANNCE_NUM_IDLE_1; + } + break; + } + case CNT_KILL: + { + switch(num) + { + case 10: return ANNCE_NUM_KILL_10; + case 9: return ANNCE_NUM_KILL_9; + case 8: return ANNCE_NUM_KILL_8; + case 7: return ANNCE_NUM_KILL_7; + case 6: return ANNCE_NUM_KILL_6; + case 5: return ANNCE_NUM_KILL_5; + case 4: return ANNCE_NUM_KILL_4; + case 3: return ANNCE_NUM_KILL_3; + case 2: return ANNCE_NUM_KILL_2; + case 1: return ANNCE_NUM_KILL_1; + } + break; + } + case CNT_RESPAWN: + { + switch(num) + { + case 10: return ANNCE_NUM_RESPAWN_10; + case 9: return ANNCE_NUM_RESPAWN_9; + case 8: return ANNCE_NUM_RESPAWN_8; + case 7: return ANNCE_NUM_RESPAWN_7; + case 6: return ANNCE_NUM_RESPAWN_6; + case 5: return ANNCE_NUM_RESPAWN_5; + case 4: return ANNCE_NUM_RESPAWN_4; + case 3: return ANNCE_NUM_RESPAWN_3; + case 2: return ANNCE_NUM_RESPAWN_2; + case 1: return ANNCE_NUM_RESPAWN_1; + } + break; + } + case CNT_ROUNDSTART: + { + switch(num) + { + case 10: return ANNCE_NUM_ROUNDSTART_10; + case 9: return ANNCE_NUM_ROUNDSTART_9; + case 8: return ANNCE_NUM_ROUNDSTART_8; + case 7: return ANNCE_NUM_ROUNDSTART_7; + case 6: return ANNCE_NUM_ROUNDSTART_6; + case 5: return ANNCE_NUM_ROUNDSTART_5; + case 4: return ANNCE_NUM_ROUNDSTART_4; + case 3: return ANNCE_NUM_ROUNDSTART_3; + case 2: return ANNCE_NUM_ROUNDSTART_2; + case 1: return ANNCE_NUM_ROUNDSTART_1; + } + break; + } + default: + { + switch(num) + { + case 10: return ANNCE_NUM_10; + case 9: return ANNCE_NUM_9; + case 8: return ANNCE_NUM_8; + case 7: return ANNCE_NUM_7; + case 6: return ANNCE_NUM_6; + case 5: return ANNCE_NUM_5; + case 4: return ANNCE_NUM_4; + case 3: return ANNCE_NUM_3; + case 2: return ANNCE_NUM_2; + case 1: return ANNCE_NUM_1; + } + break; + } } - return num; + return NOTIF_ABORT; // abort sending if none of these numbers were right +} +#endif + +#ifndef MENUQC +float Mod_Q1BSP_SuperContentsFromNativeContents(float nativecontents) +{ + switch(nativecontents) + { + case CONTENT_EMPTY: + return 0; + case CONTENT_SOLID: + return DPCONTENTS_SOLID | DPCONTENTS_OPAQUE; + case CONTENT_WATER: + return DPCONTENTS_WATER; + case CONTENT_SLIME: + return DPCONTENTS_SLIME; + case CONTENT_LAVA: + return DPCONTENTS_LAVA | DPCONTENTS_NODROP; + case CONTENT_SKY: + return DPCONTENTS_SKY | DPCONTENTS_NODROP | DPCONTENTS_OPAQUE; // to match behaviour of Q3 maps, let sky count as opaque + } + return 0; +} + +float Mod_Q1BSP_NativeContentsFromSuperContents(float supercontents) +{ + if(supercontents & (DPCONTENTS_SOLID | DPCONTENTS_BODY)) + return CONTENT_SOLID; + if(supercontents & DPCONTENTS_SKY) + return CONTENT_SKY; + if(supercontents & DPCONTENTS_LAVA) + return CONTENT_LAVA; + if(supercontents & DPCONTENTS_SLIME) + return CONTENT_SLIME; + if(supercontents & DPCONTENTS_WATER) + return CONTENT_WATER; + return CONTENT_EMPTY; } #endif + +vector bezier_quadratic_getpoint(vector a, vector b, vector c, float t) +{ + return + (c - 2 * b + a) * (t * t) + + (b - a) * (2 * t) + + a; +} + +vector bezier_quadratic_getderivative(vector a, vector b, vector c, float t) +{ + return + (c - 2 * b + a) * (2 * t) + + (b - a) * 2; +}