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

Нужно добавить условия в скрипт и "облагородить" его.


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

МАСТЕРА опять без Вас не обойтись.

 

Написал (рабочий) скрипт на основные Статы для Fallout 3.

 

В кратце, что делает скрипт:

1. Получает текущее значение Статов из игры.

2. Позволяет Геймеру менять значения Статов:

    2.1 Сразу все на MAX или

    2.2 на выбор игрока.

3. При отключении скрипта - возвращает значения Статов, соответствующих игре.

 

Более подробно опишу работу скрипта, при выкладывании в соответствующей теме.

 

Что нужно:

1. Добавить дополнительные условия (защита от непонятливых). {см. скрипт}

2. Добавить сообщение об ошибке (для тех же непонятливых).{см. скрипт}

3. Так как в скрипте много повторяющихся элементов, я думаю его можно записать 

    более компактно и корректно.

 

МАСТЕРА, если возможно то с пояснениями.

 

За помощь заранее Болшой Спасыб!!! :-D

 

Сам скрипт:

 


Небольшое уточнение

Перепробовал наверное все варианты прыжков:

Использование JB (и его аналогов) допускает изменение Стата, но само условие не работает.

Использование JA (и его аналогов) не допускает изменение Стата, т.е. код не переходит на строчку -  mov al,[stat1].

 

Скорее всего где-то принципиально в коде нужно что-то поменять, чтобы заработали доп. условия.

[ENABLE]aobscan(AdresInGame8, 8axxxxxxc2xxxxxxxxxxxxxx80xxxxxxxx8a)alloc(newMem8, 2048)label(returnHere8)label(OK)label(TStat1)label(TStat2)label(TStat3)label(TStat4)label(TStat5)label(TStat6)label(TStat7)label(MenjaemStat)label(MStat)label(MaxStat)registersymbol(MaxStat)label(NaStat1)label(Stat1)registersymbol(Stat1)label(NaStat2)label(Stat2)registersymbol(Stat2)label(NaStat3)label(Stat3)registersymbol(Stat3)label(NaStat4)label(Stat4)registersymbol(Stat4)label(NaStat5)label(Stat5)registersymbol(Stat5)label(NaStat6)label(Stat6)registersymbol(Stat6)label(NaStat7)label(Stat7)registersymbol(Stat7)registersymbol(AdresInGame8)newMem8:mov al,[eax+ecx-01]cmp [MaxStat],1je MStatcmp [MaxStat],2Je MenjaemStatcmp edx,5je TStat1cmp edx,6je TStat2cmp edx,7je TStat3cmp edx,8je TStat4cmp edx,9je TStat5cmp edx,aje TStat6cmp edx,bje TStat7MenjaemStat:cmp edx,5je NaStat1cmp edx,6je NaStat2cmp edx,7je NaStat3cmp edx,8je NaStat4cmp edx,9je NaStat5cmp edx,aje NaStat6cmp edx,bje NaStat7OK:ret 0004jmp returnHere8TStat1:mov [Stat1],aljmp OKTStat2:mov [Stat2],aljmp OKTStat3:mov [Stat3],aljmp OKTStat4:mov [Stat4],aljmp OKTStat5:mov [Stat5],aljmp OKTStat6:mov [Stat6],aljmp OKTStat7:mov [Stat7],aljmp OKNaStat1:// cmp [Stat1],1 (сюда нужно вставить условие, что// jb OK          меньше 1 Стат быть не может)// jmp  Message  (сюда хочу вставить сообщение об ошибке)// cmp [Stat1],a (сюда нужно вставить условие, что// ja OK          больше 10 Стат быть не может)// jmp  Message  (сюда хочу вставить сообщение об ошибке)mov al,[Stat1]jmp OKNaStat2:mov al,[Stat2]jmp OKNaStat3:mov al,[Stat3]jmp OKNaStat4:mov al,[Stat4]jmp OKNaStat5:mov al,[Stat5]jmp OKNaStat6:mov al,[Stat6]jmp OKNaStat7:mov al,[Stat7]jmp OKMStat:mov al,ajmp OKStat1:db 0Stat2:db 0Stat3:db 0Stat4:db 0Stat5:db 0Stat6:db 0Stat7:db 0MaxStat:db 0AdresInGame8:jmp newMem8nopnopreturnHere8:[DISABLE]AdresInGame8: // Fallout3.exe+516D4mov al,[eax+ecx-01]ret 0004unregistersymbol(MaxStat)unregistersymbol(Stat1)unregistersymbol(Stat2)unregistersymbol(Stat3)unregistersymbol(Stat4)unregistersymbol(Stat5)unregistersymbol(Stat6)unregistersymbol(Stat7)unregistersymbol(AdresInGame8)dealloc(newMem8) 
NaStat1:// cmp [Stat1],1 (сюда нужно вставить условие, что// jb OK          меньше 1 Стат быть не может)// jmp  Message  (сюда хочу вставить сообщение об ошибке)// cmp [Stat1],a (сюда нужно вставить условие, что// ja OK          больше 10 Стат быть не может)// jmp  Message  (сюда хочу вставить сообщение об ошибке)mov al,[Stat1]jmp OK
Ссылка на комментарий
Поделиться на другие сайты

С первой задачей справился сам:

Что нужно:

1. Добавить дополнительные условия (защита от непонятливых). {см. скрипт} РЕШЕНО.

Смотрите скрипт.

Что было не правильно, а точнее что сделал, чтобы заработало:

1. Был прыжок не туда. Поэтому добавил новую метку (TStat -> см. скрипт).

2. Оказалось несмотря на то, что вроде бы прописал размеры Переменных (db 0), нужно было всё-таки указать размеры данных везде.

После этого всё заработало.

Изменённый скрипт:

Остаются ещё две задачи:

2. Добавить сообщение об ошибке (для тех же непонятливых).{см. скрипт}

3. Так как в скрипте много повторяющихся элементов, я думаю его можно записать 

    более компактно и корректно.


По второй задаче кое-что нашёл:

Но:

1. В самом коде русский язык не воспринимается (неужели нету поддержки русского языка в СЕ). Приходится, чтобы было понятно, перед командой ставить //. 

2. Вставил эту команду куда мне нужно, но окошко с сообщением выскакивает только при активации скрипта, а не когда я специально делаю ошибку.

Так что вопрос пока не решён. Подскажите. 

[ENABLE]aobscan(AdresInGame8, 8axxxxxxc2xxxxxxxxxxxxxx80xxxxxxxx8a)alloc(newMem8, 2048)label(returnHere8)label(OK)label(TStat) // Добавил меткуlabel(TStat1)label(TStat2)label(TStat3)label(TStat4)label(TStat5)label(TStat6)label(TStat7)label(MenjaemStat)label(MStat)label(MaxStat)registersymbol(MaxStat)label(NaStat1)label(Stat1)registersymbol(Stat1)label(NaStat2)label(Stat2)registersymbol(Stat2)label(NaStat3)label(Stat3)registersymbol(Stat3)label(NaStat4)label(Stat4)registersymbol(Stat4)label(NaStat5)label(Stat5)registersymbol(Stat5)label(NaStat6)label(Stat6)registersymbol(Stat6)label(NaStat7)label(Stat7)registersymbol(Stat7)registersymbol(AdresInGame8)newMem8:mov al,[eax+ecx-01]cmp byte ptr [MaxStat],1je MStatcmp byte ptr [MaxStat],2Je MenjaemStatTStat: // Добавил метку, на которую прыгаем если Игрок ввёл цифру > 10 или < 1cmp edx,5je TStat1cmp edx,6je TStat2cmp edx,7je TStat3cmp edx,8je TStat4cmp edx,9je TStat5cmp edx,aje TStat6cmp edx,bje TStat7MenjaemStat:cmp edx,5je NaStat1cmp edx,6je NaStat2cmp edx,7je NaStat3cmp edx,8je NaStat4cmp edx,9je NaStat5cmp edx,aje NaStat6cmp edx,bje NaStat7OK:ret 0004jmp returnHere8TStat1:mov byte ptr [Stat1],aljmp OKTStat2:mov byte ptr [Stat2],aljmp OKTStat3:mov byte ptr [Stat3],aljmp OKTStat4:mov byte ptr [Stat4],aljmp OKTStat5:mov byte ptr [Stat5],aljmp OKTStat6:mov byte ptr [Stat6],aljmp OKTStat7:mov byte ptr [Stat7],aljmp OKNaStat1:cmp byte ptr [Stat1],1  //(Выполняется условие, чтоjb TStat                // меньше 1 Стат быть не может)// jmp  Message  (сюда хочу вставить сообщение об ошибке)cmp byte ptr [Stat1],a  //(Выполняется условие, чтоja TStat                // больше 10 Стат быть не может)// jmp  Message  (сюда хочу вставить сообщение об ошибке)mov al,byte ptr [Stat1]jmp OKNaStat2:cmp byte ptr [Stat2],1jb TStatcmp byte ptr [Stat2],aja TStatmov al,byte ptr [Stat2]jmp OKNaStat3:cmp byte ptr [Stat3],1jb TStatcmp byte ptr [Stat3],aja TStatmov al,byte ptr [Stat3]jmp OKNaStat4:cmp byte ptr [Stat4],1jb TStatcmp byte ptr [Stat4],aja TStatmov al,byte ptr [Stat4]jmp OKNaStat5:cmp byte ptr [Stat5],1jb TStatcmp byte ptr [Stat5],aja TStatmov al,byte ptr [Stat5]jmp OKNaStat6:cmp byte ptr [Stat6],1jb TStatcmp byte ptr [Stat6],aja TStatmov al,byte ptr [Stat6]jmp OKNaStat7:cmp byte ptr [Stat7],1jb TStatcmp byte ptr [Stat7],aja TStatmov al,byte ptr [Stat7]jmp OKMStat:mov byte ptr [Stat1],a // изменил, чтобы в таблице СЕ значения тоже поменялисьmov byte ptr [Stat2],amov byte ptr [Stat3],amov byte ptr [Stat4],amov byte ptr [Stat5],amov byte ptr [Stat6],amov byte ptr [Stat7],ajmp MenjaemStat        // Поэтому изменил безусловный переход.Stat1:db 0Stat2:db 0Stat3:db 0Stat4:db 0Stat5:db 0Stat6:db 0Stat7:db 0MaxStat:db 0AdresInGame8:jmp newMem8nopnopreturnHere8:[DISABLE]AdresInGame8: // Fallout3.exe+516D4mov al,[eax+ecx-01]ret 0004unregistersymbol(MaxStat)unregistersymbol(Stat1)unregistersymbol(Stat2)unregistersymbol(Stat3)unregistersymbol(Stat4)unregistersymbol(Stat5)unregistersymbol(Stat6)unregistersymbol(Stat7)unregistersymbol(AdresInGame8)dealloc(newMem8) 
luacall(showMessage("ВНИМАНИЕ!!! Статы могут иметь значения от 1 до 10 включительно."))
Ссылка на комментарий
Поделиться на другие сайты

Повторюсь, а то чёй-то никто не отвечает:

 

По второй задаче кое-что нашёл:

luacall(showMessage("ВНИМАНИЕ!!! Статы могут иметь значения от 1 до 10 включительно.")) 

Но:

1. В самом коде русский язык не воспринимается (неужели нету поддержки русского языка в СЕ). Приходится, чтобы можно было прочитать, перед командой ставить //. 

2. Вставил эту команду куда мне нужно, но окошко с сообщением выскакивает только при активации скрипта, а не когда я специально делаю ошибку.

Так что вопрос пока не решён. Подскажите. 

 

Всё-таки интересно, как можно вызвать в ассемблерском скрипте, написанным в СЕ, вызвать когда мне нужно вставку LUA-скрипта (не писав при этом полностью скрипт на LUA, так как пока его не изучал)? 

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

Автоасемблер и сам lua разные вещи. Автоасемблер это инжектор в код программы своего кода...

То есть надо отталкиваться от lua и приходить к ассемблерным вставкам а не наоборот отталкиваться от инжектора и приходить к вставкам lua.

 

 

Придется подучить Lua благо не сложный язык.

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

Автоасемблер и сам lua разные вещи. Автоасемблер это инжектор в код программы своего кода...

То есть надо отталкиваться от lua и приходить к ассемблерным вставкам а не наоборот отталкиваться от инжектора и приходить к вставкам lua.

 

 

Придется подучить Lua благо не сложный язык.

Жаль, а можно компактней записать мой скрипт, не посмотрите?

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

По поводу сокращений и компактности это не ко мне. Я сам люблю все расписывать чтобы мне было нагляднее.

вот пример моего кода который можно сократить в разы, но тогда читабельность(лично для меня) упадет во много раз.

[ENABLE]//code from here to '[DISABLE]' will be used to enable the cheatalloc(newmem,2048)label(returnhere)label(orig)label(orig2)label(orig3)label(orig4)label(orig5)label(orig6)label(orig7)label(ss)label(zed)newmem: //this is allocated memory, you have read,write,execute accesscmp [ecx+00000148],2je ssjmp origss:mov dx,[esp+04]push axmov ax,[ecx+000007F6]sub ax,dxmov [zed],dxsub [zed],axsub [zed],axsub [zed],axsub [zed],axsub [zed],axsub [zed],axcmp word ptr [zed],1jle orig2mov dx,[zed]pop axjmp returnhereorig:mov dx,[esp+04]jmp returnhereorig2:mov [zed],dxsub [zed],axsub [zed],axsub [zed],axsub [zed],axsub [zed],axcmp word ptr [zed],1jle orig3mov dx,[zed]pop axjmp returnhereorig3:mov [zed],dxsub [zed],axsub [zed],axsub [zed],axsub [zed],axcmp word ptr [zed],1jle orig4mov dx,[zed]pop axjmp returnhereorig4:mov [zed],dxsub [zed],axsub [zed],axsub [zed],axcmp word ptr [zed],1jle orig5mov dx,[zed]pop axjmp returnhereorig5:mov [zed],dxsub [zed],axsub [zed],axcmp word ptr [zed],1jle orig6mov dx,[zed]pop axjmp returnhereorig6:mov [zed],dxsub [zed],axcmp word ptr [zed],1jle orig7mov dx,[zed]pop axjmp returnhereorig7:pop axjmp returnherezed:dd 0"Freedom.exe"+9FCB0:jmp newmemreturnhere:  [DISABLE]//code from here till the end of the code will be used to disable the cheatdealloc(newmem)"Freedom.exe"+9FCB0:mov dx,[esp+04]//Alt: db 66 8B 54 24 04
Ссылка на комментарий
Поделиться на другие сайты

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

в этом сообщении.

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

  • 1 год спустя...
В 21.12.2014в10:03, lamalamaz сказал:

То есть надо отталкиваться от lua и приходить к ассемблерным вставкам а не наоборот отталкиваться от инжектора и приходить к вставкам lua.

Утверждение не верное, пример показан в последнем скрипте

4. Скрипт по заданию

"Timer Mission v. Sound"

 моей статьи - 

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

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

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

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