Я про то, что с твоими дефайнами код приобретает совсем другой смысл. Это как Code define true = (GetRandomInt(0, 1) == 1) - компилятор проглотит, а исполняться будет непонятно как.
вы намекаете что код карты как то использует эти значения? если да, то вы правы а речь то об оптимизации, и как я уже сказал я обнуляю только то что не использую, даже будь то true, разве это плохо? не стоит забывать что это не язык программирования как таковой, а скриптовый язык движка
С теми дефайнами, которые я предложил (а точнее, Bribe) любая карта будет работать так же, как без них. С вашими же все цвета игроков станут красными. Добавлено (29 Августа 2012, 17:23:03) --------------------------------------------- PLAYER_COLOR_RED == null, но PLAYER_COLOR_BLUE != null.
да ведь вы упускаете суть, плэерколоры бесполезны, и т.н. "цена" быстродействия равна нулю, я ведь не говорю использовать это всюду, но лично мне не нужен playercolor(даже не догадываюсь где его использовать), так почему бы его не обнулить(в моём случаи), и уверен найдутся те кто солидарен со всем перечисленным, ну а те кто по каким-то причинам использует эти переменные, само собой поступают не оптимально, что выходит за рамки поставленной задачи - оптимизация
function Utf8NextChar takes string utf8, integer index returns integer local integer hash = StringHash(SubString(utf8, index, index + 1)) local boolean enhanced = false if hash >= 0x622796B0 then set enhanced = hash == 0x622796B0 or hash == 0x79680AB6 elseif hash >= -0x2528FB81 then if hash >= 0x3CAF85D5 then if hash >= 0x56FE5F09 then set enhanced = hash == 0x56FE5F09 or hash == 0x5B99BFC5 else set enhanced = hash == 0x3CAF85D5 or hash == 0x44F61401 endif elseif hash >= -0x894A683 then set enhanced = hash == -0x894A683 or hash == 0x1A95F0E1 else set enhanced = hash == -0x2528FB81 or hash == -0x15D74B40 endif elseif hash >= -0x49701044 then if hash >= -0x41A7335B then set enhanced = hash == -0x41A7335B or hash == -0x3E754453 else set enhanced = hash == -0x49701044 or hash == -0x473E9375 endif elseif hash >= -0x5CCC4FE0 then set enhanced = hash == -0x5CCC4FE0 or hash == -0x4BEDA821 else set enhanced = hash == -0x78635472 or hash == -0x65D3BCE0 endif if enhanced then return index + 2 endif return index + 1 endfunction
Функция, дающая возможность перебрать строку посимвольно, поскольку некоторые символы (в частности, русские буквы) занимают в памяти два байта. Пример использования:
Код
set length = StringLength(s) set i = 0 loop set j = Utf8NextChar(s, i) exitwhen j > length set ch = SubString(s, i, j) //ch - очередной символ строки, производим с ним какие-либо действия. set i = j endloop
Код
function Utf8Length takes string utf8 returns integer local integer length = StringLength(utf8) local integer result = 0 local integer i = 0 local integer j loop set j = Utf8NextChar(utf8, i) exitwhen j > length set result = result + 1 set i = j endloop return result endfunction
Как известно, StringLength("Строка!") == 13, поскольку кириллица занимает два байта, а латиница и знаки пунктуации - по одному. Эта функция вычисляет реальную длину строки: Utf8Length("Строка!") == 7.
Код
//Преобразует число из диапазона [0 .. 15] в шестнадцатеричную форму. function ToHexDigit takes integer digit returns string if digit < 8 then if digit < 4 then if digit < 2 then if digit == 0 then return "0" endif return "1" elseif digit == 2 then return "2" endif return "3" elseif digit < 6 then if digit == 4 then return "4" endif return "5" elseif digit == 6 then return "6" endif return "7" elseif digit < 0xC then if digit < 0xA then if digit == 8 then return "8" endif return "9" elseif digit == 0xA then return "A" endif return "B" elseif digit < 0xE then if digit == 0xC then return "C" endif return "D" elseif digit == 0xE then return "E" endif return "F" endfunction
//Преобразует строку с одной шестнадцатеричной цифрой в число. function FromHexDigit takes string s returns integer if s == "0" then return 0 elseif s == "1" then return 1 elseif s == "2" then return 2 elseif s == "3" then return 3 elseif s == "4" then return 4 elseif s == "5" then return 5 elseif s == "6" then return 6 elseif s == "7" then return 7 elseif s == "8" then return 8 elseif s == "9" then return 9 elseif s == "A" then return 0xA elseif s == "B" then return 0xB elseif s == "C" then return 0xC elseif s == "D" then return 0xD elseif s == "E" then return 0xE endif return 0xF endfunction
//Преобразует число из диапазона [0 .. 255] в шестнадцатеричную форму, //добавляя при необходимости лидирующий нуль. function ToColorHex takes integer x returns string local integer high = x / 16 return ToHexDigit(high) + ToHexDigit(x - high * 16) endfunction
//Преобразует четверку чисел (alpha, red, green, blue) в цветовой код //(включая управляющую последовательность "|c"). function GenerateColorCode takes integer a, integer r, integer g, integer b returns string return "|c" + ToColorHex(a) + ToColorHex(r) + ToColorHex(g) + ToColorHex(b) endfunction
Немного функций для работы с хексом и цветами.
Код
function GetGradientText takes string text, string leftColor, string rightColor returns string local integer transitions = Utf8Length(text) - 1 local integer a = 0x00 local integer r local integer g local integer b local integer da = 0 local integer dr local integer dg local integer db local integer i = StringLength(leftColor) local integer j local boolean alphaExists = i == 8 local string result = "" local string c
if transitions < 0 then return "" endif
//Предварительные преобразования, позволяющие распознавать цвета в любом формате, //включая произвольный регистр букв и отсутствие альфа-канала. set leftColor = StringCase(leftColor, true) if SubString(leftColor, 0, 2) == "|C" then set alphaExists = i == 10 endif if alphaExists then set a = FromColorHex(SubString(leftColor, i - 8, i - 6)) if transitions > 0 then set da = -a / transitions endif endif set r = FromColorHex(SubString(leftColor, i - 6, i - 4)) set g = FromColorHex(SubString(leftColor, i - 4, i - 2)) set b = FromColorHex(SubString(leftColor, i - 2, i))
if transitions > 0 then set i = StringLength(rightColor) set alphaExists = i == 8 set rightColor = StringCase(rightColor, true) if SubString(rightColor, 0, 2) == "|C" then set alphaExists = i == 10 endif if alphaExists then set da = (FromColorHex(SubString(rightColor, i - 8, i - 6)) - a) / transitions endif set dr = (FromColorHex(SubString(rightColor, i - 6, i - 4)) - r) / transitions set dg = (FromColorHex(SubString(rightColor, i - 4, i - 2)) - g) / transitions set db = (FromColorHex(SubString(rightColor, i - 2, i)) - b) / transitions endif
set i = 0 loop set j = Utf8NextChar(text, i) set c = SubString(text, i, j) if c == " " then set result = result + " " else set result = result + GenerateColorCode(a, r, g, b) + c endif exitwhen transitions == 0 set transitions = transitions - 1 set a = a + da set r = r + dr set g = g + dg set b = b + db set i = j endloop return result + "|r" endfunction
Функция, заливающая текст градиентом (переливающимся цветом). Строка с текстом не должна содержать цветовых кодов.