xgm.guru/p/wc3/about_int статья про целое число
xgm.guru/forum/showthread.php?t=15888 похожая статья, но здесь описан подробно пример применения чисел
xgm.guru/p/wc3/w3datatypes статья про типы, здесь можно прочитать про целое число
4-х значное число в варкрафте, используемое в способностях, юнитах, декорациях, баффах и др для обозначения типов объектов. Называют равкодом rawcode. ссылка.
Обычно выражаются 4 символами для удобства:
hfoo - равкод пехотинца. Что они означают? h - human (человек), foo - footman (пехотинец)
Hpal - равкод героя паладина. H - human (буквы героя выражают большими заглавными буквами, FAQ пункт 1.9 ), pal - paladin (паладин)
остальные расы: Undead (нежить), Elf (ночной эльф), Orc (орк)
Aslo - равкод способности замедление. A - Ability (способность, всегда с большой буквой), slo - slow (медленный, замедление)
AOwk - равкод способности стремительность A - Ability (способность), O - Orc (орк, расовые способности героев всегда пишут с большой буквой, роли никакой это не играет на механику, но всегда будет ясно, что это способность героя), wk - wind walk (ветренная ходьба).
BOwk - равкод заклинания (баффа buff) от способности стремительность. здесь та же самая запись. только отличается на 1 букву
dsum - равкод предмета "камень зова". Обычно у предметов нет строгих принципов как у юнитов, где первая буква означает расовую принадлежность. d - Dark (темный), sum - Summoning (вызов)
bspd - равкод ботинок скорости. b - boots (ботинки), spd - speed (скорости)
Hpal - равкод героя паладина. H - human (буквы героя выражают большими заглавными буквами, FAQ пункт 1.9 ), pal - paladin (паладин)
остальные расы: Undead (нежить), Elf (ночной эльф), Orc (орк)
Aslo - равкод способности замедление. A - Ability (способность, всегда с большой буквой), slo - slow (медленный, замедление)
AOwk - равкод способности стремительность A - Ability (способность), O - Orc (орк, расовые способности героев всегда пишут с большой буквой, роли никакой это не играет на механику, но всегда будет ясно, что это способность героя), wk - wind walk (ветренная ходьба).
BOwk - равкод заклинания (баффа buff) от способности стремительность. здесь та же самая запись. только отличается на 1 букву
dsum - равкод предмета "камень зова". Обычно у предметов нет строгих принципов как у юнитов, где первая буква означает расовую принадлежность. d - Dark (темный), sum - Summoning (вызов)
bspd - равкод ботинок скорости. b - boots (ботинки), spd - speed (скорости)
Все равкоды введены в 256-системы счисления. Обычно можно свободно ввести свой при создании в JNGP. Стоит заметить, что не все символы следует вводить. Например, при неизвестно символе может критовать, а jasshelher ругаться на указанный символ. Если ввести русский символ, у юнита в ро пропадают описания. Можно создать базу данных, последовательность номеров. Относительно типа можно узнавать сколько получить голды с фермы. Например число достаточно получить с помощью нативки GetUnitTypeID(...):
'h000' - ферма +1
'h001' - ферма +2
'h002' - ферма +3
значение равкода каждой фермы становится больше +1 - следствие продуманной базы данных.
'h000' - ферма +1
'h001' - ферма +2
'h002' - ферма +3
значение равкода каждой фермы становится больше +1 - следствие продуманной базы данных.
При созданий базы данных нужно всегда проверять с онлайн-калькулятором.
калькулятор 1 здесь сразу переводит в число и вам покажут несколько числа, выраженные в разных сс. Это отличает от текстовых калькуляторов. Например может сразу показать dec-число, как и варкрафте 3 в dec-число (вам выводится десятичное число на экран). Имею дело именно с этим онлайн-калькулятором. Это не реклама, но ничего другого найти не смог, нигде не смог найти похож, по каким критериям в гугле надо искать, я не знаю.
калькулятор 1 здесь сразу переводит в число и вам покажут несколько числа, выраженные в разных сс. Это отличает от текстовых калькуляторов. Например может сразу показать dec-число, как и варкрафте 3 в dec-число (вам выводится десятичное число на экран). Имею дело именно с этим онлайн-калькулятором. Это не реклама, но ничего другого найти не смог, нигде не смог найти похож, по каким критериям в гугле надо искать, я не знаю.
есть мобильные версии - скачать и установить приложения:
DEC HEX BIN ASCII Converter
Hex Converter Plus
есть множества др моб приложении, для компа не нашел пока что, тк для скачивания комп. программы есть сложности: трудно найти конвертер - среди утилит находит только конвертер текста, генератор цвета. Не вижу такой программы на комп, очень много мусора попадается. Также учитывайте, что их трудно закачать с сайтов, тк приходится прыгать по ссылкам - это просто потеря времени. Но и не охота качать, вирусняк вдруг подхватишь
Hex Converter Plus
есть множества др моб приложении, для компа не нашел пока что, тк для скачивания комп. программы есть сложности: трудно найти конвертер - среди утилит находит только конвертер текста, генератор цвета. Не вижу такой программы на комп, очень много мусора попадается. Также учитывайте, что их трудно закачать с сайтов, тк приходится прыгать по ссылкам - это просто потеря времени. Но и не охота качать, вирусняк вдруг подхватишь
В калькуляторе Windows встроены разные калькуляторы: обычный, инженерный и пр. Также есть программный калькулятор. Он позволяет конвентировать разные числа в разные системы счисления, разве что отсутствует Ascii 256-системы счисления. Кроме того позволяет совершать битовые операции.
калькулятор 2 здесь выводит в dec-число номер символа. Как видите, здесь имеем дело с текстом, и вам выводит совершенно другое, номер символа. Но это тоже полезно, если нужно составлять таблицу или базу данных для перевода равкода и других целей в вакрафте. В интернете именно таких калькуляторов очень много
калькулятор 3 здесь тоже самое, что и 2-ой калькулятор. Имеет дело выводит номер символа, короче выводит как текст. Номер символа можно записать так в dec - десятичной сс, так и в других системах. Например, A = 65 dec, а если ввести AB = 65 66.
=====
калькулятор 4 удобно дробные двоичные конвертации делать (ну для проверки).
калькулятор 5 ничего общего с конвертации чисел не имеет. просто для себя ссылку. Иногда полезно узнать остаток. В виндовс калькуляторе есть эта функция mod
калькулятор 3 здесь тоже самое, что и 2-ой калькулятор. Имеет дело выводит номер символа, короче выводит как текст. Номер символа можно записать так в dec - десятичной сс, так и в других системах. Например, A = 65 dec, а если ввести AB = 65 66.
=====
калькулятор 4 удобно дробные двоичные конвертации делать (ну для проверки).
калькулятор 5 ничего общего с конвертации чисел не имеет. просто для себя ссылку. Иногда полезно узнать остаток. В виндовс калькуляторе есть эта функция mod
https://ru.onlinemschool.com/math/assistance
http://www.ambrsoft.com/MathCalc/Line/TwoLinesIntersection/TwoLi...
http://www.ambrsoft.com/MathCalc/Line/TwoLinesIntersection/TwoLi...
зачем проверять нам калькулятором?
ошибка, с которой можете столкнуться вы. Или из-за не знания или из-за невнимательности. Мы заранее составляем базу данных. Бывает придумали что-то, и сохраняете id-шники в хэш-таблице, и с помощью математических ухитрении и ключей достаете нужный.
Приведу пример (это чтобы вы понимали что вар может не составить последовательность правильно):
например мы будем работать с идишником предмета (копии ориганала) - I008. У каждого оригинала-предмета будут свои копии, там 5 или 10. Мы знаем, что у предмета "духи-целители" 3 копии. Мы написали очень удобную функцию, которая добавляет при инициализации карты в хэш все эти равкоды. В базу данных по id-оригинала берем в функцию записываем идишник первой копии - I008, и все. Дальше - это продуманный код добавляет в таблицу равкоды. Циклом прибавляем I008+0, I008+1, I008+2.
например мы будем работать с идишником предмета (копии ориганала) - I008. У каждого оригинала-предмета будут свои копии, там 5 или 10. Мы знаем, что у предмета "духи-целители" 3 копии. Мы написали очень удобную функцию, которая добавляет при инициализации карты в хэш все эти равкоды. В базу данных по id-оригинала берем в функцию записываем идишник первой копии - I008, и все. Дальше - это продуманный код добавляет в таблицу равкоды. Циклом прибавляем I008+0, I008+1, I008+2.
код
function SaveR2Icharges takes integer original, integer rune, integer start_charges returns nothing
local integer i = 0
loop
exitwhen i == start_charges
call SaveInteger(udg_Hash, rune+i, 666, original) //Нужно связать ценники с одним типом. Это нужно для проверки, что занят ли он в магазине, также возвращает тип оригинала.
call SaveInteger(udg_Hash, original, 100 + i+1, rune + i )
//call BJDebugMsg( "i: " + I2S(i) )
set i = i + 1
endloop
call SaveInteger(udg_Hash, udg_ChargesTypeOfItem, original, start_charges)
endfunction
//SaveR2Icharges(original, rune, charge)
call SaveR2Icharges('wild', 'I007', 1) //амулет леса х1 заряд
call SaveR2Icharges('whwd', 'I008', 3) //духи-целители х3 заряда
Но когда вы будете работать, у вас может что-то не заработать. Дело в том, что в редакторе объектов (база данных) может быть отсутствует какой-нибудь идишник. Или не тот ключ, или он записан на другой идишник.
казалось бы все правильно, равкод числа на одну единицу меньше. Но как оказалось, где-то допустил ошибку (это редактор сам автоматом задавал равкоды, и я честно не доглядел. Просто не понимал в чем дело. немного попутал с 16-ричной с 256-ричной, надо смотреть по таблице). Берем любой онлайн-калькулятор ASCII , и переводим 10-чную систему, проверяя насколько отличается.
I008=1227894840
I009=1227894841
I00A=1227894849 Тут отличается на целых 8 знаков, короче сбивается база данных
I008=1227894840
I009=1227894841
I00A=1227894849 Тут отличается на целых 8 знаков, короче сбивается база данных
Давайте проверим что же под номером 1227894842 скрывается
1227894842=I00: не удивляйтесь, двоеточие - это тоже символ, в 256-ричной системе по-другому номеруются символы. Просто варкрафт не хочет вписывать этот символ, но мы можем вписать.
Вывод: Казалось бы мы можем доверить варкрафту составлении базы данных, и он создает равкоды в нужной последовательности, то есть на 1 единичку отличается. Но на самом деле не так. Видите, здесь варкрафт не любит знаки препинания в равкодах ставить, он их пропускает, а в jass-коде при компиляции кода ругается на недопустимые знаки. Например, ругает на переменную с таким именем. Вы должны сами проверять.
1227894842=I00: не удивляйтесь, двоеточие - это тоже символ, в 256-ричной системе по-другому номеруются символы. Просто варкрафт не хочет вписывать этот символ, но мы можем вписать.
Вывод: Казалось бы мы можем доверить варкрафту составлении базы данных, и он создает равкоды в нужной последовательности, то есть на 1 единичку отличается. Но на самом деле не так. Видите, здесь варкрафт не любит знаки препинания в равкодах ставить, он их пропускает, а в jass-коде при компиляции кода ругается на недопустимые знаки. Например, ругает на переменную с таким именем. Вы должны сами проверять.
Теперь надо переделать. Вместо I009 сделать I00:
Беру копирую итем I00A, и в jngp выскакивает окошко Create Object, и туда копируете 'I00:'
Беру копирую итем I00A, и в jngp выскакивает окошко Create Object, и туда копируете 'I00:'
Теперь получается так:
Где же еще можно использовать эту базу данных чисел?
при вычислении можно будет знать сколько получить денег с фермы. Это привел пример. Картоделы опытные используют большие ухитрения с работой равкодом.
при вычислении можно будет знать сколько получить денег с фермы. Это привел пример. Картоделы опытные используют большие ухитрения с работой равкодом.
Можем от типа узнавать сколько голды давать за убитых крипов - например в ТД. При хитрых ухитрениях можно создать многое, пример выше в второй статье
Или же сделать в РО базу данных для каждого героя, для каждого героя можно создать свой артефакт:
call CreateItem(GetUnitTypeId(<hero>)+0x01000000, GetUnitX(<hero>), GetUnitY(<hero>))
'H000' + 0x01000000 = 0x48303030 + 0x01000000 = 0x49303030 = 'I000' для каждого типа можно сделать свой артефакт
'O000' + 0x07000000 = 0x4F303030 + 0x07000000 = 0x56303030 = 'V000' для каждой расы
для каждого типа 'H000' можно создать свой набор артефактов, например 20 типов артефактов от 0 до 20:
'H000' (для одного типа) = 'I000'-'I00D' 20 типов итемов могут принадлежать только герою 'H000'
'H001' (для следующего типа) = I00E-I00Y эти 20 типов принадлежат 'H001' и так далее
'O000' + 0x07000000 = 0x4F303030 + 0x07000000 = 0x56303030 = 'V000' для каждой расы
для каждого типа 'H000' можно создать свой набор артефактов, например 20 типов артефактов от 0 до 20:
'H000' (для одного типа) = 'I000'-'I00D' 20 типов итемов могут принадлежать только герою 'H000'
'H001' (для следующего типа) = I00E-I00Y эти 20 типов принадлежат 'H001' и так далее
Заметка 1:
в последнее время в файле .j при взломе карте, можем не заметить указанных 4-х значных равкодов. Потому что, если открыть в текстовом редакторе, то можно увидеть вместо них числа в 10-чной системе счисления. Новички этого могут не понять. Но сделано это специально, чтобы взломщики не смогли ничего понять, и главное чтобы ленились взламывать.
в последнее время в файле .j при взломе карте, можем не заметить указанных 4-х значных равкодов. Потому что, если открыть в текстовом редакторе, то можно увидеть вместо них числа в 10-чной системе счисления. Новички этого могут не понять. Но сделано это специально, чтобы взломщики не смогли ничего понять, и главное чтобы ленились взламывать.
Заметка 2:
равкод можно вывести на экран в игре с помощью I2S. так можно и через 256-чную, так 16-ричную, и 8-ричную. Переводит все в 10 систему счисления.
равкод можно вывести на экран в игре с помощью I2S. так можно и через 256-чную, так 16-ричную, и 8-ричную. Переводит все в 10 систему счисления.
можно проверить калькулятором ascii-table.com/calculator.php
'e0EU'=0x65304555 hex=014514042525 oct=1697662293 dec
пример
'e0EU'(Characters) - 256-ричная система счисления ASCII, каждый символ называется "чар" (char).
Если надо перевести из 256-ричную в десятичную (все рассказано вот здесь ):
Если надо перевести из 256-ричную в десятичную (все рассказано вот здесь ):
Если надо перевести из десятичной в 256-ричную систему (по остатку от деления находим номер чара):
Другой способ из 10-чной в 256-ричную сс:
0x65304555 - 16-ричная система счисления, обычно к hex-числу добавляют 0x или 1x. 0x65304555=1697662293 (0x - положительное число), а 1x65304555=-1697662293 (1x - отрицательное число)
014514042525 - 8-ричная система счисления, обычно к oct-числу добавляют 0
1100101001100000100010101010101 - двоичная система счисления, 32 разряда (длина строки 32 символа). Это машинный код. специально отделил зеленым цветом на 4 разряда - можно перевести в 16=ричную сс.
1100101001100000100010101010101 - отделил красным на 3 разряда - можно перевести в 8-ричную сс
1100101001100000100010101010101 - отделил красным на 3 разряда - можно перевести в 8-ричную сс
У каждой системы есть определенное число символов, и основание.
Hexadecimal - 16-ричная система счисления (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F) обычно большие и маленькие буквы это один и тот же символ. Например: A = 10, a = 10; B = 11, b = 11 и так далее.
применение 16-ричной системы счисления
используется в варкрафте, обычно на jass прописывают добавляя (0x<число hex>= положительное число или 1x<число hex>= отрицательнок число). Например, 0x00000001 = 1. Или например: 1x00000001 = -1.
используется в варкрафте для генерации цветов ARGB.
AA : alpha value (альфа - прозрачность)
RR : red value (красный)
GG : green value (зеленый)
BB : blue value (синий)
AA : alpha value (альфа - прозрачность)
RR : red value (красный)
GG : green value (зеленый)
BB : blue value (синий)
Кодировка ARGB:
|c - открыть цветовой тег;
первые 2 символа - прозрачность;
вторые 2 символа - красный;
третьи 2 - зелёный;
последние 2 - синий.
|r - закрыть тег
|c - открыть цветовой тег;
первые 2 символа - прозрачность;
вторые 2 символа - красный;
третьи 2 - зелёный;
последние 2 - синий.
|r - закрыть тег
Всего 4 значения (прозрачный, красный, зеленый, синий). Варьируются эти значения от 0 до 255 в 16-ричной системе счисления. Там в 16 ричной системе цвет обозначается двумя символами от 00 до FF (ff). Так 0 обозначают 00, а вот 16 обозначается в hex 10 , 128 обозначают 80, а вот 255 превращают в FF.
В большинстве случаев, вы делаете текст полностью видимым (255 = FF), используя FF как альфа. Прозрачным (0 = 00) текст трудно сделать в описании предметов и юнитов, пробовал. Но можно прозрачным сделать в текстагах. Хотя, у текстагов уже есть отдельные функции для смены цветов.
А что касается остальных, чем больше значения, тем светлее оттенок цвета, и наоборот.
FF000000 - черный цвет со значением 0 у цветов (red, gren and blue)
FFFFFFFF - белый цвет со значением 255 у всех цветов (red, gren and blue)
FFFF0000 - красный
FF00FF00 - зеленый
FF0000FF - синий
FFFFFFFF - белый цвет со значением 255 у всех цветов (red, gren and blue)
FFFF0000 - красный
FF00FF00 - зеленый
FF0000FF - синий
Decimal - 10-тичная система счисления (0,1,2,3,4,5,6,7,8,9)
Octal - 8-ричная система счисления (0,1,2,3,4,5,6,7). В jass обычно к числу в 8-ричной системы приписывают нолик. Например: 044 = 36
Binary - двоичная система счисления (машинный 0 и 1). В варкрафте на jass двоичный код не применим.
Octal - 8-ричная система счисления (0,1,2,3,4,5,6,7). В jass обычно к числу в 8-ричной системы приписывают нолик. Например: 044 = 36
Binary - двоичная система счисления (машинный 0 и 1). В варкрафте на jass двоичный код не применим.
пример
в качестве примера показан двоичный код из 32 символов
двоичный код обычно состоит в таком виде
1000 0000 0000 0000 0000 0000 0000 0000 = 10 0 0 0 0 0 0 0 oct = 8 0 0 0 0 0 0 0 0 hex
Специально разделил двоичный код на 4 разряда, но в вакрафте лучше писать слитно.
двоичный код обычно состоит в таком виде
1000 0000 0000 0000 0000 0000 0000 0000 = 10 0 0 0 0 0 0 0 oct = 8 0 0 0 0 0 0 0 0 hex
Специально разделил двоичный код на 4 разряда, но в вакрафте лучше писать слитно.
10000000000000000000000000000000 = 2^31=2147483648
но в jass невозможно указать integer в двоичной (binary) системе счисления, но она очень важна для понимания всего материала. Один разряд в двоичной системе называется бит, восемь разрядов или двух разрядное шестнадцатеричное число - байт.
если поставить двоичный код из 32 символов в jass, то система будет преобразовано не двоичную систему, а в 8-ричную. Например, если я выставлю в вакрафте такой код:
0000 0000 0000 0000 0000 0000 0000 0010 = 00000000000000000000000000000010=8 а должна была быть двойка вместо восьмерки. Дело в том, что если спереди ноль поставить, то вар преобразует в 8-ричную сс. А если перед этим числом стоит единица то такого не будет, например 101 = 101 - то будет обозначать сто один в 10-чной сс
но в jass невозможно указать integer в двоичной (binary) системе счисления, но она очень важна для понимания всего материала. Один разряд в двоичной системе называется бит, восемь разрядов или двух разрядное шестнадцатеричное число - байт.
если поставить двоичный код из 32 символов в jass, то система будет преобразовано не двоичную систему, а в 8-ричную. Например, если я выставлю в вакрафте такой код:
0000 0000 0000 0000 0000 0000 0000 0010 = 00000000000000000000000000000010=8 а должна была быть двойка вместо восьмерки. Дело в том, что если спереди ноль поставить, то вар преобразует в 8-ричную сс. А если перед этим числом стоит единица то такого не будет, например 101 = 101 - то будет обозначать сто один в 10-чной сс
Characters - 256-ричная система счисления ASCII (American Standard Code for Information Interchange), каждый символ называется "чар" (char). Все символы не влезут, если буду печатать сейчас, их очень много. Таблица большая у 256-ричной системы. У каждого языка есть своя таблица, обычно 126 символов - стандартная, а остальная отличается. В варкрафте при конвертации работаем только с буквами латинского алфавита и цифрами, и иногда знаки препинания. Поэтому и не нужно в варкрафте записывать все символы.
ВОПРОС: зачем тогда нам нужно переводить, если можем вывести на экран и узнать какой-нибудь равкод. Да, так мы можем. Это безусловно поможет при взломе. Другое дело, когда создавать какие-то объекты динамически по ходу игры (часто можно хранить данные в двоичном коде) или что-то делать в течении игры (конечно вариантов пока мало, не понимаю как поможет эта конвертация систем счисления из строк в числа). Но знаю одну систему, которую хотел сделать пользователь. Например, ввести в чат равкод паладина "-Hpal", который будет создан в центре карты (такой единственный пример).
вот ссылка на карту
вот ссылка на карту можно просто сделать бд. Вводишь строку и все
вот ссылка на карту
вот ссылка на карту можно просто сделать бд. Вводишь строку и все
есть интересный момент работы с мем хаком. Опыт
www.hiveworkshop.com/threads/memory-hack.289508 здесь описан код. правда устарел.
скачать новую можно здесь
Но здесь, на хайве (выше ссылочка), изложен принцип работы, и как находить адреса. Для новичка, который умеет кодить на jass, это будет не очень-то и понятно. Пользуюсь не часто memory hack, поэтому и знаю мало. Мне было достаточно использовать те функции, которые имелись. Большинство функции мне не понятны. Со временем может пойму.
Но здесь, на хайве (выше ссылочка), изложен принцип работы, и как находить адреса. Для новичка, который умеет кодить на jass, это будет не очень-то и понятно. Пользуюсь не часто memory hack, поэтому и знаю мало. Мне было достаточно использовать те функции, которые имелись. Большинство функции мне не понятны. Со временем может пойму.
Когда мне нужно было изменять стоимость предмета или стоимость юнита, описания, я не нашел нужных мне функции для торговли. Так хотелось динамично изменять цены. Поэтому пошел читать конспект Драколича что представлен выше, как найти мне значения. На примере, я сначала начал работать с ConvertHandle. Я просто не понимал эту функцию, но сделал все как было написано в конспекте. Повторил один в один. Поверьте, очень долго тыкал, и не понимал. Большинство функции (защита, атака, реген и многое другое), которые представлены драколичем, сильно связаны с ConvertHandle. Пытался сравнивать их с моим результатами, и меня удивляло, что я не мог найти ценник на моего героя. Даже проверочной функцией пытался найти формулу.
функция
Сравнивая эти функции драколича, начал понимать для чего ConvertHandle. И пытался найти адреса. У каждого объекта есть список адресов. Это группа адресов занимает определенный диапазон. Адреса строго понумерованы относительно ConvertHandle.
local integer i = 0 //счетчик цикла
local integer c = 0 //счетчик чисел (подсчитывает кол-во нужных чисел)
local integer a //значение ячейки (целое число)
local real r //значение ячейки (реальное число, предполагалось использовать, если нужно найти реальное число)
call echo("1 hero: " + GetUnitName(u) + " :" + Int2Hex(ConvertHandle(u))) //просто дебаг, выводит на экран. вот еще один из примеров конвертации, функция Int2Hex возращает строку. Как мы видим, иначе вар в десятичную переведет. А нам нужно hex-число для работы с адресами
set LastConvertedHandle=ConvertHandle(u) //адрес ячейки объекта. в игре адреса динамичные, в этой игре адрес 5, в следующей игре адрес 8. Какое-то смещение. Если адрес ячейки чем-то занят, то перезапишется на другой. Поэтому нам помогают подобные функции
loop
set a = 0
set r = 0
exitwhen i > 0xFF //попробовать можно FFFFFFFF
set a = (RMem(LastConvertedHandle + i)) //function mI2R - функция на реалку. функция RMem - новая, в новой версии. RMem - считывает значения из ячейки, WMem - перезаписывают
if a == 595759 then //я ввел в редакторе в ценник героя 595759, и пытаюсь найти это число
set c = c + 1
call BJDebugMsg("номер порядка: " + (I2S(i)) + ", число: " + I2S(a))
endif
set i = i + 1
endloop
call BJDebugMsg("общее кол-во чисел: " + (I2S(c)))
Оказалось, что ConvertHandle не подходит. Дело в том, что адрес ценника зависит не от объекта, а от типа объекта. Надо было использовать GetUnitDataDefById
как нашел вручную
первая попытка:
convert: 0x0FAD0634 = 262997556 dec адрес юнита 0FAD0634 выдала ConvertHandle
convert: 0x12797648 = 309950024 dec адрес стоимости юнита 12797648 нашел через artmoney (легко делается, в редакторе задайте самое редкое значение например "595759". Найдите это значение, мне выдало 5-6 значении. Судя всего одно то что нам нужное, остальные это побочные. Измените одно значение, и посмотрите как ведет себя игра. Если изменилась, подождите 5-7 секунд. Некоторые значения могут вернуть числа на место. Побочные значения бывают зависимы от основного значения, если вы измените основное значения, изменятся и побочные. Видимо, побочные значения - те цифры на экране). Сверните игру, вернитесь в оуну виндовс и в артмони попробуйте так проделать с каждым число. Обычно, хранятся в 4-байтах)
convert: 0x0FAD0634 = 262997556 dec адрес юнита 0FAD0634 выдала ConvertHandle
convert: 0x12797648 = 309950024 dec адрес стоимости юнита 12797648 нашел через artmoney (легко делается, в редакторе задайте самое редкое значение например "595759". Найдите это значение, мне выдало 5-6 значении. Судя всего одно то что нам нужное, остальные это побочные. Измените одно значение, и посмотрите как ведет себя игра. Если изменилась, подождите 5-7 секунд. Некоторые значения могут вернуть числа на место. Побочные значения бывают зависимы от основного значения, если вы измените основное значения, изменятся и побочные. Видимо, побочные значения - те цифры на экране). Сверните игру, вернитесь в оуну виндовс и в артмони попробуйте так проделать с каждым число. Обычно, хранятся в 4-байтах)
======================================
вторая попытка:
convert: 0x0FAC0634 = 262932020 dec адрес юнита 0FAC0634 выдала ConvertHandle
convert: 0x12777648 = 309818952 dec адрес стоимости юнита 12777648 нашел через artmoney
convert: 309818920 dec = 0x12777628 адрес 309818920 типа выдал GetUnitDataDefById через дебаг на экран
convert: 0x0FAC0634 = 262932020 dec адрес юнита 0FAC0634 выдала ConvertHandle
convert: 0x12777648 = 309818952 dec адрес стоимости юнита 12777648 нашел через artmoney
convert: 309818920 dec = 0x12777628 адрес 309818920 типа выдал GetUnitDataDefById через дебаг на экран
309818952-309818920=32 получается адрес ячейки к стоимости золота данного типа находится смещается на 32. Надо снова перепроверить.
======================================
третья попытка:
convert: 0x0FBC0634 = 263980596 dec адрес юнита 0FBC0634 выдала ConvertHandle
convert: 0x12877648 = 310867528 dec адрес стоимости юнита 12877648 нашел через artmoney
convert: 310867496 dec = 0x12877628 адрес 310867496 типа выдал GetUnitDataDefById через дебаг на экран
convert: 0x0FBC0634 = 263980596 dec адрес юнита 0FBC0634 выдала ConvertHandle
convert: 0x12877648 = 310867528 dec адрес стоимости юнита 12877648 нашел через artmoney
convert: 310867496 dec = 0x12877628 адрес 310867496 типа выдал GetUnitDataDefById через дебаг на экран
310867528-310867496=32 все верно
function GetUnitPrice takes integer id returns integer
local integer a =GetUnitDataDefById(id)
if a>0 then
return RMem(a + 32)
endif
return 0
endfunction
function SetUnitPrice takes integer id, integer gold returns integer
local integer a =GetUnitDataDefById(id)
if a>0 then
call WMem(a + 32, gold)
endif
return 0
endfunction
проще можно было с программой Cheat Engine (CE), которую представил драколич. Но я не подумал. Надо было брать GetUnitDataDefById, и полученное значение вставлять в Cheat Engine (CE)
Просто не знал. Мне просто повезло, я тыкался до ночи. И как-то додумался. Просто знаете, эти значения и описания могут быть все завязаны на тип (записаны в slk). Точно не утверждаю что так работает, но что-то много работал с slk-таблицами. Короче распространяются изменения на все итемы этого типа. Изменяете описание одного итема, распространяются на все. Просто догадался, ибо Data - база данных. Возможно можно изменить конкретный тип. Видел похожие функции типа GetObjectDataCaching. Пока не разобрался.
Или например, часто записанный код в 10-чной системе мало помогает в дебагах. Допустим, хочу узнать какой это артефакт сработал, если копии несколько. Но дебаг показывает слишком большие номера, например 1697662293. Такое трудно запомнить. Необходимо перевести в 256-ричную. Чтоб не утруждал себя лишней работой. Ну мало ли. Или в прелоад записать, и онлайне обработать. Это не есть решение, так как можно получше вычислить что за объект.
Или можно хранить в двоичном коде какую-нибудь информацию. хотя постоянно придется перебирать символы
1010 - код состоит из 4 символов
первый символ - может ли рабочий бегать (1 - да, или 0 - нет), второй символ - может ли спать, третий - может ли плавать и так далее. главное придумать.
1010 - код состоит из 4 символов
первый символ - может ли рабочий бегать (1 - да, или 0 - нет), второй символ - может ли спать, третий - может ли плавать и так далее. главное придумать.
Вот несколько примерных систем (здесь представлен мой разбор, это полезно для развития):
циклом перебираем каждый массив и сравниваем строчный символ ASCII или HEX. Если символы одинаковы, выдаст номер массива
за основу взята система счисления Jon и ScorpioT1000 (+ доработана и добавлено).
xgm.guru/p/wc3/58159 библиотека функции
Перейдем теперь к недостаткам системы, я вот доработал систему по-своему. Дело в том, что систему, которую я предоставил выше, была создана не мной. Она была у меня первый эталоном красоты и по понятлевее что ли. Обычно многие на Cjass и Vjass делают. Но она у меня не работала, и я оставлял все это дело в долгий ящик. Так как конвертация систем счисления не очень то и нужная вещь в моей карте, ведь в интернете полно онлайн-калькуляторов-переводчиков. Если бы я искал бы дольше, мог бы и найти систему счисления. Сейчас времени у меня полно, поэтому решил делать систему. Как оказалось позже, можно было использовать StringHash. Тогда мало, что понимал в системах счислениях (так как не понимал).
Сейчас намного больше подучил, начинаю соображать. Например, вы можете узнать из чего состоит равкод xgm.guru/p/wc3/rawcode-to-string У каждой системы определенное кол-во символов, у каждой системы свой алфавит или таблица, свой номер. Но об этом чуть позже.
чтобы понять принцип работы - можно посмотреть вот этот пример xgm.guru/p/wc3/rawcode-to-string
Еще примеры
чтобы понять принцип работы - можно посмотреть вот этот пример xgm.guru/p/wc3/rawcode-to-string
Еще примеры
Конечно эта система работает так (см. ниже на скрине)
Вернемся к той выбранной выше системе. Но у нее сохранились недостатки, она не работала. Ошибка была в хранении данных по индексу, мы не могли сохранить массиве число или строку. Ошибка была в функции S2Ix. Она старая, ее немного даже правил ScorpioT1000.
function S2Ix takes string s returns integer
//return GetHandleId(s) // changed, 20.03.2012
return StringHash(s) // changed by ScorpioT1000, 03.04.2012
//return s
//return 0
endfunction
Из всех предложенных вариантов осталось бы использовать StringHash
return StringHash(s) это не работает так как значения слишком большие. число "0" возвращает -242600650, "1" возвращает 1132341824. Эти числа предполагалось использовать в индексах массива для заполнения бд. А размер индекса 8192. Если число > 8192, вар перезаписывает как ноль или не может записать. Поэтому при работе всегда возвращает ноль. Используется только в хэше.
Поэтому использовать лучше в качестве хранения хэш-таблицу
"H" = 72
SaveStr(hash,StringHash("72"),1,"H")
LoadStr(hash,StringHash("72"),1)
"H" = 72
SaveStr(hash,StringHash("72"),1,"H")
LoadStr(hash,StringHash("72"),1)
SaveInteger(hash,StringHash("H"),1,72)
LoadInteger(hash,StringHash("H"),1)
LoadInteger(hash,StringHash("H"),1)
Читал конечно про эту функцию в статье xgm.guru/p/blog-bahek/157979 но ничего не понял
У меня StringHash не зашел, поэтому я пошел по-другому пути. В функции мне надо, чтобы строка возвращала число. Как это сделать? Конечно циклом, я перебирал сравнивал строку с каждым массивом. И если такой символ есть, мне выдаст номер массива.
код системы
globals
integer array Pow2x //возводит число 2 в n степень - позволяет получить готовое, а не возводить в степерь по 20 раз
integer array Pow8x //возводит число 8 в n степень
integer array Pow16x //возводит число 16 в n степень
integer array Pow256x //возводит число 256 в n степень
string array CharMap2x16 //позволяет перебирать триады (3 разряда) из двоичного кода, своего рода заранее забитая таблица
string array CharMap2x8 //позволяет перебирать тетрады (4 разряда) из двоичного кода, своего рода заранее забитая таблица
string array CharMap16 //хранит символ 16-ричной сс, в индексе массива записан номер символа, а в строке символ. учавствует переборе, и также собирает символы в 16-ричный код
string array CharMap256 //хранит символ 256-ричной сс. в индексе массива записан номер символа, а в строке символ. учавствует переборе, и также собирает символы в 4-мтроковой равкод
integer array CharInx16 //хранит номер символа 16-ричной сс. возвращает число. позволяет возвращать в 10-чное число
integer array CharInx256 //хранит номер символа 16-ричной сс. возвращает число. позволяет возвращать в 10-чное число
endglobals
//function S2Ix takes string s returns integer
//return GetHandleId(s) // changed, 20.03.2012
//return StringHash(s) // changed by ScorpioT1000, 03.04.2012
//return s
//return 0
//endfunction
function Str2Int256 takes string s returns integer
local integer i = 32
local integer n=-1
loop
if s==CharMap256[i] then
set n = i
endif
exitwhen (i>126 or s==CharMap256[i])
set i = i + 1
endloop
return n //если такого символа не существует вернет -1, иначе вар фаталит с ошибкой
endfunction
function Str2Int16 takes string s returns integer
local integer i = 0
local integer n=-1
loop
if s==CharMap16[i] then
set n = i
endif
exitwhen (i>16 or s==CharMap16[i])
set i = i + 1
endloop
return n //если такого символа не существует вернет -1, иначе вар фаталит с ошибкой
endfunction
function ASCII2DEC takes string num256 returns integer
local integer num10 = 0
local integer i = 0
local integer len = StringLength(num256)
loop
exitwhen i >= len
set num10 = num10 + CharInx256[Str2Int256(SubString(num256, i, i+1))] * Pow256x[len-i-1]
set i = i + 1
endloop
return num10
endfunction
function DEC2ASCII takes integer num10 returns string
local string num256 = ""
local integer i = 3
local integer CodeCh
loop
exitwhen i < 0
set CodeCh = 0
loop
exitwhen num10 < Pow256x[i]
set CodeCh = CodeCh + 1
set num10 = num10 - Pow256x[i]
endloop
if CodeCh > 0 then
set num256 = num256 + CharMap256[CodeCh]
endif
set i = i - 1
endloop
return num256
endfunction
function DEC2Binary takes integer num10 returns string
local string s1 = ""
local string s2 = ""
local integer e = num10
local integer C = num10
loop
set e = e/2 //делим число e на основание 2, до сих пор пока число e не станет меньше или равно 1
set s1 = s1 + I2S(ModuloInteger(C,2)) //извлекаем остаток при делении на основание
set C = e //перезаписываем так как число e изменилось, и от него будет брать остаток
exitwhen e <= 0 //делится число до сих пор пока не станет равно или меньше 1
endloop
set C = StringLength(s1) //кол-во рядов
set e = C
call BJDebugMsg("Получилось при делений на основание 2: " + s1 +". Кол-во рялов - " + I2S(C))
call BJDebugMsg("Переворачиваем символы")
loop
exitwhen e < 1
set s2 = s2 + SubString(s1, e-1, e)
call BJDebugMsg(SubString(s1, e-1, e))
set e = e - 1
endloop
return s2
endfunction
function Binary2Octal takes string num2 returns string
local string z1 = ""
local string z2 = ""
local integer len = StringLength(num2)
local integer i = len
local integer start
local integer k
local integer n
loop
exitwhen i <= 0
set start = i-3 //порядок строки
if start <= 0 then //если порядок строки меньше 0, то выдает не символы. Поэтому делаем проверку
set start = 0
endif
set z1 = SubString(num2, start, i)
set k = 0
loop
exitwhen k>7
if (S2I(z1)==S2I(CharMap2x8[k])) then //решающая функция это S2I иначе при переборе CharMap2x8 не всегда можно подобрать подходящую
//так как варкрафт не добирает нулей при разложении на триады - 3 разряда (10101 = 10 101. тут у 10 нет нуля, 010). их походу самому придеться добавлять
set z2 = z2 + I2S(k)
set n = k
endif
set k=k+1
endloop
call BJDebugMsg(I2S(i) + " - выбрана триада: " + z1 + " получили из таблицы: " + I2S(n) + " это из 8-ричной системы " )
set i = i - 3
endloop
call BJDebugMsg("Переворачиваем символы")
set k = StringLength(z2) //кол-во рядов
set i = k
set z1 = ""
loop
exitwhen k < 1
set z1 = z1 + SubString(z2, k-1, k)
call BJDebugMsg(SubString(z2, k-1, k))
set k = k - 1
endloop
return z1
endfunction
function Binary2Hex takes string num2 returns string
local string z1 = ""
local string z2 = ""
local integer len = StringLength(num2)
local integer i = len
local integer start
local integer k
local integer n
loop
exitwhen i <= 0
set start = i-4 //порядок строки
if start <= 0 then //если порядок строки меньше 0, то выдает не символы. Поэтому делаем проверку
set start = 0
endif
set z1 = SubString(num2, start, i)
set k = 0
loop
exitwhen k>15
if (S2I(z1)==S2I(CharMap2x16[k])) then //решающая функция это S2I иначе при переборе CharMap2x16 не всегда можно подобрать подходящую
//так как варкрафт не добирает нулей при разложении на тетрады - 4 разряда (100101 = 10 0101. тут у 100 нет нуля, 0100). их походу самому придеться добавлять
set z2 = z2 + CharMap16[k]
set n = k
endif
set k=k+1
endloop
call BJDebugMsg(I2S(i) + " - выбрана Тетрада: " + z1 + " получили из таблицы: " + I2S(n) + " это из 8-ричной системы " )
set i = i - 4
endloop
call BJDebugMsg("Переворачиваем символы")
set k = StringLength(z2) //кол-во рядов
set i = k
set z1 = ""
loop
exitwhen k < 1
set z1 = z1 + SubString(z2, k-1, k)
call BJDebugMsg(SubString(z2, k-1, k))
set k = k - 1
endloop
return z1
endfunction
function Binary2DEC takes string num2 returns integer
local integer num10 = 0
local integer i = 0
local integer len = StringLength(num2)
loop
exitwhen i >= len
set num10 = num10 + S2I(SubString(num2, i, i+1)) * Pow2x[len-i-1]
set i = i + 1
endloop
return num10
endfunction
function HEX2DEC takes string num16 returns integer
local integer num10 = 0
local integer i = 0
local integer len = StringLength(num16)
loop
exitwhen i >= len
set num10 = num10 + CharInx16[Str2Int256(SubString(num16, i, i+1))] * Pow16x[len-i-1]
set i = i + 1
endloop
return num10
endfunction
function DEC2HEX takes integer num10 returns string
local string num16 = ""
local integer i = 7
local integer CodeCh
loop
exitwhen i < 0
set CodeCh = 0
loop
exitwhen num10 < Pow16x[i]
set CodeCh = CodeCh + 1
set num10 = num10 - Pow16x[i]
endloop
if CodeCh > 0 then
set num16 = num16 + CharMap16[CodeCh]
endif
set i = i - 1
endloop
return num16
endfunction
//-
function ForLoadMap2 takes nothing returns nothing
call BJDebugMsg("ЗАГРУЗКА 1")
set CharInx16[Str2Int16("0")] = 0
set CharInx16[Str2Int16("1")] = 1
set CharInx16[Str2Int16("2")] = 2
set CharInx16[Str2Int16("3")] = 3
set CharInx16[Str2Int16("4")] = 4
set CharInx16[Str2Int16("5")] = 5
set CharInx16[Str2Int16("6")] = 6
set CharInx16[Str2Int16("7")] = 7
set CharInx16[Str2Int16("8")] = 8
set CharInx16[Str2Int16("9")] = 9
set CharInx16[Str2Int16("A")] = 10
set CharInx16[Str2Int16("a")] = 10
set CharInx16[Str2Int16("B")] = 11
set CharInx16[Str2Int16("b")] = 11
set CharInx16[Str2Int16("C")] = 12
set CharInx16[Str2Int16("c")] = 12
set CharInx16[Str2Int16("D")] = 13
set CharInx16[Str2Int16("d")] = 13
set CharInx16[Str2Int16("E")] = 14
set CharInx16[Str2Int16("e")] = 14
set CharInx16[Str2Int16("F")] = 15
set CharInx16[Str2Int16("f")] = 15
set CharInx256[Str2Int256("!")] = 33
set CharInx256[Str2Int256(" ")] = 34
set CharInx256[Str2Int256("#")] = 35
set CharInx256[Str2Int256("$")] = 36
set CharInx256[Str2Int256("%")] = 37
set CharInx256[Str2Int256("&")] = 38
set CharInx256[Str2Int256("'")] = 39
set CharInx256[Str2Int256("(")] = 40
set CharInx256[Str2Int256(")")] = 41
set CharInx256[Str2Int256("*")] = 42
set CharInx256[Str2Int256("+")] = 43
set CharInx256[Str2Int256(",")] = 44
set CharInx256[Str2Int256("-")] = 45
set CharInx256[Str2Int256(".")] = 46
set CharInx256[Str2Int256("/")] = 47
set CharInx256[Str2Int256("0")] = 48
set CharInx256[Str2Int256("1")] = 49
set CharInx256[Str2Int256("2")] = 50
set CharInx256[Str2Int256("3")] = 51
set CharInx256[Str2Int256("4")] = 52
set CharInx256[Str2Int256("5")] = 53
set CharInx256[Str2Int256("6")] = 54
set CharInx256[Str2Int256("7")] = 55
set CharInx256[Str2Int256("8")] = 56
set CharInx256[Str2Int256("9")] = 57
set CharInx256[Str2Int256(":")] = 58
set CharInx256[Str2Int256(";")] = 59
set CharInx256[Str2Int256("<")] = 60
set CharInx256[Str2Int256("=")] = 61
set CharInx256[Str2Int256(">")] = 62
set CharInx256[Str2Int256(".")] = 63
set CharInx256[Str2Int256("@")] = 64
set CharInx256[Str2Int256("A")] = 65
set CharInx256[Str2Int256("B")] = 66
set CharInx256[Str2Int256("C")] = 67
set CharInx256[Str2Int256("D")] = 68
set CharInx256[Str2Int256("E")] = 69
set CharInx256[Str2Int256("F")] = 70
set CharInx256[Str2Int256("G")] = 71
set CharInx256[Str2Int256("H")] = 72
set CharInx256[Str2Int256("I")] = 73
set CharInx256[Str2Int256("J")] = 74
set CharInx256[Str2Int256("K")] = 75
set CharInx256[Str2Int256("L")] = 76
set CharInx256[Str2Int256("M")] = 77
set CharInx256[Str2Int256("N")] = 78
set CharInx256[Str2Int256("O")] = 79
set CharInx256[Str2Int256("P")] = 80
set CharInx256[Str2Int256("Q")] = 81
set CharInx256[Str2Int256("R")] = 82
set CharInx256[Str2Int256("S")] = 83
set CharInx256[Str2Int256("T")] = 84
set CharInx256[Str2Int256("U")] = 85
set CharInx256[Str2Int256("V")] = 86
set CharInx256[Str2Int256("W")] = 87
set CharInx256[Str2Int256("X")] = 88
set CharInx256[Str2Int256("Y")] = 89
set CharInx256[Str2Int256("Z")] = 90
set CharInx256[Str2Int256("[")] = 91
set CharInx256[Str2Int256("]")] = 93
set CharInx256[Str2Int256("^")] = 94
set CharInx256[Str2Int256("_")] = 95
set CharInx256[Str2Int256("`")] = 96
set CharInx256[Str2Int256("a")] = 97
set CharInx256[Str2Int256("b")] = 98
set CharInx256[Str2Int256("c")] = 99
set CharInx256[Str2Int256("d")] = 100
set CharInx256[Str2Int256("e")] = 101
set CharInx256[Str2Int256("f")] = 102
set CharInx256[Str2Int256("g")] = 103
set CharInx256[Str2Int256("h")] = 104
set CharInx256[Str2Int256("i")] = 105
set CharInx256[Str2Int256("j")] = 106
set CharInx256[Str2Int256("k")] = 107
set CharInx256[Str2Int256("l")] = 108
set CharInx256[Str2Int256("m")] = 109
set CharInx256[Str2Int256("n")] = 110
set CharInx256[Str2Int256("o")] = 111
set CharInx256[Str2Int256("p")] = 112
set CharInx256[Str2Int256("q")] = 113
set CharInx256[Str2Int256("r")] = 114
set CharInx256[Str2Int256("s")] = 115
set CharInx256[Str2Int256("t")] = 116
set CharInx256[Str2Int256("u")] = 117
set CharInx256[Str2Int256("v")] = 118
set CharInx256[Str2Int256("w")] = 119
set CharInx256[Str2Int256("x")] = 120
set CharInx256[Str2Int256("y")] = 121
set CharInx256[Str2Int256("z")] = 122
set CharInx256[Str2Int256("{")] = 123
set CharInx256[Str2Int256("|")] = 124
set CharInx256[Str2Int256("}")] = 125
set CharInx256[Str2Int256("~")] = 126
call BJDebugMsg("ЗАГРУЗКА 2")
endfunction
function ForLoadMap1 takes nothing returns nothing
local string s
call BJDebugMsg("СТАРТ")
//====================================
// Pow256x - число 256 в n-степени
// Pow256x нужен для вычисления, для работы с rawcode (в тос числе в переводе десятичной и 256-ричной систем)
//Напомню, что первый бит числа - знаковый бит, и он определяет будет ли оно положительным (0) или отрицательным (1).
//Положительные числа идут от 0x00000000 (0dec) до 0x7fffffff (2147483647dec), отрицательные от 0xffffffff (-1dec) до 0x80000000 (-2147483648dec).
//Что бы изменить знак числа надо инвертировать (где было 1 написать 0, где был 0 написать один) все биты числа и потом к нему прибавить 1.
// Короче (0x<hex-число> или 1x<hex-число>) это hex, короче 16-ричная система счисления
set Pow256x[0] = 0x00000001 //256^0=1
set Pow256x[1] = 0x00000100 //256^1=256
set Pow256x[2] = 0x00010000 //256^2=65536
set Pow256x[3] = 0x01000000 //256^3=16777216
//====================================
// Pow16x - число 16 в n-степени
// Pow16x нужен для вычисления, для перевода из 16-ричной системы в десятичную, или наоборот.
set Pow16x[0] = 0x00000001 //16^0=1
set Pow16x[1] = 0x00000010 //16^1=16
set Pow16x[2] = 0x00000100 //16^2=256
set Pow16x[3] = 0x00001000 //16^3=4096
set Pow16x[4] = 0x00010000 //16^4=65536
set Pow16x[5] = 0x00100000 //16^5=1048576
set Pow16x[6] = 0x01000000 //16^6=16777216
set Pow16x[7] = 0x10000000 //16^7=268435456
//====================================
// Pow2x - число 2 в n-степени
// Pow2x нужен для вычисления, для перевода из двоичной системы в десятичную.
//в качестве примера показан двоичный код из 32 символов, но в jass невозможно указать integer в двоичной (binary) системе счисления, но она очень важна для понимания всего материала.
//вместо 1000 0000 0000 0000 0000 0000 0000 0000 можно было поставить 10000000000000000000000000000000 = 2^31=2147483648
//НО: это не работает в варк, нельзя указывать в двоичной системе счисления. Поэтому пришлось указать заранее в 10-чной системе счисления
//если поставить двоичный код из 32 символов в jass, то система будет преобразовано не двоичную систему, а в 8-ричную.
//короче в варкрафте не так работает
set Pow2x[0] = 1 //0000 0000 0000 0000 0000 0000 0000 0001 //2^0=1
set Pow2x[1] = 2 //0000 0000 0000 0000 0000 0000 0000 0010 //2^1=2
set Pow2x[2] = 4 //0000 0000 0000 0000 0000 0000 0000 0100 //2^2=4
set Pow2x[3] = 8 //0000 0000 0000 0000 0000 0000 0000 1000 //2^3=8
set Pow2x[4] = 16 //0000 0000 0000 0000 0000 0000 0001 0000 //2^4=16
set Pow2x[5] = 32 //0000 0000 0000 0000 0000 0000 0010 0000 //2^5=32
set Pow2x[6] = 64 //0000 0000 0000 0000 0000 0000 0100 0000 //2^6=64
set Pow2x[7] = 128 //0000 0000 0000 0000 0000 0000 1000 0000 //2^7=128
set Pow2x[8] = 256 //0000 0000 0000 0000 0000 0001 0000 0000 //2^8=256
set Pow2x[9] = 512 //0000 0000 0000 0000 0000 0010 0000 0000 //2^9=512
set Pow2x[10] =1024 //0000 0000 0000 0000 0000 0100 0000 0000 //2^10=1024
set Pow2x[11] =2048 //0000 0000 0000 0000 0000 1000 0000 0000 //2^11=2048
set Pow2x[12] =4096 //0000 0000 0000 0000 0001 0000 0000 0000 //2^12=4096
set Pow2x[13] =8192 //0000 0000 0000 0000 0010 0000 0000 0000 //2^13=8192
set Pow2x[14] =16384 //0000 0000 0000 0000 0100 0000 0000 0000 //2^14=16384
set Pow2x[15] =32768 //0000 0000 0000 0000 1000 0000 0000 0000 //2^15=32768
set Pow2x[16] =65536 //0000 0000 0000 0001 0000 0000 0000 0000 //2^16=65536
set Pow2x[17] =131072 //0000 0000 0000 0010 0000 0000 0000 0000 //2^17=131072
set Pow2x[18] =262144 //0000 0000 0000 0100 0000 0000 0000 0000 //2^18=262144
set Pow2x[19] =524288 //0000 0000 0000 1000 0000 0000 0000 0000 //2^19=524288
set Pow2x[20] =1048576 //0000 0000 0001 0000 0000 0000 0000 0000 //2^20=1048576
set Pow2x[21] =2097152 //0000 0000 0010 0000 0000 0000 0000 0000 //2^21=2097152
set Pow2x[22] =4194304 //0000 0000 0100 0000 0000 0000 0000 0000 //2^22=4194304
set Pow2x[23] =8388608 //0000 0000 1000 0000 0000 0000 0000 0000 //2^23=8388608
set Pow2x[24] =16777216 //0000 0001 0000 0000 0000 0000 0000 0000 //2^24=16777216
set Pow2x[25] =33554432 //0000 0010 0000 0000 0000 0000 0000 0000 //2^25=33554432
set Pow2x[26] =67108864 //0000 0100 0000 0000 0000 0000 0000 0000 //2^26=67108864
set Pow2x[27] =134217728 //0000 1000 0000 0000 0000 0000 0000 0000 //2^27=134217728
set Pow2x[28] =268435456 //0001 0000 0000 0000 0000 0000 0000 0000 //2^28=268435456
set Pow2x[29] =536870912 //0010 0000 0000 0000 0000 0000 0000 0000 //2^29=536870912
set Pow2x[30] =1073741824 //0100 0000 0000 0000 0000 0000 0000 0000 //2^30=1073741824
set Pow2x[31] =2147483648 //1000 0000 0000 0000 0000 0000 0000 0000 //2^31=2147483648
//====================================
// Pow8x - число 8 в n-степени
// Pow8x нужен для вычисления, для перевода из 8-ричной системы в десятичную.
//Чтобы написать цифру в восьмеричной системе счисления мы должны приставить к ней 0
set Pow8x[0] = 000000001 //8^0=1
set Pow8x[1] = 000000010 //8^1=8
set Pow8x[2] = 000000100 //8^2=64
set Pow8x[3] = 000001000 //8^3=512
set Pow8x[4] = 000010000 //8^4=4096
set Pow8x[5] = 000100000 //8^5=32768
set Pow8x[6] = 001000000 //8^6=262144
set Pow8x[7] = 010000000 //8^7=2097152
set CharMap16[0] = "0"
set CharMap16[1] = "1"
set CharMap16[2] = "2"
set CharMap16[3] = "3"
set CharMap16[4] = "4"
set CharMap16[5] = "5"
set CharMap16[6] = "6"
set CharMap16[7] = "7"
set CharMap16[8] = "8"
set CharMap16[9] = "9"
set CharMap16[10] = "a"
set CharMap16[11] = "b"
set CharMap16[12] = "c"
set CharMap16[13] = "d"
set CharMap16[14] = "e"
set CharMap16[15] = "f"
//Первые 128 символов стандарта Юникод — совпадают с соответствующими символами US-ASCII.
//символы от 0 до 32 это в основном управляющие символы, в которых не прописан графическое представление.
set CharMap256[0]=null //спец. NOP
set CharMap256[1]=null //спец. SOH
set CharMap256[2]=null //спец. STX
set CharMap256[3]=null //спец. ETX
set CharMap256[4]=null //спец. EOT
set CharMap256[5]=null //спец. ENQ
set CharMap256[6]=null //спец. ACK
set CharMap256[7]=null //спец. BEL
set CharMap256[8]="\b" //символ Backspace
set CharMap256[9]="\t" //horizontal tab
set CharMap256[10]="\n" //LF line feed, new line
set CharMap256[11]=null //спец. VT
set CharMap256[12]="\f" //NP form feed
set CharMap256[13]="\r"
//графические символы
set CharMap256[32] = " " //пробел Space
set CharMap256[33] = "!"
set CharMap256[34] = "\"" // \" - эти два знака означают ковычки ", иначе вар ругает
set CharMap256[35] = "#"
set CharMap256[36] = "$"
set CharMap256[37] = "%"
set CharMap256[38] = "&"
set CharMap256[39] = "'"
set CharMap256[40] = "("
set CharMap256[41] = ")"
set CharMap256[42] = "*"
set CharMap256[43] = "+"
set CharMap256[44] = ","
set CharMap256[45] = "-"
set CharMap256[46] = "."
set CharMap256[47] = "/"
set CharMap256[48] = "0"
set CharMap256[49] = "1"
set CharMap256[50] = "2"
set CharMap256[51] = "3"
set CharMap256[52] = "4"
set CharMap256[53] = "5"
set CharMap256[54] = "6"
set CharMap256[55] = "7"
set CharMap256[56] = "8"
set CharMap256[57] = "9"
set CharMap256[58] = ":"
set CharMap256[59] = ";"
set CharMap256[60] = "<"
set CharMap256[61] = "="
set CharMap256[62] = ">"
set CharMap256[63] = "?"
set CharMap256[64] = "@"
set CharMap256[65] = "A"
set CharMap256[66] = "B"
set CharMap256[67] = "C"
set CharMap256[68] = "D"
set CharMap256[69] = "E"
set CharMap256[70] = "F"
set CharMap256[71] = "G"
set CharMap256[72] = "H"
set CharMap256[73] = "I"
set CharMap256[74] = "J"
set CharMap256[75] = "K"
set CharMap256[76] = "L"
set CharMap256[77] = "M"
set CharMap256[78] = "N"
set CharMap256[79] = "O"
set CharMap256[80] = "P"
set CharMap256[81] = "Q"
set CharMap256[82] = "R"
set CharMap256[83] = "S"
set CharMap256[84] = "T"
set CharMap256[85] = "U"
set CharMap256[86] = "V"
set CharMap256[87] = "W"
set CharMap256[88] = "X"
set CharMap256[89] = "Y"
set CharMap256[90] = "Z"
set CharMap256[91] = "["
set CharMap256[92] = "\\" //такие символы как '\' при компиляции jasshelper выдает ошибку. Нужно ставить '\\', так как при компиляции у вас будет '\'
set CharMap256[93] = "]"
set CharMap256[94] = "^"
set CharMap256[95] = "_"
set CharMap256[96] = "`"
set CharMap256[97] = "a"
set CharMap256[98] = "b"
set CharMap256[99] = "c"
set CharMap256[100] = "d"
set CharMap256[101] = "e"
set CharMap256[102] = "f"
set CharMap256[103] = "g"
set CharMap256[104] = "h"
set CharMap256[105] = "i"
set CharMap256[106] = "j"
set CharMap256[107] = "k"
set CharMap256[108] = "l"
set CharMap256[109] = "m"
set CharMap256[110] = "n"
set CharMap256[111] = "o"
set CharMap256[112] = "p"
set CharMap256[113] = "q"
set CharMap256[114] = "r"
set CharMap256[115] = "s"
set CharMap256[116] = "t"
set CharMap256[117] = "u"
set CharMap256[118] = "v"
set CharMap256[119] = "w"
set CharMap256[120] = "x"
set CharMap256[121] = "y"
set CharMap256[122] = "z"
set CharMap256[123] = "{"
set CharMap256[124] = "|"
set CharMap256[125] = "}"
set CharMap256[126] = "~"
set CharMap256[126] = null //127 - символ Delete
//остальные 128 символов - это национальные символы (у каждого языка свой стандарт, у английского есть еще расширенный дополнительный 128 символов)
set CharMap256[128] = "Ђ"
set CharMap256[129] = "Ѓ"
set CharMap256[130] = "‚"
set CharMap256[131] = "ѓ"
set CharMap256[132] = "„"
set CharMap256[133] = "…"
set CharMap256[134] = "†"
set CharMap256[135] = "‡"
set CharMap256[136] = "€"
set CharMap256[137] = "‰"
set CharMap256[138] = "Љ"
set CharMap256[139] = "‹ ‹"
set CharMap256[140] = "Њ"
set CharMap256[141] = "Ќ"
set CharMap256[142] = "Ћ"
set CharMap256[143] = "Џ"
set CharMap256[144] = "ђ"
set CharMap256[145] = "‘"
set CharMap256[146] = "’"
set CharMap256[147] = "“"
set CharMap256[148] = "”"
set CharMap256[149] = "•"
set CharMap256[150] = "–"
set CharMap256[151] = "—" //тут чуть больше чем у 153 символа, хоть это не заметно
set CharMap256[152] = null //не понятно какой это символ
set CharMap256[153] = "™"
set CharMap256[154] = "љ"
set CharMap256[155] = "›"
set CharMap256[156] = "њ"
set CharMap256[157] = "ќ"
set CharMap256[158] = "ћ"
set CharMap256[159] = "џ"
set CharMap256[160] = null //тоже не понятно какой символ
set CharMap256[161] = "Ў"
set CharMap256[162] = "ў"
set CharMap256[163] = "Ћ"
set CharMap256[164] = "¤"
set CharMap256[165] = "Ґ"
set CharMap256[166] = "¦"
set CharMap256[167] = "§"
set CharMap256[168] = "Ё" //большая буква Ё
set CharMap256[169] = "©"
set CharMap256[170] = "Є"
set CharMap256[171] = "«"
set CharMap256[172] = "¬"
set CharMap256[173] = null //не понятно какой символ
set CharMap256[174] = "®"
set CharMap256[175] = "Ї"
set CharMap256[176] = "°" //значок градус
set CharMap256[177] = "±" //плюс-минус
set CharMap256[178] = "І"
set CharMap256[179] = "і"
set CharMap256[180] = "ґ"
set CharMap256[181] = "µ"
set CharMap256[182] = "¶"
set CharMap256[183] = "·"
set CharMap256[184] = "ё" //буква ё
set CharMap256[185] = "№"
set CharMap256[186] = "є"
set CharMap256[187] = "»"
set CharMap256[188] = "ј"
set CharMap256[189] = "Ѕ"
set CharMap256[190] = "ѕ"
set CharMap256[191] = "ї"
set CharMap256[192] = "А"
set CharMap256[193] = "Б"
set CharMap256[194] = "В"
set CharMap256[195] = "Г"
set CharMap256[196] = "Д"
set CharMap256[197] = "Е"
set CharMap256[198] = "Ж"
set CharMap256[199] = "З"
set CharMap256[200] = "И"
set CharMap256[201] = "Й"
set CharMap256[202] = "К"
set CharMap256[203] = "Л"
set CharMap256[204] = "М"
set CharMap256[205] = "Н"
set CharMap256[206] = "О"
set CharMap256[207] = "П"
set CharMap256[208] = "Р"
set CharMap256[209] = "С"
set CharMap256[210] = "Т"
set CharMap256[211] = "У"
set CharMap256[212] = "Ф"
set CharMap256[213] = "Х"
set CharMap256[214] = "Ц"
set CharMap256[215] = "Ч"
set CharMap256[216] = "Ш"
set CharMap256[217] = "Щ"
set CharMap256[218] = "Ъ"
set CharMap256[219] = "Ы"
set CharMap256[220] = "Ь"
set CharMap256[221] = "Э"
set CharMap256[222] = "Ю"
set CharMap256[223] = "Я"
set CharMap256[224] = "а"
set CharMap256[225] = "б"
set CharMap256[226] = "в"
set CharMap256[227] = "г"
set CharMap256[228] = "д"
set CharMap256[229] = "е"
set CharMap256[230] = "ж"
set CharMap256[231] = "з"
set CharMap256[232] = "и"
set CharMap256[233] = "й"
set CharMap256[234] = "к"
set CharMap256[235] = "л"
set CharMap256[236] = "м"
set CharMap256[237] = "н"
set CharMap256[238] = "о"
set CharMap256[239] = "п"
set CharMap256[240] = "р"
set CharMap256[241] = "с"
set CharMap256[242] = "т"
set CharMap256[243] = "у"
set CharMap256[244] = "ф"
set CharMap256[245] = "х"
set CharMap256[246] = "ц"
set CharMap256[247] = "ч"
set CharMap256[248] = "ш"
set CharMap256[249] = "щ"
set CharMap256[250] = "ъ"
set CharMap256[251] = "ы"
set CharMap256[252] = "ь"
set CharMap256[253] = "э"
set CharMap256[254] = "ю"
set CharMap256[255] = "я"
//CharMap2x8 - эта переменная типа таблица для перевода из двоичной в 8-ричную. Очень нужна.
//Для перевода числа в восьмеричную необходимо разбить число на триады. Например, 1000110 = 1 000 110 = 106 в 8-ричной системе
//влево и вправо от запятой двоичное число разбивается на двоичные триады 423,6 = 100 010 011, 110 (пока реализованы только целые, реальные нет)
//Или обратно по табличке, 144 = 001 100 100 = 1100100 в двоичной системе счисления
//чтобы перевести обратно в двоичную систему необязательно использовать таблицу и перебирать массив CharMap2x8
//можно добавить в варкрафт нолик = 0144=1100100, однако труднее будет вставить в строку 0, так как функция I2S обнуляет
set CharMap2x8[0] = "000"
set CharMap2x8[1] = "001"
set CharMap2x8[2] = "010"
set CharMap2x8[3] = "011"
set CharMap2x8[4] = "100"
set CharMap2x8[5] = "101"
set CharMap2x8[6] = "110"
set CharMap2x8[7] = "111"
//CharMap2x16 - эта переменная типа таблица для перевода из двоичной в 16-ричную. Очень нужна.
//Для перевода числа в 16-чную систему необходимо разбить число на тетрады. Например, 1000110 = 100 0110 = 46 в 16-ричной системе
set CharMap2x16[0x0] = "0000" //0
set CharMap2x16[0x1] = "0001" //1
set CharMap2x16[0x2] = "0010" //2
set CharMap2x16[0x3] = "0011" //3
set CharMap2x16[0x4] = "0100" //4
set CharMap2x16[0x5] = "0101" //5
set CharMap2x16[0x6] = "0110" //6
set CharMap2x16[0x7] = "0111" //7
set CharMap2x16[0x8] = "1000" //8
set CharMap2x16[0x9] = "1001" //9
set CharMap2x16[0xa] = "1010" //10=A=a
set CharMap2x16[0xb] = "1011" //11=B=b
set CharMap2x16[0xc] = "1100" //12=C=c
set CharMap2x16[0xd] = "1101" //13=D=d
set CharMap2x16[0xe] = "1110" //14=E=e
set CharMap2x16[0xf] = "1111" //15=F=d
call BJDebugMsg("ЗАГРУЗКА 0")
call ForLoadMap2()
endfunction
//===========================================================================
function InitTrig_R takes nothing returns nothing
set gg_trg_R = CreateTrigger( )
//call TriggerRegisterGameEvent(gg_trg_R, EVENT_GAME_LOADED)
call TriggerRegisterTimerEventSingle( gg_trg_R, 1.00 )
call TriggerAddAction( gg_trg_R, function ForLoadMap1)
//call ForLoadMap()
endfunction
Перевод символа (строчный символ String) в 256-число = функция Str2Int256
Перевод символа (строчный символ String) в 16-число = функция Str2Int16
Перевод символа (строчный символ String) в 16-число = функция Str2Int16
Перевод 256-числа в 10-число = функция ASCII2DEC
Перевод 10-числа в 256-число = функция DEC2ASCII
Перевод 16-числа в 10-число = функция HEX2DEC
Перевод 10-числа в 16-число = функция DEC2HEX
Перевод 10-числа в 256-число = функция DEC2ASCII
Перевод 16-числа в 10-число = функция HEX2DEC
Перевод 10-числа в 16-число = функция DEC2HEX
Перевод 10-числа в двоичное = функция DEC2Binary
Перевод двоичного числа в 10-чное = функция Binary2DEC
Перевод двоичного числа в 8-ричное = функция Binary2Octal
Перевод двоичного числа в 16-ричное = функция Binary2Hex
Перевод двоичного числа в 10-чное = функция Binary2DEC
Перевод двоичного числа в 8-ричное = функция Binary2Octal
Перевод двоичного числа в 16-ричное = функция Binary2Hex
система Faion - математические ухитрения с StringHash
кстати некоторые используют некоторые математические ухитрения с StringHash: делят на что-то, умножают и получают значения меньшие. Эти значения влезают в индекс массива. А в индекс массива максимум 8192.
int a = i[StringHash(s) / 0x1F0748 + 0x3EA]
там теперь нужно в базу данных вводить под каждый символ. Это нужно знать сколько вернет число StringHash, потом взять формулу и подсчитать. Взять калькулятор, и подсчитать.
Например, возьмем английский символ A:
'A' = 65 dec смотрите по таблице ASCII
StringHash("A") = -1587459251 dec вывел дебагом на экран, так как неизвестно как там подсчитывается. Но ссылка на подробный разбор StringHash кидал выше.
0x1F0748 hex = 2033480 dec можно взять калькулятором перевести
0x3EA hex = 1002 dec
(-1587459251/2033480) + 1002 = -780 + 1002 = 222 - это число для индекса массива
'A' = 65 dec смотрите по таблице ASCII
StringHash("A") = -1587459251 dec вывел дебагом на экран, так как неизвестно как там подсчитывается. Но ссылка на подробный разбор StringHash кидал выше.
0x1F0748 hex = 2033480 dec можно взять калькулятором перевести
0x3EA hex = 1002 dec
(-1587459251/2033480) + 1002 = -780 + 1002 = 222 - это число для индекса массива
Если так считать вручную, то это будет очень и очень долго. Проще было записать в текстовый код с помощью прелоада xgm.guru/p/wc3/preexp :
код
function AddString takes string S returns nothing
local string A = I2S(StringHash(S))
local string B = I2S(0x1F0748)
local string C = I2S(0x3EA)
local string D = I2S(StringHash(S)/0x1F0748)
local string E = I2S(StringHash(S) / 0x1F0748 + 0x3EA)
local string a = "StringHash(" + S + ")" + " /0x1F0748 + 0x3EA = "
local string b = "(" + A + "/" + B + ")" + " + " + C + " = "
local string c = D + " + " + C + " = " //первое правило математики: сначало деление и умножение, а потом сложение/вычитание
call Preload( "---------" )
call Preload( S + " = " + "StringHash(" + S + ") = " + A)
call Preload( a + b + c + E )
endfunction
call Preload("хитрая ФОРМУЛА: <" + "StringHash(s) / 0x1F0748 + 0x3EA >")
call Preload("============")
call Preload("0x1F0748 hex = 2033480 dec")
call Preload("0x3EA oct = 1002 dec")
call Preload( "============" )
call AddString("A")
call AddString("B")
call PreloadGenEnd("save\\PreExp.txt")
пример того что получил
Если открыть текстовик
function PreloadFiles takes nothing returns nothing
call Preload( "хитрая ФОРМУЛА: <StringHash(s) / 0x1F0748 + 0x3EA >" )
call Preload( "============" )
call Preload( "0x1F0748 hex = 2033480 dec" )
call Preload( "0x3EA oct = 1752 dec" )
call Preload( "============" )
call Preload( "---------" )
call Preload( "A = StringHash(A) = -1587459251" )
call Preload( "StringHash(A) /0x1F0748 + 0x3EA = (-1587459251/2033480) + 1002 = -780 + 1002 = 222" )
call Preload( "---------" )
call Preload( "B = StringHash(B) = -1676716706" )
call Preload( "StringHash(B) /0x1F0748 + 0x3EA = (-1676716706/2033480) + 1002 = -824 + 1002 = 178" )
call PreloadEnd( 490624.7 )
endfunction
вот карта пример с прелоадом xgm.guru/files/1774/208854/12.w3m
В принципе не трудно, создать свою базу. но зачем? есть готовое. Если что-то нужно проверить или доделать, то вы знаете как.
скачиваем от сюда xgm.guru/p/snw/70263
кстати такую схему видел не только в этой системе, на хайве находил www.hiveworkshop.com/threads/snippet-ascii.190746
кстати такую схему видел не только в этой системе, на хайве находил www.hiveworkshop.com/threads/snippet-ascii.190746
система RAW2S - перебираем каждый символ в строке
При конвертации не обязательно использовать базу данных с кучу массивов на каждый символ, можно использовать строку. Здесь берется строка типа charMap. Является эталоном, некоторые разработчики даже в глобалку записывают. В введенной строке выбирается по одному. Сначала берется первый. И циклом перебирают похожий в эталонной строке charMap (короче суть в том что сравнивают символ с символом в эталонной строке. Если совпал, то все, символ наш. Что важное здесь? в строке charMap записывается обычно в строгом порядке. И перебором цикла помогает вытащить нужную позицию - номер, число.
function RAW2S takes integer value returns string
local string charMap = ".................................!.#$%&'()*+,-./0123456789:;<=>.@ABCDEFGHIJKLMNOPQRS?TUVWXYZ[.]^_`abcdefghijklmnopqrstuvwxyz{|}~.........................................................?........................................................................"
local string result = ""
local integer remainingValue = value
local integer charValue
local integer byteno = 0
loop
set charValue = ModuloInteger(remainingValue, 256)
set remainingValue = remainingValue / 256
set result = SubString(charMap, charValue, charValue + 1) + result
set byteno = byteno + 1
exitwhen ( byteno == 4 )
endloop
return result
endfunction
//===========================================================================
// Convert a integer id value into a 4-letter id code.
//в архивах WarCraft ScopteRectuS нашел следующий файл: war3.mpq/Scripts/Cheats.j (они похожи с RAW2S)
//
function DebugIdInteger2IdString takes integer value returns string
local string charMap = ".................................!.#$%&'()*+,-./0123456789:;<=>.@ABCDEFGHIJKLMNOPQRS​TUVWXYZ[.]^_`abcdefghijklmnopqrstuvwxyz{|}~.........................................................​........................................................................"
local string result = ""
local integer remainingValue = value
local integer charValue
local integer byteno
set byteno = 0
loop
set charValue = ModuloInteger(remainingValue, 256)
set remainingValue = remainingValue / 256
set result = SubString(charMap, charValue, charValue + 1) + result
set byteno = byteno + 1
exitwhen byteno == 4
endloop
return result
endfunction
//===========================================================================
по коду система берет остаток (см. скрин ниже)
по остатку от деления находит номер чара еще одна система - система FellGuard скидываю еще раз ссылку. только здесь не используют эталонную строку
function raw2s takes integer raw returns string
local string s = ""
loop
set s = sOutput[raw-(raw/256)*256] + s
set raw = raw/256
exitwhen raw==0
endloop
return s
endfunction
не стал вписывать кучу других систем, найденных мной. Ведь они похожи. Но я все разные системы скинул в одну карту. Может быть одна из них вам понравится. ВОТ ПРИМЕР КАРТЫ
Знаю, что это лишнее. Будете говорить зачем это. Ведь есть кучу библиотек, статьей. Ведь здесь решил описать принцип работы систем конвертации. И обычно не всегда была доступна инфа, если кое-что не понимаешь.
Ред. MpW