#1 17-08-2006 23:25

Capushon
Registered: 13-08-2006
Posts: 350
Website

Разжёвывание "известных" команд.

Не хотелось все вопроссы сбрасывать в одну кучу, как это сделано на большинстве форумов по GTA, по-сему создаю эту тему.

Вопрос вот в чём, ещё со времён GTA3, некоторые команды вроде как и содержат некое описание, но их загадочный смысл до конца непонятен,  а поэтому никем не используется в модах.
Начну по-порядку - поправьте если ошибусь:

Игрок видит авто?

00D6: if 0
02CA:   car @61 bounding_sphere_visible
004D: jump_if_false ЈDRUGS3_885

Добавить в группу @50, актёра в качестве лидера - это как?

0630: put_actor @64 in_group @50 as_leader

На предмет чего, может быть такая проверка? Какие будут предположения?
И что вообще такое 1541? Т.е. некий параметр актёра @15 записывается в переменную @13, но что это может быть?

062E: actor @15 1541 @13 
00D6: if 0
04A4:   @13 7 
004D: jump_if_false ЈGFMEET_259

Вот ещё похожее условие, но здесь более-менее понятно, похоже проверяется звучит ли ещё загруженный трек. Или есть другие идеи?

0953: get_soundtrack_status @17 
00D6: if 0
04A4:   @17 3 
004D: jump_if_false ЈЈLOWGAME_150

Здесь вообще у меня нет никаких идей и приблизительно ... :-(

08C3: clear4_bit @3 3

Что это, может задавать?

03CC: set_car @244 enable_stuck_check_distance_to 2.0 = 3000
00D6: if 0
03CE:   car @244 stuck
004D: jump_if_false ЈSYN2_2803
03CD: car @244 remove_from_stuck_car_check

Last edited by Capushon (17-08-2006 23:27)


Сначала ты надежда и гордость,
Потом о спину ломают аршин. (c)БГ

Offline

#2 18-08-2006 10:15

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: Разжёвывание "известных" команд.

Capushon wrote:

Здесь вообще у меня нет никаких идей и приблизительно ... :-(

Код:
08C3: clear_bit @3 3

Я не тестировал, но уверен на 99% что это процедура очистки (сброса в ноль) 3-го бита в переменной 3@. Звучит немного непонятно, но на самом деле все легко.

Каждая переменная в GTA является 32-битной (4 байта). Это значит, что в ней может храниться максимальное число, доступное на 32-битных процессорах для типа Integer: 2147483647

Что есть данное значение? Это последовательность из 32-х битов, каждый из которых равен нулю или единице. 32 бита = 4 байта. В хекс-редакторах вы можете увидеть именно байтовое представление данных значений, но для процессора все видится конечно в битах. Так вот, например число 10 в двоичном виде есть число 1010. В 32х-битной переменной оно будет храниться как 000000...0001010.

Опкоды типа

08B4: test $var bit 1
08BA: set $var bit 10
08C0: clear $var bit 1

работают со значением одного из 32х битов в значении переменной.

Для чего это нужно?
Это очень полезно, когда вам нужно завести в скрипте несколько флагов типа True/False и не хочется тратить на это несколько переменных. Значения всех флагов можно хранить в одном месте и проверять их данными командами. Например, создали машину - установили 5-й бит в 1. Создали актера - 20-й бит в 1. и т.д.

08B4: test $var bit 1 // true если первый бит = 1
08BA: set $var bit 10 // 10-й бит = 1
08C0: clear $var bit 1 // 1-й бит = 0

Offline

#3 18-08-2006 10:30

Xieon
Registered: 16-08-2006
Posts: 2

Re: Разжёвывание "известных" команд.

00D6: if 0
02CA:   car @61 bounding_sphere_visible
004D: jump_if_false ЈDRUGS3_885

Bounding Sphere - невидимый шар вокруг каждой машины размером и местом, определенным в .COL-файле, движок "понимает" машины именно через Bounding боксы/сферы и т.п. ну а данный опкод позволяет проверить находится ли игрок сейчас в этой самой невидимой сфере машины, то есть как ты сказал "игрок видит авто" wink

0630: put_actor @64 in_group @50 as_leader

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

И что вообще такое 1541? Т.е. некий параметр актёра @15 записывается в переменную @13, но что это может быть?

Я всегда пользовался 04A4 как универсальной проверкой, ибо он работает и с интегерами и с флоатами, т.е 04E4: @13 == 7 ; integers or floats.

Здесь вообще у меня нет никаких идей и приблизительно ... :-(

Упс, опередили. smile Я одного не пойму - зачем таких опкодов существует сразу несколько, выходит они не одинаковы?

Что это, может задавать?

Регистрация проверки для машины на "застревание" в пути, ибо учитывая глюки GTA такое иногда случается. Затем если машина "застряла", едет в стену и т.д., это можно проверить и скорректировать ее путь опкодом 0706. Чтобы не загружать игру, такая проверка предоставляется опционально smile

Last edited by Xieon (18-08-2006 10:32)

Offline

#4 18-08-2006 11:03

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: Разжёвывание "известных" команд.

Xieon wrote:

Я одного не пойму - зачем таких опкодов существует сразу несколько, выходит они не одинаковы?

Ну разные они из-за разных типов параметров.

  08B4: test $var bit 1    // global int
  08B5: test $var bit $var // global global
  08B6: test $var bit 1@   // global local
  08B7: test 1@ bit 1      // local  int
  08B8: test 1@ bit $var   // local  global
  08B9: test 1@ bit 1@     // local  local

08BA: set $var bit 1       // global int
08BB: set $var bit $var    // global global
08BC: set $var bit 1@      // global local
08BD: set 1@ bit 1         // local  int
08BE: set 1@ bit $var      // local  global
08BF: set 1@ bit 1@        // local  local

08C0: clear $var bit 1     // global int
08C1: clear $var bit $var  // global global
08C2: clear $var bit 1@    // global local
08C3: clear 1@ bit 1       // local  int
08C4: clear 1@ bit $var    // local  global
08C5: clear 1@ bit 1@      // local  local

Offline

#5 18-08-2006 22:05

Capushon
Registered: 13-08-2006
Posts: 350
Website

Re: Разжёвывание "известных" команд.

2Seemann

Это очень полезно, когда вам нужно завести в скрипте несколько флагов типа True/False

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

2Xieon

Bounding Sphere - невидимый шар вокруг каждой машины

Спасибо, этого я действительно незнал. Знать бы ещё точный размер радиуса...

Я всегда пользовался 04A4 как универсальной проверкой, ибо он работает и с интегерами и с флоатами, т.е 04E4: @13 == 7 ; integers or floats.

Нет, я о другом - о числе 1541, связанным с актёром. Что это?

Регистрация проверки для машины на "застревание" в пути, ибо учитывая глюки GTA такое иногда случается.

Проверка - это понятно, что такое:

03CC: set_car @244 enable_stuck_check_distance_to 2.0 = 3000

Затем если машина "застряла", едет в стену и т.д., это можно проверить и скорректировать ее путь опкодом 0706.

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

05EB: assign_vehicle @79 to_path 509

А при отсутствии такой информации, что-то корректировать бессмысленно.
Обе эти команды работают в основном в паре...


Сначала ты надежда и гордость,
Потом о спину ломают аршин. (c)БГ

Offline

#6 19-08-2006 02:20

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: Разжёвывание "известных" команд.

Capushon wrote:

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

Возможно, просто вопрос удобства. Я, например, никогда в Дельфи не использовал подобный способ проверки. Гораздо проще завести однобайтовую переменную типа Boolean с понятным именем, чем возиться на уровне битов.

Вообще подобные 32-битные переменные можно рассматривать как массив битов, где биты пронуменрованы от нуля до 31. И работать с ними точно также так и с массивом: обнулять в цикле, работать с индексными переменными и т.д.

Offline

#7 05-09-2006 02:58

VcSaJen
Registered: 25-08-2006
Posts: 217

Re: Разжёвывание "известных" команд.

Что означает

05B6: skip_next_128_bytes

И зачем он нужен?


[small][/small]

Offline

#8 06-09-2006 03:48

VcSaJen
Registered: 25-08-2006
Posts: 217

Re: Разжёвывание "известных" команд.

Может с его помощью можно засунуть исходник в MAIN.SCM?

Last edited by VcSaJen (07-09-2006 02:49)


[small][/small]

Offline

#9 07-09-2006 21:38

Capushon
Registered: 13-08-2006
Posts: 350
Website

Re: Разжёвывание "известных" команд.

2VcSaJen:
Это просто переход на 128 байт ниже.


Сначала ты надежда и гордость,
Потом о спину ломают аршин. (c)БГ

Offline

#10 08-09-2006 13:51

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: Разжёвывание "известных" команд.

VcSaJen wrote:

05B6: skip_next_128_bytes

Мусор. Отладочная информация, которая использовалась R* при разработке скриптов и ловле багов. В настоящие момент не представляет интереса.
(если интересно, то в SAMB эта информация хранится в специальных .bin файлах в папке Table. В санни эту ф-цию выполняет debug.bin).

Offline

#11 29-10-2006 23:05

Capushon
Registered: 13-08-2006
Posts: 350
Website

Re: Разжёвывание "известных" команд.

2Seemann
2Xieon
2All

Помогите с пониманием следующих инструкций:

0396: 1 (set) useless_flag
0792: disembark_actor $PLAYER_ACTOR instantly

Какой тайный смысл создавать машину сначала в 0.0  0.0  0.0 - координатах, и тут-же переносить её в нужное место ... ???    (такое и с актёрами, маркерами и пр.)...

00A5: @69 = create_car #REMINGTN at  0.0  0.0  0.0
0229: set_car @69 color_to 1 0
00AB: put_car @69(@43,7i) at @138(@43,7f) @145(@43,7f) @152(@43,7f)

В чём разница?

01F4:   car @108 flipped
и
020D:   car @108 flipped

Сначала ты надежда и гордость,
Потом о спину ломают аршин. (c)БГ

Offline

#12 31-10-2006 10:29

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: Разжёвывание "известных" команд.

К сожалению не могу дать точного ответа ни по одному пункту.
0396 это опкод, устанавливающий значение какого байта (флага) в программе. Однако нигде это значение потом не используется, поэтому можно считать (да и мнемоника об этом говорит), что это "бесполезный" флаг.
0792 - практически везде используется перед опкодом 00A1, так что есть основания полагать, что это процедура безопасной выгрузки актера из машины (я не тестил).

Какой тайный смысл создавать машину сначала в 0.0  0.0  0.0 - координатах, и тут-же переносить её в нужное место ... ???    (такое и с актёрами, маркерами и пр.)...

Не думаю, что в этом есть тайный смысл. Просто особенность рук R*-ских программистов. В СА подобных приколов хоть отбавляй.

В чём разница?

вот тут ничего сказать не могу. 020D совершенно точно проверяет машину на переворачивание (я его использовал в моде Carrotator, если ты помнишь), а вот 01F4 не знаю.

Offline

#13 06-11-2006 01:01

Capushon
Registered: 13-08-2006
Posts: 350
Website

Re: Разжёвывание "известных" команд.

2Seemann:

Не думаю, что в этом есть тайный смысл. Просто особенность рук R*-ских программистов. В СА подобных приколов хоть отбавляй.

Может с помощью таких конструкций быстрее выполняется респаун объекта, машины, или педа?

Вот ещё один интереснейший вопрос!
Допустим есть некая переменная $Test, ей мы задаём интеджер значение:
$Test = 250, работаем с ней, звершаем трейд, а после, уже в другом трейде используем эту же переменную $Test, но уже со значением флоат -
$Test = 150.0
Внимание вопрос: как это дело понравится игре, ибо подобных случаев в оригинале не встречается?


Сначала ты надежда и гордость,
Потом о спину ломают аршин. (c)БГ

Offline

#14 06-11-2006 09:19

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: Разжёвывание "известных" команд.

Capushon wrote:

Внимание вопрос: как это дело понравится игре, ибо подобных случаев в оригинале не встречается?

Надо было еще сказать: "время пошло" smile
Игре будет все равно. Какая ей разница, какие ты там хранишь значения?

Вообще, флоат может быть представлен и в виде простого целого числа. Например,

$Test = 150.0
$Test = 1125515264

оба варианта равнозначны.

Игра в мат. опкодах (0005) не различает между собой интегер и флоат, а просто копирует 4 байта из скм в переменную. Только когда речь идет об определенных опкодах, например с координатами, игра оперирует ими как числом с плавающей точкой. Но и в этом случае можно пользоваться интегер альтернативой, как я привел пример выше.

Может с помощью таких конструкций быстрее выполняется респаун объекта, машины, или педа?

Единственное, что можно предположить (если смотреть поток LOWR), то сначала создается группа машин, а потом в цикле им задают некоторые специфические параметры (позиция, угол). Если делать еще и создание машины в цикле, то возможна небольщая задержка между респауном одной машины и другой (т.е. машины будут как бы сыпаться по одной). Вынос создания машин за пределы видимости игрока (в нулевую координату) позволяет потом их сразу переместить и тем самым создать иллюзию мгновенного создания.

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

Offline

#15 08-11-2006 18:16

Capushon
Registered: 13-08-2006
Posts: 350
Website

Re: Разжёвывание "известных" команд.

2Seemann
Ещё один интересный вопрос!
С виду - очень простой ...
Что делает данная инструкция:

090F: end_external_script xx

судя по мнемонике, должна завершать external-скрипт, но всё не так просто - скрипт и не думает останавливаться ...  :-(


Сначала ты надежда и гордость,
Потом о спину ломают аршин. (c)БГ

Offline

#16 12-11-2006 10:38

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: Разжёвывание "известных" команд.

Может она просто предотвращает последующие запуски скрипта, но не останавливает уже запущенные. Видимо для этого нужно вводить проверку в самом теле скрипта (через переменную).

Offline

Board footer

Powered by FluxBB