#include "mapinfo.qh"
#endif
-#ifndef MENUQC
+#ifdef GAMEQC
/*
* Get "real" origin, in worldspace, even if ent is attached to something else.
*/
return r;
}
-#ifndef MENUQC
-#ifndef CSQC
+#ifdef SVQC
entity _wordwrap_buffer_sprint_ent;
void wordwrap_buffer_sprint(string s)
{
return;
}
#endif
-#endif
#ifndef SVQC
string draw_UseSkinFor(string pic)
return (p * 0x1000) + (y * 0x80) + len;
}
-void compressShortVector_init()
+STATIC_INIT(compressShortVector)
{
float l = 1;
float f = pow(2, 1/8);
}
}
-#ifndef MENUQC
+#ifdef GAMEQC
float CheckWireframeBox(entity forent, vector v0, vector dvx, vector dvy, vector dvz)
{
traceline(v0, v0 + dvx, true, forent); if(trace_fraction < 1) return 0;
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 order;
}
-#ifndef MENUQC
+#ifdef GAMEQC
void get_mi_min_max(float mode)
{
vector mi, ma;
mi_min = mi;
mi_max = ma;
- MapInfo_Get_ByName(mi_shortname, 0, 0);
+ MapInfo_Get_ByName(mi_shortname, 0, NULL);
if(MapInfo_Map_mins.x < MapInfo_Map_maxs.x)
{
mi_min = MapInfo_Map_mins;
'0 1 0' * ma.y + '0 0 1' * ma.z,
'1 0 0' * ma.x,
MOVE_WORLDONLY,
- world);
+ NULL);
if(!trace_startsolid)
mi_min.x = trace_endpos.x;
'1 0 0' * ma.x + '0 0 1' * ma.z,
'0 1 0' * ma.y,
MOVE_WORLDONLY,
- world);
+ NULL);
if(!trace_startsolid)
mi_min.y = trace_endpos.y;
'1 0 0' * ma.x + '0 1 0' * ma.y,
'0 0 1' * ma.z,
MOVE_WORLDONLY,
- world);
+ NULL);
if(!trace_startsolid)
mi_min.z = trace_endpos.z;
'0 1 0' * ma.y + '0 0 1' * ma.z,
'1 0 0' * mi.x,
MOVE_WORLDONLY,
- world);
+ NULL);
if(!trace_startsolid)
mi_max.x = trace_endpos.x;
'1 0 0' * ma.x + '0 0 1' * ma.z,
'0 1 0' * mi.y,
MOVE_WORLDONLY,
- world);
+ NULL);
if(!trace_startsolid)
mi_max.y = trace_endpos.y;
'1 0 0' * ma.x + '0 1 0' * ma.y,
'0 0 1' * mi.z,
MOVE_WORLDONLY,
- world);
+ NULL);
if(!trace_startsolid)
mi_max.z = trace_endpos.z;
}
if (!(tmp_cvar || tmp_value))
{
- LOG_TRACE("Error: Invalid usage of cvar_settemp(string, string); !\n");
+ LOG_TRACE("Error: Invalid usage of cvar_settemp(string, string); !");
return 0;
}
return 0;
}
- FOREACH_ENTITY_CLASS("saved_cvar_value", it.netname == tmp_cvar,
+ IL_EACH(g_saved_cvars, it.netname == tmp_cvar,
{
created_saved_value = -1; // skip creation
break; // no need to continue
{
// creating a new entity to keep track of this cvar
entity e = new_pure(saved_cvar_value);
+ IL_PUSH(g_saved_cvars, e);
e.netname = strzone(tmp_cvar);
e.message = strzone(cvar_string(tmp_cvar));
created_saved_value = 1;
cvar_set(it.netname, it.message);
strunzone(it.netname);
strunzone(it.message);
- remove(it);
+ delete(it);
++j;
}
else
});
#else
- entity e = world;
+ entity e = NULL;
while((e = find(e, classname, "saved_cvar_value")))
{
if(cvar_type(e.netname))
{
cvar_set(e.netname, e.message);
- remove(e);
+ delete(e);
++j;
}
else
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
return strcat(substring(theText, 0, textLengthUpToLength(theText, maxWidth - tw("..."), tw)), "...");
}
-float isGametypeInFilter(float gt, float tp, float ts, string pattern)
+float isGametypeInFilter(Gametype gt, float tp, float ts, string pattern)
{
string subpattern, subpattern2, subpattern3, subpattern4;
subpattern = strcat(",", MapInfo_Type_ToString(gt), ",");
return v;
}
-#ifndef MENUQC
+#ifdef GAMEQC
vector healtharmor_maxdamage(float h, float a, float armorblock, int deathtype)
{
// NOTE: we'll always choose the SMALLER value...
get_model_parameters_bone_aimweight[i] = 0;
}
get_model_parameters_fixbone = 0;
+ get_model_parameters_hidden = false;
-#ifndef MENUQC
+#ifdef GAMEQC
MUTATOR_CALLHOOK(ClearModelParams);
#endif
get_model_parameters_bone_upperbody = s;
if(c == "bone_weapon")
get_model_parameters_bone_weapon = s;
- #ifndef MENUQC
+ #ifdef GAMEQC
MUTATOR_CALLHOOK(GetModelParams, c, s);
#endif
for(int i = 0; i < MAX_AIM_BONES; ++i)
}
if(c == "fixbone")
get_model_parameters_fixbone = stof(s);
+ if(c == "hidden")
+ get_model_parameters_hidden = stob(s);
}
while((s = fgets(fh)))
cvar_settemp_restore(); // this must be done LAST, but in any case
}
-#ifndef MENUQC
+#ifdef GAMEQC
.float skeleton_bones_index;
void Skeleton_SetBones(entity e)
{
// start with a 1-element queue
queue_start = queue_end = e;
- queue_end.(fld) = world;
+ queue_end.(fld) = NULL;
queue_end.FindConnectedComponent_processing = 1;
// for each queued item:
{
// find all neighbors of queue_start
entity t;
- for(t = world; (t = nxt(t, queue_start, pass)); )
+ for(t = NULL; (t = nxt(t, queue_start, pass)); )
{
if(t.FindConnectedComponent_processing)
continue;
// it is connected? ADD IT. It will look for neighbors soon too.
queue_end.(fld) = t;
queue_end = t;
- queue_end.(fld) = world;
+ queue_end.(fld) = NULL;
queue_end.FindConnectedComponent_processing = 1;
}
}
queue_start.FindConnectedComponent_processing = 0;
}
-#ifndef MENUQC
+#ifdef GAMEQC
vector animfixfps(entity e, vector a, vector b)
{
// multi-frame anim: keep as-is
}
#endif
-#ifndef MENUQC
+#ifdef GAMEQC
Notification Announcer_PickNumber(int type, int num)
{
return = NULL;
}
#endif
-#ifndef MENUQC
+#ifdef GAMEQC
int Mod_Q1BSP_SuperContentsFromNativeContents(int nativecontents)
{
switch(nativecontents)