Перейти к содержанию

Возможно ли в форму, которую создает CE вставить три адреса


Razi

Рекомендуемые сообщения

35 минуты назад, AntonVitalievich сказал:

автоматически вырисовывают ноли когда цифра меньше 10 то есть в форме отображается не 1 а 01.

Хороший метод - перекрытие Label -ов.

Когда думал сам над реализацией, то так примерно и представлял.   

Ссылка на комментарий
Поделиться на другие сайты

Для Razi

math.floor (x)

Возвращает наибольшее целое число, меньшее или равное x. (Округление «вниз»)

Взято отсюда:

 

http://www.lua.ru/doc/5.6.html

Ссылка на комментарий
Поделиться на другие сайты

3 часа назад, AntonVitalievich сказал:

Луа вариант

У меня один вопрос, что нужно делать чтоб приклеить этот Lua скрипт к своей игре? Подставлять Аобскан инструкции на запись на адрес с секундами из моей игры? но желательно было бы описать последовательность действий. (Адрес четырехбайтный из моей игры "009E9150" который считает секунды.)

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Razi сказал:

У меня один вопрос, что нужно делать чтоб приклеить этот Lua скрипт к своей игре?

 

Тебе нужно взять форму и скрипт AntonVitalievich,

но изменить {$ASM} часть уже для твоей инструкции и использовать фильтр, который мы использовали в предыдущем скрипте.

Сейчас соединю скрипты.

 

 

Изменено пользователем Garik66
Ссылка на комментарий
Поделиться на другие сайты

Скрипт "TIMEscript_AntonVitalievich_for_Razi"

Скрытый текст

[ENABLE]
{$LUA}
function RecalculetionStartUp(sender)
if TIME.CEButton1.Caption=="START" then
TIME.CEButton1.Caption="STOP"
TIME.CETimer1.Enabled=true
else
if TIME.CEButton1.Caption=="STOP" then
TIME.CEButton1.Caption="START"
TIME.CETimer1.Enabled=false
end end end

function DigitControl()
A = readInteger("gametimeSTANDAART")
if A~="??" then
if (math.floor(A))-(math.floor(A/60)*60)>-1 and (math.floor(A))-(math.floor(A/60)*60)<10 then
TIME.CELabel5.Caption="0"
TIME.CELabel6.Left=256
TIME.CELabel6.Caption=(math.floor(A))-(math.floor(A/60)*60)
else
if A~="??" then
TIME.CELabel5.Caption=""
TIME.CELabel6.Left=TIME.CELabel5.Left+2
TIME.CELabel6.Caption=(math.floor(A))-(math.floor(A/60)*60)
end end end
if A~="??" then
if (math.floor(A/60))-(math.floor(A/3600)*60)>-1 and (math.floor(A/60))-(math.floor(A/3600)*60)<10 then
TIME.CELabel3.Caption="0"
TIME.CELabel7.Left=184
TIME.CELabel7.Caption=(math.floor(A/60))-(math.floor(A/3600)*60)
else
if A~="??" then
TIME.CELabel3.Caption=""
TIME.CELabel7.Left=TIME.CELabel3.Left+2
TIME.CELabel7.Caption=(math.floor(A/60))-(math.floor(A/3600)*60)
end end end
if A~="??" then
if (math.floor(A/3600))-(math.floor(A/1440/60))*24>-1 and (math.floor(A/3600))-(math.floor(A/1440/60))*24<10 then
TIME.CELabel1.Caption="0"
TIME.CELabel8.Left=112
TIME.CELabel8.Caption=(math.floor(A/3600))-(math.floor(A/1440/60))*24
else
if A~="??" then
TIME.CELabel1.Caption=""
TIME.CELabel8.Left=TIME.CELabel1.Left+2
TIME.CELabel8.Caption=(math.floor(A/3600))-(math.floor(A/1440/60))*24
end end end end

{$ASM}
aobscan(gameclock,89 1C 08 81 E2 FC FF 1F 00)
alloc(newmem,$2048)
registersymbol(gameclock)
globalalloc(gametimeSTANDAART, 4)
label(return)

newmem:
  push edx
  lea edx,[eax+ecx]
  cmp edx,009E9150            // Проверяем с таймером ли работает инструкция при текущем срабатывании.
  pop edx
  jne code
  mov [gametimeSTANDAART],ebx

code:
  mov [eax+ecx],ebx
  and edx,001FFFFC
  jmp return

gameclock:
  jmp newmem
  db 90 90 90 90
return:

[DISABLE]
gameclock:
  db 89 1C 08 81 E2 FC FF 1F 00

  unregistersymbol(gameclock)
  dealloc(gametimeSTANDAART)
  dealloc(newmem)

 

 И сразу с табличкой (в табличке проект AntonVitalievich ) и новый скрипт.

Проверяй.

Эту табличку удалил (дальше выложил новую).

Изменено пользователем Garik66
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

Проверил работает. Но каждые 24 часа начинает считать с 00 часов. Например 25 часов будет отображаться как 01:00:00, а мне нужно например чтоб если в адресе с секундами 36,000,000, то отображалось бы 10000:00:00 то есть 10000 часов 00 минут 00 секунд. А для этого я так понимаю нужно удалить какую-то строку, что обнуляет количество часов в скрипте.

 

То есть, ограничения в показателе количества часов мне не нужны. Нужно например, чтоб количество часов отображалось от 00 до 596,523 часов = ~68 лет ( или аж до 1,193,046 часов = ~136 лет). Потому что, четырехбайтный адрес может идти аж до 4294967295 секунд (а в Hex FF FF FF FF) что приблизительно = 136 лет с копейками и после этого игровой таймер обнуляется и идет сначала, то есть таймер идет бесконечно.

 

Garik66, как ты выбираешь имя пользователя, чтоб оно было как ссылка? На старом движке это делалось легко, а счас незнаю как.

Так понимаю, что ограничение на число в секундах в Hex  7F FF FF FF или 2147483647 в Dec, ограничивается либо из-за формы, потому что туда нельзя вставить число выше этого или из-за регистров, потому что в регистры нельзя вставить число выше в Hex  7F FF FF FF или 2147483647 в Dec ?

Изменено пользователем Razi
Ссылка на комментарий
Поделиться на другие сайты

По LUA части скрипта, подожди когда   AntonVitalievich  ответит.

42 минуты назад, Razi сказал:

Garik66, как ты выбираешь имя пользователя, чтоб оно было как ссылка?

Просто копирую ник пользователя (слева от сообщения) и вставляю его в текст.

 

45 минуты назад, Razi сказал:

Так понимаю, что ограничение на число в секундах в Hex  7F FF FF FF или 2147483647 в Dec, ограничивается либо из-за формы, потому что туда нельзя вставить число выше этого или из-за регистров, потому что в регистры нельзя вставить число выше в Hex  7F FF FF FF или 2147483647 в Dec ?

Если ты спрашиваешь про это моё сообщение 

 

то это ограничение стоит непосредственно в игре  Assassin’s Creed Chronicles: India, т.е. это строчка из кода самой игры. 

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Garik66 сказал:

ограничение стоит непосредственно в игре

Просто дело в том, что в твоем АА скрипте, когда вставлял число больше чем 7F FF FF FF  в 4-х байтный адрес с секундами в игре, то число отображалось в форме, при пересчете неверно. Из чего я сделал вывод, что либо в форму нельзя вставить число, либо в регистры нельзя вставить число больше чем 7F FF FF FF (вставить, можно, но оно отображается неверно)

Ага, у меня расширения в браузере не позволяют так скопировать ник пользователя.

Изменено пользователем Razi
Ссылка на комментарий
Поделиться на другие сайты

Это ограничение 4 байта, если значение знаковое. 

Вот по ограничениям посмотри NullAlex выложил табличку диапазонов для различны типов данных:

 

 

Ссылка на комментарий
Поделиться на другие сайты

9 минут назад, Garik66 сказал:

ограничение 4 байта, если значение знаковое

Вот в том то и интерес, что в адрес с секундами в игре, то могу вставить число аж 4,294,967,295. Значит число по идеи 4 байта (беззнаковое).

Изменено пользователем Razi
Ссылка на комментарий
Поделиться на другие сайты

11 час назад, Razi сказал:

Вот в том то и интерес, что в адрес с секундами в игре, то могу вставить число аж 4,294,967,295. Значит число по идеи 4 байта (беззнаковое).

Значит у тебя в игре число 4 байта (беззнаковое), но при использовании math.floor в LUA-части скрипта становится знаковым.

 

14 часа назад, Razi сказал:

Проверил работает. Но каждые 24 часа начинает считать с 00 часов. Например 25 часов будет отображаться как 01:00:00, а мне нужно например чтоб если в адресе с секундами 36,000,000, то отображалось бы 10000:00:00 то есть 10000 часов 00 минут 00 секунд. А для этого я так понимаю нужно удалить какую-то строку, что обнуляет количество часов в скрипте.

Чтобы сделать, как ты хочешь:

1. Есть сложный путь: с добавлением кучи лейблов с записью "0", выравниванием лейблов на форме и нужно дописать ещё много кода в LUA. Но, мне кажется запись типа 0000001:00:00 не красиво выглядит. 

2. Поэтому вариант более простой: удалить один лейбл, у одного лейбла изменить размер и немного исправить код на LUA.

Если выбираешь вариант 2, то:

2.1. Удали с формы CELabel1.

2.2. Увеличь размер CELabel8, чтобы в него влазили все цифры часов (сколько ты их хочешь).

2.3. Выровняй лейблы на форме (чтобы было красиво). Увеличь ширину самой формы, если понадобится. Так как при выравнивании лейблов на форме затронутся и другие лейблы, то нужно изменить их позиции в LUA:

Скрытый текст

TIME.CELabel6.Left=256 -- измени цифры на новые
TIME.CELabel7.Left=184 -- измени цифры на новые

 

2.4. Измени код LUA:

Скрытый текст

if A~="??" then
if (math.floor(A/3600))-(math.floor(A/1440/60))*24>-1 and (math.floor(A/3600))-(math.floor(A/1440/60))*24<10 then
TIME.CELabel1.Caption="0"
TIME.CELabel8.Left=112
TIME.CELabel8.Caption=(math.floor(A/3600))-(math.floor(A/1440/60))*24
else
if A~="??" then
TIME.CELabel1.Caption=""
TIME.CELabel8.Left=TIME.CELabel1.Left+2
TIME.CELabel8.Caption=(math.floor(A/3600))-(math.floor(A/1440/60))*24
end end end end

 

на этот:

Скрытый текст

if A~="??" then
TIME.CELabel8.Caption=(math.floor(A/3600)
end end

 

 

Изменено пользователем Garik66
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

Луа версия часов с днями и другими единицами измерения.

Немного изменены способы вычислений. В остальном все также.

Максимальное расчетное время чуть более 1 века и 30 лет (Более 4-х байтник не вмешает, похоже)

Часы можно перемещать по форме за зеленый лейбл с надписями единиц измерения. Нижние цифры имеют привязку и никуда не денутся

Zahvatjpg_4995561_21053277.jpg

 

 

Скрипт луа:

Скрытый текст

function RecalculetionStartUp(sender)
if TIME.START_BUTTON.Caption=="START" then
TIME.START_BUTTON.Caption="STOP"
TIME.CETimer1.Enabled=true
else
if TIME.START_BUTTON.Caption=="STOP" then
TIME.START_BUTTON.Caption="START"
TIME.CETimer1.Enabled=false
end end end

function DigitControl()
A = readInteger("gametimeSTANDAART")
if A~="??" then
if (math.floor(A))-(math.floor(A/60)*60)>-1 and (math.floor(A))-(math.floor(A/60)*60)<10 then
TIME.FAKE_1.Caption="0"
TIME.F_SECONDS.BorderSpacing.Left=422
TIME.F_SECONDS.Caption=(math.floor(A))-(math.floor(A/60)*60)
else
if A~="??" then
TIME.FAKE_1.Caption=""
TIME.F_SECONDS.BorderSpacing.Left=397
TIME.F_SECONDS.Caption=(math.floor(A))-(math.floor(A/60)*60)
end end end
if A~="??" then
if (math.floor(A/60))-(math.floor(A/60/60)*60)>-1 and (math.floor(A/60))-(math.floor(A/60/60)*60)<10 then
TIME.FAKE_2.Caption="0"
TIME.F_MINUTES.BorderSpacing.Left=351
TIME.F_MINUTES.Caption=(math.floor(A/60))-(math.floor(A/60/60)*60)
else
if A~="??" then
TIME.FAKE_2.Caption=""
TIME.F_MINUTES.BorderSpacing.Left=326
TIME.F_MINUTES.Caption=(math.floor(A/60))-(math.floor(A/60/60)*60)
end end end
if A~="??" then
if (math.floor(A/3600))-(math.floor(A/3600/24))*24>-1 and (math.floor(A/3600))-(math.floor(A/3600/24))*24<10 then
TIME.FAKE_3.Caption="0"
TIME.F_HOURS.BorderSpacing.Left=280
TIME.F_HOURS.Caption=(math.floor(A/3600))-(math.floor(A/3600/24))*24
else
if A~="??" then
TIME.FAKE_3.Caption=""
TIME.F_HOURS.BorderSpacing.Left=255
TIME.F_HOURS.Caption=(math.floor(A/3600))-(math.floor(A/3600/24))*24
end end end
if A~="??" then
if math.floor(A/86400)-(math.floor(A/86400/31))*31>-1 and math.floor(A/86400)-(math.floor(A/86400/31))*31<10 then
TIME.FAKE_4.Caption="0"
TIME.DAYS.BorderSpacing.Left=210
TIME.DAYS.Caption=math.floor(A/86400)-(math.floor(A/86400/31))*31
else
if A~="??" then
TIME.FAKE_4.Caption=""
TIME.DAYS.BorderSpacing.Left=185
TIME.DAYS.Caption=math.floor(A/86400)-(math.floor(A/86400/31))*31
end end end
if A~="??" then
if math.floor(A/2678400)-(math.floor(A/2678400/12))*12>-1 and math.floor(A/2678400)-(math.floor(A/2678400/12))*12<10 then
TIME.FAKE_5.Caption="0"
TIME.MONTHS.BorderSpacing.Left=140
TIME.MONTHS.Caption=math.floor(A/2678400)-(math.floor(A/2678400/12))*12
else
if A~="??" then
TIME.FAKE_5.Caption=""
TIME.MONTHS.BorderSpacing.Left=116
TIME.MONTHS.Caption=math.floor(A/2678400)-(math.floor(A/2678400/12))*12
end end end
if A~="??" then
if math.floor(A/32140800)-(math.floor(A/32140800/100))*100>-1 and math.floor(A/32140800)-(math.floor(A/32140800/100))*100<10 then
TIME.FAKE_6.Caption="0"
TIME.YEARS.BorderSpacing.Left=70
TIME.YEARS.Caption=math.floor(A/32140800)-(math.floor(A/32140800/100))*100
else
if A~="??" then
TIME.FAKE_6.Caption=""
TIME.YEARS.BorderSpacing.Left=45
TIME.YEARS.Caption=math.floor(A/32140800)-(math.floor(A/32140800/100))*100
end end end
if A~="??" then
TIME.CENTURE.Caption=math.floor(A/3214080000)
end end

 

 

Таблица СЕ:

Пароль на скачавание  - luatimev2

http://rghost.ru/8YXcLT5Pr

 

Ссылка на комментарий
Поделиться на другие сайты

8 минут назад, AntonVitalievich сказал:

Луа версия часов с днями и другими единицами измерения.

Круто - как всегда.

Но месяца - бывают 28, 29, 30 и 31 день.

И год бывает високосный.

Т.е. если уже писать такие часы, то это тоже нужно будет учитывать, а так очень круто!!! 

 

Ссылка на комментарий
Поделиться на другие сайты

Нужно чтоб если в адресе с секундами 36,000,000, то отображалось бы 10000:00:00, то есть 10000 часов 00 минут 00 секунд. Дни и месяцы не нужны. Хотя калькулятор классный.

При этом  не обязательно, чтоб там где показывает количество часов было,например, когда на таймере всего 52 секунд то показывало бы например:  000000:00:52 это будет выглядеть не очень красиво, как и сказал Garik66. А вот если будет показывать 00:00:52 или 0:00:52 то это как раз так как нужно. Но самое главное чтоб в количество отображаемых часов могло влезть и число 1,000,000 часов.

Нужно было, чтоб только минуты и секунды отображались как в часах начиная с "00" дальше "01" и т.д.

А количество часов могут начинаться или просто с "0" или с "00".

Ссылка на комментарий
Поделиться на другие сайты

6 минут назад, Razi сказал:

Но самое главное чтоб в количество отображаемых часов могло влезть и число 1,000,000 часов.

Сделай сам себе. План - как это сделать, я тебе уже написал здесь:

 

 

Ссылка на комментарий
Поделиться на другие сайты

Попробовал и по твоему плану немного, и в скрипте который только что выложил. Когда количество часов состоит из двух цифр, то они залазят на минуты. Но, еще не все сделал, так что посмотрю что еще можно доделать.

Изменено пользователем Razi
Ссылка на комментарий
Поделиться на другие сайты

20 минуты назад, Razi сказал:

Когда количество часов состоит из двух цифр

Значит лейбл CELabel8 расширяется вправо, нужно уточнить у AntonVitalievich как и где изменить параметры лейбла, чтобы он расширялся влево, либо сразу имел конечный размер, но первый 0, чтобы находился с правой стороны лейбла (я в этом совсем не разбираюсь, так как не писал трейнеры и с формами практически совсем не работал) И сейчас мне не на чем потетстить скрипт, у меня игра переустановлена. 

Либо ещё один вариант, но придётся тогда дописать LUA код, для изменения левой позиции CELabel8.

А для этого проще наверное скачать вторую версию проекта AntonVitalievic и работать уже с нею, так там позиции уже просчитаны практически.

Изменено пользователем Garik66
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

5 часов назад, Garik66 сказал:

Т.е. если уже писать такие часы, то это тоже нужно будет учитывать

 

Да, верно. Я этого не взял во внимание.

Но я даже не представляю как это сделать.

*Интересно, если изменить длину одной секунды, и подстроить её под частоту вращения земли вокруг солнца, то получится ли избавится от необходимости такого явления как високосный год....Не совсем до конца понимаю как происходят все измерения связанные со временем, и что от чего зависит....

 

Ссылка на комментарий
Поделиться на другие сайты

4 часа назад, Garik66 сказал:

Сделал тебе до 5 цифр в часах ,т,е 99999 : 59 : 59.

Дальше сделай сам

Сделал. Теперь когда вставляю число 4,294,967,295 в адрес секундами, то отображается все правильно, то есть показывает 1,193,046 часов и т.д. То есть сейчас значения в форме отображают максимально возможное для адреса в 4 байта (беззнакового).

Думал, что количество часов в форме само будет двигаться влево.

 

50 минут назад, AntonVitalievich сказал:

подстроить её под частоту вращения земли вокруг солнца, то получится ли избавится от необходимости такого явления

:offtopic:Скорее всего по идее, все равно будет нужна поправка по времени, например раз в 10 или раз в 20 лет, нужно будет делать в каком-то году на один день больше или меньше.

Изменено пользователем Razi
Ссылка на комментарий
Поделиться на другие сайты

8 часов назад, AntonVitalievich сказал:

Да, верно. Я этого не взял во внимание.

Я могу лишь предложить вот такой вариант. (Именно в таком калькуляторе, не очень заинтересован, но ради любопытства, вот вариант) В году 365 дней. Чтоб учитывать что раз в 4 года на один день больше, нужно всего лишь сделать следующее. За год считать 365,25 т.е. 365 дней с четвертью разделить на 12 месяцев:

365,25 / 12 = 30,4375. (Это число учитывает даже то, что раз в 4 года на день больше в году) И вот это число 30,4375 учитывать в расчете месяцев, если в Lua можно записывать не целые числа конечно. Потому что, если будем учитывать что в месяце 30 дней, то в году будет 360 дней, а если 31 день то в году будет 372 дня, а в году на самом деле 365 дней и 6 часов (365,25 в днях). Конечно такой метод не даст астрономической точности, например расчет времени через 2 года, но по большим расчетам это будет более точно.

А за месяц считать 30,4375 дней, что в секундах будет = 2,629,800 секунд. А за год считать 365,25 дней, что в секундах = 31,557,600.

Изменено пользователем Razi
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.