X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Futil.qc;h=469ab50d8c809bc4d52d6d4d27e3cc70693b7722;hb=50ce40f7278957bcd42639ca3dcfbf55692aa298;hp=ee0eb1058575e45e14db2221683793684ef15b30;hpb=d24e46b65c1fe73fae4cf8034f4e7f318a17053a;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/util.qc b/qcsrc/common/util.qc index ee0eb1058..469ab50d8 100644 --- a/qcsrc/common/util.qc +++ b/qcsrc/common/util.qc @@ -318,7 +318,7 @@ string ScoreString(int pFlags, float pValue) if((pValue == 0) && (pFlags & (SFL_HIDE_ZERO | SFL_RANK | SFL_TIME))) valstr = ""; else if(pFlags & SFL_RANK) - valstr = count_ordinal(pValue); + valstr = (pValue < 256 ? count_ordinal(pValue) : _("N/A")); else if(pFlags & SFL_TIME) valstr = TIME_ENCODED_TOSTRING(pValue); else @@ -770,57 +770,6 @@ int cvar_settemp_restore() 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 tag_start = -1; - - if(substring(theText, pos - 1, 1) == "^") - { - if(isCaretEscaped(theText, pos - 1) || pos >= len) - return 0; - - int 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(int 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. @@ -842,7 +791,11 @@ float textLengthUpToWidth(string theText, float maxWidth, vector theSize, textLe { middle = floor((left + right) / 2); if(colors) - ofs = skipIncompleteTag(theText, middle, len); + { + vector res = checkColorCode(theText, len, middle, false); + ofs = (res.x) ? res.x - res.y : 0; + } + if(w(substring(theText, 0, middle + ofs), theSize) <= maxWidth) left = middle + ofs; else @@ -874,7 +827,11 @@ float textLengthUpToLength(string theText, float maxWidth, textLengthUpToLength_ { middle = floor((left + right) / 2); if(colors) - ofs = skipIncompleteTag(theText, middle, len); + { + vector res = checkColorCode(theText, len, middle, true); + ofs = (!res.x) ? 0 : res.x - res.y; + } + if(w(substring(theText, 0, middle + ofs)) <= maxWidth) left = middle + ofs; else @@ -922,11 +879,7 @@ string find_last_color_code(string s) string getWrappedLine(float w, vector theFontSize, textLengthUpToWidth_widthFunction_t tw) { - float cantake; - float take; - string s; - - s = getWrappedLine_remaining; + string s = getWrappedLine_remaining; if(w <= 0) { @@ -934,30 +887,26 @@ string getWrappedLine(float w, vector theFontSize, textLengthUpToWidth_widthFunc return s; // the line has no size ANYWAY, nothing would be displayed. } - cantake = textLengthUpToWidth(s, w, theFontSize, tw); - if(cantake > 0 && cantake < strlen(s)) + int take_until = textLengthUpToWidth(s, w, theFontSize, tw); + if(take_until > 0 && take_until < strlen(s)) { - take = cantake - 1; - while(take > 0 && substring(s, take, 1) != " ") - --take; - if(take == 0) - { - getWrappedLine_remaining = substring(s, cantake, strlen(s) - cantake); - if(getWrappedLine_remaining == "") - getWrappedLine_remaining = string_null; - else if (tw("^7", theFontSize) == 0) - getWrappedLine_remaining = strcat(find_last_color_code(substring(s, 0, cantake)), getWrappedLine_remaining); - return substring(s, 0, cantake); - } - else + int last_word = take_until - 1; + while(last_word > 0 && substring(s, last_word, 1) != " ") + --last_word; + + int skip = 0; + if(last_word != 0) { - getWrappedLine_remaining = substring(s, take + 1, strlen(s) - take); - if(getWrappedLine_remaining == "") - getWrappedLine_remaining = string_null; - else if (tw("^7", theFontSize) == 0) - getWrappedLine_remaining = strcat(find_last_color_code(substring(s, 0, take)), getWrappedLine_remaining); - return substring(s, 0, take); + take_until = last_word; + skip = 1; } + + getWrappedLine_remaining = substring(s, take_until + skip, strlen(s) - take_until); + if(getWrappedLine_remaining == "") + getWrappedLine_remaining = string_null; + else if (tw("^7", theFontSize) == 0) + getWrappedLine_remaining = strcat(find_last_color_code(substring(s, 0, take_until)), getWrappedLine_remaining); + return substring(s, 0, take_until); } else { @@ -968,11 +917,7 @@ string getWrappedLine(float w, vector theFontSize, textLengthUpToWidth_widthFunc string getWrappedLineLen(float w, textLengthUpToLength_lenFunction_t tw) { - float cantake; - float take; - string s; - - s = getWrappedLine_remaining; + string s = getWrappedLine_remaining; if(w <= 0) { @@ -980,30 +925,26 @@ string getWrappedLineLen(float w, textLengthUpToLength_lenFunction_t tw) return s; // the line has no size ANYWAY, nothing would be displayed. } - cantake = textLengthUpToLength(s, w, tw); - if(cantake > 0 && cantake < strlen(s)) + int take_until = textLengthUpToLength(s, w, tw); + if(take_until > 0 && take_until < strlen(s)) { - take = cantake - 1; - while(take > 0 && substring(s, take, 1) != " ") - --take; - if(take == 0) - { - getWrappedLine_remaining = substring(s, cantake, strlen(s) - cantake); - if(getWrappedLine_remaining == "") - getWrappedLine_remaining = string_null; - else if (tw("^7") == 0) - getWrappedLine_remaining = strcat(find_last_color_code(substring(s, 0, cantake)), getWrappedLine_remaining); - return substring(s, 0, cantake); - } - else + int last_word = take_until - 1; + while(last_word > 0 && substring(s, last_word, 1) != " ") + --last_word; + + int skip = 0; + if(last_word != 0) { - getWrappedLine_remaining = substring(s, take + 1, strlen(s) - take); - if(getWrappedLine_remaining == "") - getWrappedLine_remaining = string_null; - else if (tw("^7") == 0) - getWrappedLine_remaining = strcat(find_last_color_code(substring(s, 0, take)), getWrappedLine_remaining); - return substring(s, 0, take); + take_until = last_word; + skip = 1; } + + getWrappedLine_remaining = substring(s, take_until + skip, strlen(s) - take_until); + if(getWrappedLine_remaining == "") + getWrappedLine_remaining = string_null; + else if (tw("^7") == 0) + getWrappedLine_remaining = strcat(find_last_color_code(substring(s, 0, take_until)), getWrappedLine_remaining); + return substring(s, 0, take_until); } else { @@ -1298,7 +1239,7 @@ ERASEABLE void write_String_To_File(int fh, string str, bool alsoprint) { fputs(fh, str); - if (alsoprint) LOG_INFO(str); + if (alsoprint) LOG_HELP(str); } string get_model_datafilename(string m, float sk, string fil) @@ -1769,23 +1710,6 @@ Notification Announcer_PickNumber(int type, int num) } 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) @@ -1837,6 +1761,7 @@ Notification Announcer_PickNumber(int type, int num) } break; } + case CNT_NORMAL: default: { switch(num) @@ -1980,27 +1905,40 @@ void SetMovetypeFollow(entity ent, entity e) ent.v_angle = ent.angles - e.angles; // relative angles ent.aiment_classname = strzone(e.classname); ent.aiment_deadflag = e.deadflag; + + if(IS_PLAYER(ent.aiment)) + { + entity pl = ent.aiment; + ent.view_ofs.x = bound(pl.mins.x + 4, ent.view_ofs.x, pl.maxs.x - 4); + ent.view_ofs.y = bound(pl.mins.y + 4, ent.view_ofs.y, pl.maxs.y - 4); + ent.view_ofs.z = bound(pl.mins.z + 4, ent.view_ofs.z, pl.maxs.z - 4); + } } + void UnsetMovetypeFollow(entity ent) { set_movetype(ent, MOVETYPE_FLY); PROJECTILE_MAKETRIGGER(ent); - ent.aiment = NULL; + if (ent.aiment_classname) + strunzone(ent.classname); + // FIXME: engine bug? + // resetting aiment the engine will set orb's origin close to world's origin + //ent.aiment = NULL; } -float LostMovetypeFollow(entity ent) + +int LostMovetypeFollow(entity ent) { /* if(ent.move_movetype != MOVETYPE_FOLLOW) if(ent.aiment) error("???"); */ - if(ent.aiment) - { - if(ent.aiment.classname != ent.aiment_classname) - return 1; - if(ent.aiment.deadflag != ent.aiment_deadflag) - return 1; - } + // FIXME: engine bug? + // when aiment disconnects the engine will set orb's origin close to world's origin + if(!ent.aiment) + return 2; + if(ent.aiment.classname != ent.aiment_classname || ent.aiment.deadflag != ent.aiment_deadflag) + return 1; return 0; } #endif