Равкоды
Их можно увидеть в редакторе, нажав Ctrl+D, но что значат эти буковки и почему их обязательно четыре? Всё просто - равкоды это байтовое представление числа. Парсер встретив в положенном месте 0x27, который как в UTF-8, так и в ASCII обозначает одинарную кавычку, начинает читать байты, пока не встретит следующий 0x27.
Эти байты он впоследствии интерпретирует как беззнаковые целые, тобишь uint32.
Бинарные файлы
Большинство значений игра хранит в Little Endian, но для равкодов используется Big Endian.
Код
В JASS под равкоды выделены одинарные кавычки, что упрощает работу с ними.
// Все записи равнозначны:
call CreateUnit(Player(0), 'Hfoo', 0,0,0)
call CreateUnit(Player(0), 0x48666f6f, 0,0,0)
call CreateUnit(Player(0), $48666f6f, 0,0,0)
call CreateUnit(Player(0), 1214672751, 0,0,0)
В lua одинарные и двойные кавычки равноправны и поэтому придумали функцию FourCC, которая конвертирует строковое представление числа собственно в число.
-- Все записи равнозначны:
CreateUnit(Player(0), FourCC('Hfoo'), 0,0,0)
CreateUnit(Player(0), 0x48666f6f, 0,0,0)
CreateUnit(Player(0), 1214672751, 0,0,0)
Как и в C++ разрешён равкод с одним символом, тобишь такое выражение вполне валидно:
integer i = 'a' + 'b'
Геройские равкоды
В игре очень гениальная проверка равкода на принадлежность к герою:
BOOL cdecl jIsHeroUnitId(unsigned int a)
{
return (a1 >> 24) <= 'Z';
}
Это значит, что если первый символ равкода, находится в таблице символов выше Z, то игра воспримет его как героя. Что может привести к неожиданным последствиям, например к фаталам от функций GetUnit*Cost.
Таблица геройских символов
0x20 | Space | |
0x21 | ! | Exclamation mark |
0x22 | " | Quotation mark |
0x23 | # | Number sign |
0x24 | $ | Dollar sign |
0x25 | % | Percent sign |
0x26 | & | Ampersand |
0x27 | ' | Apostrophe |
0x28 | ( | Left parenthesis |
0x29 | ) | Right parenthesis |
0x2A | * | Asterisk |
0x2B | + | Plus sign |
0x2C | , | Comma |
0x2D | - | Hyphen-minus |
0x2E | . | Full stop or period |
0x2F | / | Solidus or Slash |
0x30 | 0 | Digit Zero |
0x31 | 1 | Digit One |
0x32 | 2 | Digit Two |
0x33 | 3 | Digit Three |
0x34 | 4 | Digit Four |
0x35 | 5 | Digit Five |
0x36 | 6 | Digit Six |
0x37 | 7 | Digit Seven |
0x38 | 8 | Digit Eight |
0x39 | 9 | Digit Nine |
0x3A | : | Colon |
0x3B | ; | Semicolon |
0x3C | Less-than sign | |
0x3D | = | Equal sign |
0x3E | > | Greater-than sign |
0x3F | ? | Question mark |
0x40 | @ | At sign or Commercial at |
0x41 | A | Latin Capital letter A |
0x42 | B | Latin Capital letter B |
0x43 | C | Latin Capital letter C |
0x44 | D | Latin Capital letter D |
0x45 | E | Latin Capital letter E |
0x46 | F | Latin Capital letter F |
0x47 | G | Latin Capital letter G |
0x48 | H | Latin Capital letter H |
0x49 | I | Latin Capital letter I |
0x4A | J | Latin Capital letter J |
0x4B | K | Latin Capital letter K |
0x4C | L | Latin Capital letter L |
0x4D | M | Latin Capital letter M |
0x4E | N | Latin Capital letter N |
0x4F | O | Latin Capital letter O |
0x50 | P | Latin Capital letter P |
0x51 | Q | Latin Capital letter Q |
0x52 | R | Latin Capital letter R |
0x53 | S | Latin Capital letter S |
0x54 | T | Latin Capital letter T |
0x55 | U | Latin Capital letter U |
0x56 | V | Latin Capital letter V |
0x57 | W | Latin Capital letter W |
0x58 | X | Latin Capital letter X |
0x59 | Y | Latin Capital letter Y |
0x5A | Z | Latin Capital letter Z |
Оптимизаторы
Особо хитрые оптимизаторы придумали защиту от глобального поиска по равкодам - разбить его на два числа. Но из-за особенностей кодировок, неподдерживаемые символы превращаются в 0x3F, тобишь в знак вопроса. Если пересохранить такой файл в большинстве программ, то изначальные значения перепишутся и всё сломается.
Помочь с этим может IntelliJASS. Если проблема для вас актуальна, то пишите в комментариях. Тогда я напишу статью, в какой последовательности переключать кодировки.
Конвертер
Собственно, ради чего всё и затевалось. Для удобного конвертирования равкодов был написан конвертер, который поможет легко и не принуждённо узнать любое представление числа и узнать, используется ли равкод игрой.
Ред. nazarpunk
Ред. nazarpunk