float lengthLogTable[128];
-float invertLengthLog(float x)
+float invertLengthLog(float dist)
{
int l, r, m;
- if(x >= lengthLogTable[127])
+ if(dist >= lengthLogTable[127])
return 127;
- if(x <= lengthLogTable[0])
+ if(dist <= lengthLogTable[0])
return 0;
l = 0;
while(r - l > 1)
{
m = floor((l + r) / 2);
- if(lengthLogTable[m] < x)
+ if(lengthLogTable[m] < dist)
l = m;
else
r = m;
}
// now: r is >=, l is <
- float lerr = (x - lengthLogTable[l]);
- float rerr = (lengthLogTable[r] - x);
+ float lerr = (dist - lengthLogTable[l]);
+ float rerr = (lengthLogTable[r] - dist);
if(lerr < rerr)
return l;
return r;
if(data == 0)
return '0 0 0';
float p = (data & 0xF000) / 0x1000;
- float y = (data & 0x0F80) / 0x80;
+ float q = (data & 0x0F80) / 0x80;
int len = (data & 0x007F);
- //print("\ndecompress: p ", ftos(p)); print("y ", ftos(y)); print("len ", ftos(len), "\n");
+ //print("\ndecompress: p ", ftos(p)); print("q ", ftos(q)); print("len ", ftos(len), "\n");
if(p == 0)
{
out.x = 0;
out.y = 0;
- if(y == 31)
+ if(q == 31)
out.z = -1;
else
out.z = +1;
}
else
{
- y = .19634954084936207740 * y;
+ q = .19634954084936207740 * q;
p = .19634954084936207740 * p - 1.57079632679489661922;
- out.x = cos(y) * cos(p);
- out.y = sin(y) * cos(p);
+ out.x = cos(q) * cos(p);
+ out.y = sin(q) * cos(p);
out.z = -sin(p);
}
STATIC_INIT(compressShortVector)
{
float l = 1;
- float f = pow(2, 1/8);
+ float f = (2 ** (1/8));
int i;
for(i = 0; i < 128; ++i)
{
n = tokenize_console(neworder);
for(w = to; w >= from; --w)
{
+ int wflags = Weapons_from(w).spawnflags;
+ if((wflags & WEP_FLAG_HIDDEN) && (wflags & WEP_FLAG_MUTATORBLOCKED) && !(wflags & WEP_FLAG_NORMAL))
+ continue;
for(i = 0; i < n; ++i)
if(stof(argv(i)) == w)
break;
return j;
}
+bool isCaretEscaped(string theText, float pos)
+{
+ int i = 0;
+ while(pos - i >= 1 && substring(theText, pos - i - 1, 1) == "^")
+ ++i;
+ return (i & 1);
+}
+
+int skipIncompleteTag(string theText, float pos, int len)
+{
+ int i = 0, ch = 0;
+ int tag_start = -1;
+
+ if(substring(theText, pos - 1, 1) == "^")
+ {
+ if(isCaretEscaped(theText, pos - 1) || pos >= len)
+ return 0;
+
+ ch = str2chr(theText, pos);
+ if(ch >= '0' && ch <= '9')
+ return 1; // ^[0-9] color code found
+ else if (ch == 'x')
+ tag_start = pos - 1; // ^x tag found
+ else
+ return 0;
+ }
+ else
+ {
+ for(i = 2; pos - i >= 0 && i <= 4; ++i)
+ {
+ if(substring(theText, pos - i, 2) == "^x")
+ {
+ tag_start = pos - i; // ^x tag found
+ break;
+ }
+ }
+ }
+
+ if(tag_start >= 0)
+ {
+ if(tag_start + 5 < len)
+ if(IS_HEXDIGIT(substring(theText, tag_start + 2, 1)))
+ if(IS_HEXDIGIT(substring(theText, tag_start + 3, 1)))
+ if(IS_HEXDIGIT(substring(theText, tag_start + 4, 1)))
+ {
+ if(!isCaretEscaped(theText, tag_start))
+ return 5 - (pos - tag_start); // ^xRGB color code found
+ }
+ }
+ return 0;
+}
+
float textLengthUpToWidth(string theText, float maxWidth, vector theSize, textLengthUpToWidth_widthFunction_t w)
{
// STOP.
if(w(theText, theSize) <= maxWidth)
return strlen(theText); // yeah!
+ bool colors = (w("^7", theSize) == 0);
+
// binary search for right place to cut string
- float ch;
- float left, right, middle; // this always works
+ int len, left, right, middle;
left = 0;
- right = strlen(theText); // this always fails
+ right = len = strlen(theText);
+ int ofs = 0;
do
{
middle = floor((left + right) / 2);
- if(w(substring(theText, 0, middle), theSize) <= maxWidth)
- left = middle;
+ if(colors)
+ ofs = skipIncompleteTag(theText, middle, len);
+ if(w(substring(theText, 0, middle + ofs), theSize) <= maxWidth)
+ left = middle + ofs;
else
right = middle;
}
while(left < right - 1);
- if(w("^7", theSize) == 0) // detect color codes support in the width function
- {
- // NOTE: when color codes are involved, this binary search is,
- // mathematically, BROKEN. However, it is obviously guaranteed to
- // terminate, as the range still halves each time - but nevertheless, it is
- // guaranteed that it finds ONE valid cutoff place (where "left" is in
- // range, and "right" is outside).
-
- // terencehill: the following code detects truncated ^xrgb tags (e.g. ^x or ^x4)
- // and decrease left on the basis of the chars detected of the truncated tag
- // Even if the ^xrgb tag is not complete/correct, left is decreased
- // (sometimes too much but with a correct result)
- // it fixes also ^[0-9]
- while(left >= 1 && substring(theText, left-1, 1) == "^")
- left-=1;
-
- if (left >= 2 && substring(theText, left-2, 2) == "^x") // ^x/
- left-=2;
- else if (left >= 3 && substring(theText, left-3, 2) == "^x")
- {
- ch = str2chr(theText, left-1);
- if( (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F') ) // ^xr/
- left-=3;
- }
- else if (left >= 4 && substring(theText, left-4, 2) == "^x")
- {
- ch = str2chr(theText, left-2);
- if ( (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F') )
- {
- ch = str2chr(theText, left-1);
- if ( (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F') ) // ^xrg/
- left-=4;
- }
- }
- }
-
return left;
}
if(w(theText) <= maxWidth)
return strlen(theText); // yeah!
+ bool colors = (w("^7") == 0);
+
// binary search for right place to cut string
- float ch;
- float left, right, middle; // this always works
+ int len, left, right, middle;
left = 0;
- right = strlen(theText); // this always fails
+ right = len = strlen(theText);
+ int ofs = 0;
do
{
middle = floor((left + right) / 2);
- if(w(substring(theText, 0, middle)) <= maxWidth)
- left = middle;
+ if(colors)
+ ofs = skipIncompleteTag(theText, middle, len);
+ if(w(substring(theText, 0, middle + ofs)) <= maxWidth)
+ left = middle + ofs;
else
right = middle;
}
while(left < right - 1);
- if(w("^7") == 0) // detect color codes support in the width function
- {
- // NOTE: when color codes are involved, this binary search is,
- // mathematically, BROKEN. However, it is obviously guaranteed to
- // terminate, as the range still halves each time - but nevertheless, it is
- // guaranteed that it finds ONE valid cutoff place (where "left" is in
- // range, and "right" is outside).
-
- // terencehill: the following code detects truncated ^xrgb tags (e.g. ^x or ^x4)
- // and decrease left on the basis of the chars detected of the truncated tag
- // Even if the ^xrgb tag is not complete/correct, left is decreased
- // (sometimes too much but with a correct result)
- // it fixes also ^[0-9]
- while(left >= 1 && substring(theText, left-1, 1) == "^")
- left-=1;
-
- if (left >= 2 && substring(theText, left-2, 2) == "^x") // ^x/
- left-=2;
- else if (left >= 3 && substring(theText, left-3, 2) == "^x")
- {
- ch = str2chr(theText, left-1);
- if( (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F') ) // ^xr/
- left-=3;
- }
- else if (left >= 4 && substring(theText, left-4, 2) == "^x")
- {
- ch = str2chr(theText, left-2);
- if ( (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F') )
- {
- ch = str2chr(theText, left-1);
- if ( (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F') ) // ^xrg/
- left-=4;
- }
- }
- }
-
return left;
}
if (carets & 1)
{
if(i+1 <= len)
- if(strstrofs("0123456789", substring(s, i+1, 1), 0) >= 0)
+ if(IS_DIGIT(substring(s, i+1, 1)))
return substring(s, i, 2);
if(i+4 <= len)
if(substring(s, i+1, 1) == "x")
- if(strstrofs("0123456789abcdefABCDEF", substring(s, i+2, 1), 0) >= 0)
- if(strstrofs("0123456789abcdefABCDEF", substring(s, i+3, 1), 0) >= 0)
- if(strstrofs("0123456789abcdefABCDEF", substring(s, i+4, 1), 0) >= 0)
+ if(IS_HEXDIGIT(substring(s, i + 2, 1)))
+ if(IS_HEXDIGIT(substring(s, i + 3, 1)))
+ if(IS_HEXDIGIT(substring(s, i + 4, 1)))
return substring(s, i, 5);
}
i -= carets; // this also skips one char before the carets
float compressShotOrigin(vector v)
{
- float x, y, z;
- x = rint(v.x * 2);
- y = rint(v.y * 4) + 128;
- z = rint(v.z * 4) + 128;
- if(x > 255 || x < 0)
+ float rx = rint(v.x * 2);
+ float ry = rint(v.y * 4) + 128;
+ float rz = rint(v.z * 4) + 128;
+ if(rx > 255 || rx < 0)
{
- LOG_INFO("shot origin ", vtos(v), " x out of bounds\n");
- x = bound(0, x, 255);
+ LOG_DEBUG("shot origin ", vtos(v), " x out of bounds\n");
+ rx = bound(0, rx, 255);
}
- if(y > 255 || y < 0)
+ if(ry > 255 || ry < 0)
{
- LOG_INFO("shot origin ", vtos(v), " y out of bounds\n");
- y = bound(0, y, 255);
+ LOG_DEBUG("shot origin ", vtos(v), " y out of bounds\n");
+ ry = bound(0, ry, 255);
}
- if(z > 255 || z < 0)
+ if(rz > 255 || rz < 0)
{
- LOG_INFO("shot origin ", vtos(v), " z out of bounds\n");
- z = bound(0, z, 255);
+ LOG_DEBUG("shot origin ", vtos(v), " z out of bounds\n");
+ rz = bound(0, rz, 255);
}
- return x * 0x10000 + y * 0x100 + z;
+ return rx * 0x10000 + ry * 0x100 + rz;
}
vector decompressShotOrigin(int f)
{
get_model_parameters_bone_aimweight[i] = 0;
}
get_model_parameters_fixbone = 0;
+ get_model_parameters_hidden = false;
#ifdef GAMEQC
MUTATOR_CALLHOOK(ClearModelParams);
}
if(c == "fixbone")
get_model_parameters_fixbone = stof(s);
+ if(c == "hidden")
+ get_model_parameters_hidden = stob(s);
}
while((s = fgets(fh)))