Равкоды
Их можно увидеть в редакторе, нажав 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. Если проблема для вас актуальна, то пишите в комментариях. Тогда я напишу статью, в какой последовательности переключать кодировки.
Конвертер
Собственно, ради чего всё и затевалось. Для удобного конвертирования равкодов был написан конвертер, который поможет легко и не принуждённо узнать любое представление числа и узнать, используется ли равкод игрой.

WC3








Ред. nazarpunk
Прокрутить к ресурсу
Ред. nazarpunk
Прокрутить к ресурсу