You are not logged in.
Не хотелось все вопроссы сбрасывать в одну кучу, как это сделано на большинстве форумов по 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
Здесь вообще у меня нет никаких идей и приблизительно ... :-(
Код: 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
00D6: if 0
02CA: car @61 bounding_sphere_visible
004D: jump_if_false ЈDRUGS3_885
Bounding Sphere - невидимый шар вокруг каждой машины размером и местом, определенным в .COL-файле, движок "понимает" машины именно через Bounding боксы/сферы и т.п. ну а данный опкод позволяет проверить находится ли игрок сейчас в этой самой невидимой сфере машины, то есть как ты сказал "игрок видит авто"
0630: put_actor @64 in_group @50 as_leader
AFAIK, под группой подразумевается множество связанных актеров, то бишь та же банда грувов где лидер - Сиджей, за которым все ходят, видимо можно создавать подобные группы и с другими актерами в качестве лидеров.
И что вообще такое 1541? Т.е. некий параметр актёра @15 записывается в переменную @13, но что это может быть?
Я всегда пользовался 04A4 как универсальной проверкой, ибо он работает и с интегерами и с флоатами, т.е 04E4: @13 == 7 ; integers or floats.
Здесь вообще у меня нет никаких идей и приблизительно ... :-(
Упс, опередили. Я одного не пойму - зачем таких опкодов существует сразу несколько, выходит они не одинаковы?
Что это, может задавать?
Регистрация проверки для машины на "застревание" в пути, ибо учитывая глюки GTA такое иногда случается. Затем если машина "застряла", едет в стену и т.д., это можно проверить и скорректировать ее путь опкодом 0706. Чтобы не загружать игру, такая проверка предоставляется опционально
Last edited by Xieon (18-08-2006 10:32)
Offline
Я одного не пойму - зачем таких опкодов существует сразу несколько, выходит они не одинаковы?
Ну разные они из-за разных типов параметров.
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
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
Ну с этим более-менее понятно - спасибо. Но тут же вытекает следующий вопрос - а почему же таким образом разработчики не огранизоватили и другие проверки, те которые сделанны переменными?
Похоже какая-то разница существует.
Возможно, просто вопрос удобства. Я, например, никогда в Дельфи не использовал подобный способ проверки. Гораздо проще завести однобайтовую переменную типа Boolean с понятным именем, чем возиться на уровне битов.
Вообще подобные 32-битные переменные можно рассматривать как массив битов, где биты пронуменрованы от нуля до 31. И работать с ними точно также так и с массивом: обнулять в цикле, работать с индексными переменными и т.д.
Offline
Что означает
05B6: skip_next_128_bytes
И зачем он нужен?
[small][/small]
Offline
Может с его помощью можно засунуть исходник в MAIN.SCM?
Last edited by VcSaJen (07-09-2006 02:49)
[small][/small]
Offline
05B6: skip_next_128_bytes
Мусор. Отладочная информация, которая использовалась R* при разработке скриптов и ловле багов. В настоящие момент не представляет интереса.
(если интересно, то в SAMB эта информация хранится в специальных .bin файлах в папке Table. В санни эту ф-цию выполняет debug.bin).
Offline
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
К сожалению не могу дать точного ответа ни по одному пункту.
0396 это опкод, устанавливающий значение какого байта (флага) в программе. Однако нигде это значение потом не используется, поэтому можно считать (да и мнемоника об этом говорит), что это "бесполезный" флаг.
0792 - практически везде используется перед опкодом 00A1, так что есть основания полагать, что это процедура безопасной выгрузки актера из машины (я не тестил).
Какой тайный смысл создавать машину сначала в 0.0 0.0 0.0 - координатах, и тут-же переносить её в нужное место ... ??? (такое и с актёрами, маркерами и пр.)...
Не думаю, что в этом есть тайный смысл. Просто особенность рук R*-ских программистов. В СА подобных приколов хоть отбавляй.
В чём разница?
вот тут ничего сказать не могу. 020D совершенно точно проверяет машину на переворачивание (я его использовал в моде Carrotator, если ты помнишь), а вот 01F4 не знаю.
Offline
2Seemann:
Не думаю, что в этом есть тайный смысл. Просто особенность рук R*-ских программистов. В СА подобных приколов хоть отбавляй.
Может с помощью таких конструкций быстрее выполняется респаун объекта, машины, или педа?
Вот ещё один интереснейший вопрос!
Допустим есть некая переменная $Test, ей мы задаём интеджер значение:
$Test = 250, работаем с ней, звершаем трейд, а после, уже в другом трейде используем эту же переменную $Test, но уже со значением флоат -
$Test = 150.0
Внимание вопрос: как это дело понравится игре, ибо подобных случаев в оригинале не встречается?
Сначала ты надежда и гордость,
Потом о спину ломают аршин. (c)БГ
Offline
Внимание вопрос: как это дело понравится игре, ибо подобных случаев в оригинале не встречается?
Надо было еще сказать: "время пошло"
Игре будет все равно. Какая ей разница, какие ты там хранишь значения?
Вообще, флоат может быть представлен и в виде простого целого числа. Например,
$Test = 150.0 $Test = 1125515264
оба варианта равнозначны.
Игра в мат. опкодах (0005) не различает между собой интегер и флоат, а просто копирует 4 байта из скм в переменную. Только когда речь идет об определенных опкодах, например с координатами, игра оперирует ими как числом с плавающей точкой. Но и в этом случае можно пользоваться интегер альтернативой, как я привел пример выше.
Может с помощью таких конструкций быстрее выполняется респаун объекта, машины, или педа?
Единственное, что можно предположить (если смотреть поток LOWR), то сначала создается группа машин, а потом в цикле им задают некоторые специфические параметры (позиция, угол). Если делать еще и создание машины в цикле, то возможна небольщая задержка между респауном одной машины и другой (т.е. машины будут как бы сыпаться по одной). Вынос создания машин за пределы видимости игрока (в нулевую координату) позволяет потом их сразу переместить и тем самым создать иллюзию мгновенного создания.
P.S. Создание машины требует в разы большего количества времени, чем изменение ее угла или позиции
Offline
2Seemann
Ещё один интересный вопрос!
С виду - очень простой ...
Что делает данная инструкция:
090F: end_external_script xx
судя по мнемонике, должна завершать external-скрипт, но всё не так просто - скрипт и не думает останавливаться ... :-(
Сначала ты надежда и гордость,
Потом о спину ломают аршин. (c)БГ
Offline
Может она просто предотвращает последующие запуски скрипта, но не останавливает уже запущенные. Видимо для этого нужно вводить проверку в самом теле скрипта (через переменную).
Offline