GTA Vice City > Моды

CarRec

(1/6) > >>

Shagg_E:
Решил я сделать "визуальный эквалайзер" для Dubstep-пушки(да простит меня Prographer за то что я влез и изнасиловал его идею), для чего понадобилось записать огромное кол-во значений в файл, который позднее был бы загружен скриптом. ini для этого не подходил(пустой расход ресурсов) - понадобилось создать бинарник средствами CLEO. Опыта у меня в этом не было, однако DK мне всё разъяснил и показал на конкретных примерах(за что ему еще раз огромнейшее спасибо!).
Однако пока я ковырял эту тему, на ум мне пришла ооочень старая идея, реализацию которой я несколько лет откладывал на "потом", а сейчас возникла реальная возможность её воплотить.
Подробная запись движения автомобиля.
Без лишних слов - вот 2 видоса:
! No longer available
! No longer available

Думаю, нет нужды объяснять, для чего такая запись может понадобиться(все помнят подобные сцены из SA, либо записи трюков в школе вождения), вопрос лишь в том, как лучше её произвести.

Я сделал так: взял(для начала) 19 переменных:
1)время
2-13)матрица позиции и поворота транспорта
14-16)скорость движения(movement speed) транспорта
17-19)сила вращения(turn speed) транспорта
20)переменная про запас(сейчас уже понял, что "докинуть" придется гораздо больше переменных)

На каждую переменную по 4 байта(знаю, что в SA версии всё гораздо экономнее, но за идеями оптимизации я сюда и пишу), 20x4=80 байт за такт x30 тактов в секунду при записи с ограничителем кадров = 2400 байт в секунду. Я сделал для теста лимит 4 млн байт(около получаса времени записи), однако если записывать без ограничителя кадров - может уходить до миллиона(!) байт в минуту, а то и больше. Скрипт написан так, что фреймрейт записи никак не влияет на скорость воспроизведения, так что никаких проблем с синхронизацией не возникнет.
Запись происходит в CLEO/carrec.cr
Активация/деактивация скрипта: C+R
Далее R - начать/закончить запись(можно писать поверх старого файла)
P - начать/закончить воспроизведение имеющейся записи.
При отсутствии carrec.cr файла воспроизведение не начнется.
Воспроизведение автоматически повторяется после завершения, пока не будет нажата P.

Код скрипта:

--- Код: Text ---{$CLEO .cs} //-------------MAIN---------------thread 'CARREC' :CARRECORD_01wait 0if and   Player.Defined($PLAYER_CHAR)00E0:   player $PLAYER_CHAR drivingjf @CARRECORD_01if and0AB0: key_pressed 67 // C0AB0: key_pressed 82 // Rjf @CARRECORD_01 :CARRECORD_02wait 0if and   Player.Defined($PLAYER_CHAR)00E0:   player $PLAYER_CHAR drivingjf @CARRECORD_01if or8AB0: NOT key_pressed 67 // C8AB0: NOT key_pressed 82 // Rjf @CARRECORD_0203C1: 0@ = player $PLAYER_CHAR car_no_save018C: play_sound 14 at 0.0 0.0 0.0 :CARRECORD_03wait 00AD1: show_formatted_text_highpriority "Car Recording Script is ~t~ready. ~h~Press ~o~R ~h~to start recording. ~h~Press ~p~P ~h~to play record." time 100if and   Player.Defined($PLAYER_CHAR)00E0:   player $PLAYER_CHAR driving8039:   NOT 0@ == -100DC:   player $PLAYER_CHAR driving 0@jf @CARRECORD_CANCELif0AB0: key_pressed 82 // Rjf @CARRECORD_PLAYif8AB0: NOT key_pressed 67 // Cjf @CARRECORD_CANCEL :CARRECORD_04wait 0if and   Player.Defined($PLAYER_CHAR)00E0:   player $PLAYER_CHAR driving8039:   NOT 0@ == -100DC:   player $PLAYER_CHAR driving 0@jf @CARRECORD_CANCELif8AB0: NOT key_pressed 82 // Rjf @CARRECORD_040006: 1@ = 4000000 // memory limit0AC8: 2@ = allocate_memory_size 1@0006: 3@ = 0x00 // allocated memory offset018C: play_sound 16 at 0.0 0.0 0.00006: 16@ = 0 :CARRECORD_050AD1: show_formatted_text_highpriority "~o~RECORDING: %d ms ~h~Press ~x~R ~h~to finish recording." time 100 16@if and   Player.Defined($PLAYER_CHAR)00E0:   player $PLAYER_CHAR driving8039:   NOT 0@ == -1jf @CARRECORD_ENDif and00DC:   player $PLAYER_CHAR driving 0@8AB0: NOT key_pressed 82 // Rjf @CARRECORD_END0AB1: call_scm_func @CARRECORD_RECORDING 4 0@ 2@ 3@ 16@ 3@wait 00085: 15@ = 1@0062: 15@ -= 3@000E: 15@ -= 0x50 // 80 bytes001B:   0 > 15@ // if memory fulljf @CARRECORD_05//jump @CARRECORD_END :CARRECORD_END0AB1: call_scm_func @CARRECORD_RECORDTOCR 2 2@ 3@0AC9: free_allocated_memory 2@018C: play_sound 10 at 0.0 0.0 0.0 0AD1: show_formatted_text_highpriority "Car Recording ~x~is finished. ~h~Time: ~x~%d ms." time 3000 16@jump @CARRECORD_01 :CARRECORD_CANCELwait 0if or8AB0: NOT key_pressed 67 // C8AB0: NOT key_pressed 82 // Rjf @CARRECORD_CANCEL018C: play_sound 13 at 0.0 0.0 0.00AD1: show_formatted_text_highpriority "Car Recording Script ~y~deactivated!" time 2000jump @CARRECORD_01 :CARRECORD_PLAYif0AB0: key_pressed 80 // Pjf @CARRECORD_03 :CARRECORD_PLAY_02wait 0if and   Player.Defined($PLAYER_CHAR)00E0:   player $PLAYER_CHAR driving8039:   NOT 0@ == -100DC:   player $PLAYER_CHAR driving 0@jf @CARRECORD_CANCELif8AB0: NOT key_pressed 80 // Pjf @CARRECORD_PLAY_02if0AAB: file_exists "cleo\carrec.cr"jf @CARRECORD_CANCEL//04C4: create_coordinate 1@ 2@ 3@ from_actor $PLAYER_ACTOR offset 0.0 0.0 2.0//012A: put_player $PLAYER_CHAR at 1@ 2@ 3@ and_remove_from_car//0464: put_actor $PLAYER_ACTOR into_turret_on_car 0@ at_car_offset 0.0 0.0 1.0 position 0 angle 0.0 with_weapon 0//wait 00AB1: call_scm_func @CARRECORD_READCR 0 2@ 1@ :CARRECORD_PLAY_START0006: 3@ = 0x00 // allocated memory offset018C: play_sound 16 at 0.0 0.0 0.00227: 14@ = car 0@ health0006: 16@ = 0046C: 15@ = car 0@ driver0039:   15@ == -1jf @CARRECORD_PLAY_0503A2: set_car_status 0@ to 3 :CARRECORD_PLAY_050AD1: show_formatted_text_highpriority "~p~RECORD PLAYBACK: %d ms ~h~Press ~p~P ~h~to finish playback." time 100 16@//Camera.OnPed($PLAYER_ACTOR, 0, 2)if and   Player.Defined($PLAYER_CHAR)//00E0:   player $PLAYER_CHAR driving8039:   NOT 0@ == -1jf @CARRECORD_PLAY_ENDif// and//00DC:   player $PLAYER_CHAR driving 0@8AB0: NOT key_pressed 80 // Pjf @CARRECORD_PLAY_END0AB1: call_scm_func @CARRECORD_RECORDPLAYBACK 4 0@ 2@ 3@ 16@ 3@wait 00224: set_car 0@ health_to 14@0085: 15@ = 1@0062: 15@ -= 3@000E: 15@ -= 0x50 // 80 bytes001B:   0 > 15@ // if playback is finishedjf @CARRECORD_PLAY_05jump @CARRECORD_PLAY_START :CARRECORD_PLAY_END0AC9: free_allocated_memory 2@//0465: remove_actor $PLAYER_ACTOR from_turret_mode//Camera.Restore_WithJumpCut018C: play_sound 10 at 0.0 0.0 0.0 0AD1: show_formatted_text_highpriority "Car record playback ~x~is finished. ~h~Time: ~x~%d ms." time 3000 16@jump @CARRECORD_01 :CARRECORD_RECORDING// Recording Time:0085: 15@ = 1@005A: 15@ += 2@0A8C: write_memory 15@ size 4 value 3@ virtual_protect 1 // recording time000A: 15@ += 0x040A97: 14@ = car 0@ struct// Recording Matrix:0085: 13@ = 14@ 000A: 13@ += 0x04 // right x 0A8D: 12@ = read_memory 13@ size 4 virtual_protect 10A8C: write_memory 15@ size 4 value 12@ virtual_protect 1 // recording right x000A: 15@ += 0x04000A: 13@ += 0x04 // right y0A8D: 12@ = read_memory 13@ size 4 virtual_protect 10A8C: write_memory 15@ size 4 value 12@ virtual_protect 1 // recording right y000A: 15@ += 0x04000A: 13@ += 0x04 // right z0A8D: 12@ = read_memory 13@ size 4 virtual_protect 10A8C: write_memory 15@ size 4 value 12@ virtual_protect 1 // recording right z000A: 15@ += 0x04000A: 13@ += 0x08 // up x 0A8D: 12@ = read_memory 13@ size 4 virtual_protect 10A8C: write_memory 15@ size 4 value 12@ virtual_protect 1 // recording up x000A: 15@ += 0x04000A: 13@ += 0x04 // up y0A8D: 12@ = read_memory 13@ size 4 virtual_protect 10A8C: write_memory 15@ size 4 value 12@ virtual_protect 1 // recording up y000A: 15@ += 0x04000A: 13@ += 0x04 // up z0A8D: 12@ = read_memory 13@ size 4 virtual_protect 10A8C: write_memory 15@ size 4 value 12@ virtual_protect 1 // recording up z000A: 15@ += 0x04000A: 13@ += 0x08 // at x 0A8D: 12@ = read_memory 13@ size 4 virtual_protect 10A8C: write_memory 15@ size 4 value 12@ virtual_protect 1 // recording at x000A: 15@ += 0x04000A: 13@ += 0x04 // at y0A8D: 12@ = read_memory 13@ size 4 virtual_protect 10A8C: write_memory 15@ size 4 value 12@ virtual_protect 1 // recording at y000A: 15@ += 0x04000A: 13@ += 0x04 // at z0A8D: 12@ = read_memory 13@ size 4 virtual_protect 10A8C: write_memory 15@ size 4 value 12@ virtual_protect 1 // recording at z000A: 15@ += 0x04000A: 13@ += 0x08 // position x 0A8D: 12@ = read_memory 13@ size 4 virtual_protect 10A8C: write_memory 15@ size 4 value 12@ virtual_protect 1 // recording position x000A: 15@ += 0x04000A: 13@ += 0x04 // position y0A8D: 12@ = read_memory 13@ size 4 virtual_protect 10A8C: write_memory 15@ size 4 value 12@ virtual_protect 1 // recording position y000A: 15@ += 0x04000A: 13@ += 0x04 // position z0A8D: 12@ = read_memory 13@ size 4 virtual_protect 10A8C: write_memory 15@ size 4 value 12@ virtual_protect 1 // recording position z000A: 15@ += 0x04// Recording Movement Speed:0085: 13@ = 14@000A: 13@ += 0x70 // x push0A8D: 12@ = read_memory 13@ size 4 virtual_protect 10A8C: write_memory 15@ size 4 value 12@ virtual_protect 1 // recording x push000A: 15@ += 0x04000A: 13@ += 0x04 // y push0A8D: 12@ = read_memory 13@ size 4 virtual_protect 10A8C: write_memory 15@ size 4 value 12@ virtual_protect 1 // recording y push000A: 15@ += 0x04000A: 13@ += 0x04 // z push0A8D: 12@ = read_memory 13@ size 4 virtual_protect 10A8C: write_memory 15@ size 4 value 12@ virtual_protect 1 // recording z push000A: 15@ += 0x04// Recording Turn Speed:000A: 13@ += 0x04 // x turn speed0A8D: 12@ = read_memory 13@ size 4 virtual_protect 10A8C: write_memory 15@ size 4 value 12@ virtual_protect 1 // recording x turn speed000A: 15@ += 0x04000A: 13@ += 0x04 // y turn speed0A8D: 12@ = read_memory 13@ size 4 virtual_protect 10A8C: write_memory 15@ size 4 value 12@ virtual_protect 1 // recording y turn speed000A: 15@ += 0x04000A: 13@ += 0x04 // z turn speed0A8D: 12@ = read_memory 13@ size 4 virtual_protect 10A8C: write_memory 15@ size 4 value 12@ virtual_protect 1 // recording z turn speed000A: 2@ += 0x50 :CARRECORD_RECORDING_RETURN0AB2: ret 1 2@ :CARRECORD_RECORDTOCR0AA7: call_function 0x48DF90 num_params 2 pop 2 "wb" "cleo\\carrec.cr" 15@ // FILE *file = CFileMgr::Open("cleo\carrec.cr", "wb");0AC7: 13@ = var 14@ offset                                           // float *var_offset = &vars[3];0006: 12@ = 0x00 :CARRECORD_RECORDTOCR_02if001D:   1@ > 12@jf @CARRECORD_RECORDTOCR_RETURN0085: 11@ = 0@005A: 11@ += 12@0A8D: 14@ = read_memory 11@ size 4 virtual_protect 10AA5: call 0x48DF30 num_params 3 pop 3 4 13@ 15@                 //     CFileMgr::Write(file, var_offset, 4);000A: 12@ += 0x04jump @CARRECORD_RECORDTOCR_02 :CARRECORD_RECORDTOCR_RETURN0AA5: call 0x48DEA0 num_params 1 pop 1 15@                          // CFileMgr::Close(file);0AB2: ret 0 :CARRECORD_READCR0AA7: call_function 0x48DF90 num_params 2 pop 2 "rb" "cleo\\carrec.cr" 15@ // file = CFileMgr::Open("cleo\carrec.cr", "rb");// Get file size to 14@:0AA5: call 0x48DEE0 num_params 3 pop 3 2 0 15@                      // CFileMgr::Seek(file, 0, SEEK_END);0AA7: call_function 0x652D50 num_params 1 pop 1 15@ 14@              // size = ftell(file);// Go to beginning of the file:0AA5: call 0x48DEE0 num_params 3 pop 3 0 0 15@                      // CFileMgr::Seek(file, 0, SEEK_SET);// Now start reading:0AC8: 13@ = allocate_memory_size 14@0006: 12@ = 0x00 :CARRECORD_READCR_02if801D:   NOT 12@ > 14@jf @CARRECORD_READCR_RETURN0085: 11@ = 13@005A: 11@ += 12@0AA5: call 0x48DF50 num_params 3 pop 3 4 11@ 15@                 //     CFileMgr::Read(file, var_offset, 4);000A: 12@ += 0x04    jump @CARRECORD_READCR_02 :CARRECORD_READCR_RETURN0AA5: call 0x48DEA0 num_params 1 pop 1 15@                          // CFileMgr::Close(file);0AB2: ret 2 13@ 14@ :CARRECORD_RECORDPLAYBACK// Check Time:0085: 15@ = 1@005A: 15@ += 2@0A8D: 14@ = read_memory 15@ size 4 virtual_protect 1001D:   3@ > 14@jf @CARRECORD_RECORDPLAYBACK_RETURN :CARRECORD_RECORDPLAYBACK_2000A: 2@ += 0x500085: 15@ = 1@005A: 15@ += 2@0A8D: 14@ = read_memory 15@ size 4 virtual_protect 1801D:   NOT 3@ > 14@jf @CARRECORD_RECORDPLAYBACK_2000E: 2@ -= 0x500085: 15@ = 1@005A: 15@ += 2@000A: 15@ += 0x040A97: 14@ = car 0@ struct// Playback Matrix:0085: 13@ = 14@ 000A: 13@ += 0x04 // right x 0A8D: 12@ = read_memory 15@ size 4 virtual_protect 10A8C: write_memory 13@ size 4 value 12@ virtual_protect 1 // playback right x000A: 15@ += 0x04000A: 13@ += 0x04 // right y 0A8D: 12@ = read_memory 15@ size 4 virtual_protect 10A8C: write_memory 13@ size 4 value 12@ virtual_protect 1 // playback right y000A: 15@ += 0x04000A: 13@ += 0x04 // right z 0A8D: 12@ = read_memory 15@ size 4 virtual_protect 10A8C: write_memory 13@ size 4 value 12@ virtual_protect 1 // playback right z000A: 15@ += 0x04000A: 13@ += 0x08 // up x 0A8D: 12@ = read_memory 15@ size 4 virtual_protect 10A8C: write_memory 13@ size 4 value 12@ virtual_protect 1 // playback up x000A: 15@ += 0x04000A: 13@ += 0x04 // up y0A8D: 12@ = read_memory 15@ size 4 virtual_protect 10A8C: write_memory 13@ size 4 value 12@ virtual_protect 1 // playback up y000A: 15@ += 0x04000A: 13@ += 0x04 // up z0A8D: 12@ = read_memory 15@ size 4 virtual_protect 10A8C: write_memory 13@ size 4 value 12@ virtual_protect 1 // playback up z000A: 15@ += 0x04000A: 13@ += 0x08 // at x 0A8D: 12@ = read_memory 15@ size 4 virtual_protect 10A8C: write_memory 13@ size 4 value 12@ virtual_protect 1 // playback at x000A: 15@ += 0x04000A: 13@ += 0x04 // at y0A8D: 12@ = read_memory 15@ size 4 virtual_protect 10A8C: write_memory 13@ size 4 value 12@ virtual_protect 1 // playback at y000A: 15@ += 0x04000A: 13@ += 0x04 // at z0A8D: 12@ = read_memory 15@ size 4 virtual_protect 10A8C: write_memory 13@ size 4 value 12@ virtual_protect 1 // playback at z000A: 15@ += 0x04000A: 13@ += 0x08 // position x 0A8D: 12@ = read_memory 15@ size 4 virtual_protect 10A8C: write_memory 13@ size 4 value 12@ virtual_protect 1 // playback position x000A: 15@ += 0x04000A: 13@ += 0x04 // position y0A8D: 12@ = read_memory 15@ size 4 virtual_protect 10A8C: write_memory 13@ size 4 value 12@ virtual_protect 1 // playback position y000A: 15@ += 0x04000A: 13@ += 0x04 // position z0A8D: 12@ = read_memory 15@ size 4 virtual_protect 10A8C: write_memory 13@ size 4 value 12@ virtual_protect 1 // playback position z000A: 15@ += 0x04// Playback Movement Speed:0085: 13@ = 14@000A: 13@ += 0x70 // x push0A8D: 12@ = read_memory 15@ size 4 virtual_protect 10A8C: write_memory 13@ size 4 value 12@ virtual_protect 1 // playback x push000A: 15@ += 0x04000A: 13@ += 0x04 // y push0A8D: 12@ = read_memory 15@ size 4 virtual_protect 10A8C: write_memory 13@ size 4 value 12@ virtual_protect 1 // playback y push000A: 15@ += 0x04000A: 13@ += 0x04 // z push0A8D: 12@ = read_memory 15@ size 4 virtual_protect 10A8C: write_memory 13@ size 4 value 12@ virtual_protect 1 // playback z push000A: 15@ += 0x04// Playback Turn Speed:000A: 13@ += 0x04 // x turn speed0A8D: 12@ = read_memory 15@ size 4 virtual_protect 10A8C: write_memory 13@ size 4 value 12@ virtual_protect 1 // playback x turn speed000A: 15@ += 0x04000A: 13@ += 0x04 // y turn speed0A8D: 12@ = read_memory 15@ size 4 virtual_protect 10A8C: write_memory 13@ size 4 value 12@ virtual_protect 1 // playback y turn speed000A: 15@ += 0x04000A: 13@ += 0x04 // z turn speed0A8D: 12@ = read_memory 15@ size 4 virtual_protect 10A8C: write_memory 13@ size 4 value 12@ virtual_protect 1 // playback z turn speed000A: 2@ += 0x50  :CARRECORD_RECORDPLAYBACK_RETURN0AB2: ret 1 2@
Скрипт пока сырой(пока записывается лишь самое-самое необходимое) и публикую я его потому, что хотел спросить у вас какие-нибудь идеи того, что можно записывать в такой файл помимо уже имеющегося(разумеется, будут добавлены все оставшиеся переменные из формата SA) и при этом не переборщить с нагрузкой.
Перемножать и конвертировать, как в SA, некоторые float для превращения их в INT16 или INT8 мне не охота(мне не лень, просто не очень хочется ставить производительность во главе угла в ущерб точности в года, когда иметь 2х-ядерник - моветон), а вот узнать, почему в SA версии поворот записывается в 6 адресов поворота, а их по-идее 9(насколько я понял), как в Вайсе - мне интересно.
Может, кто-нибудь на этом форуме знает, зачем вообще для поворота объекта 9 адресов?

Ну и вообще интересны ваши мысли и идеи по этому поводу  :)

xanser:
По поводу 9 адресов... Чтобы повернуть объект в 3-мерном пространстве xyz, нужно последовательно повернуть его в каждой из 2-мерных плоскостей xy, xz, yz. Для 2-мерной плоскости матрица поворота получается 2х2, для 3-мерного пространства - соответственно 3х3, но при этом внутри содержит ту же матрицу 2х2 + нули с единицей, обозначающих, что поворот происходит в 3d, но при этом в 2-мерной плоскости, одной из xy, xz, yz (по приведенной выше ссылке можно все посмотреть подробнее). Когда получен поворот в каждой из плоскостей 3-мерного пространства, то есть три матрицы поворота 3х3, остается их перемножить (по правилам перемножения матриц) и получится общая матрица поворота в 3d, отсюда и 9 адресов, каждый - это сумма/разность произведений синусов и косинусов от трех углов поворота. Примерно такое:

--- Код: C++ ---void CMatrix::SetAngles(float x, float y, float z) {        this->right.x = cos(y)*cos(z);        this->right.y = cos(y)*sin(z);        this->right.z = -sin(y);        this->up.x = sin(x)*sin(y)*cos(z) - cos(x)*sin(z);        this->up.y = sin(x)*sin(y)*sin(z) + cos(x)*cos(z);        this->up.z = sin(x)*cos(y);        this->at.x = cos(x)*sin(y)*cos(z) + sin(x)*sin(z);        this->at.y = cos(x)*sin(y)*sin(z) - sin(x)*cos(z);        this->at.z = cos(x)*cos(y);}
Поскольку каждый объект уже повернут как-то, то он уже содержит матрицу поворота, для следующего поворота она умножается на следующие матрицы поворота. Как это сократили с 9 адресов до 6, как ты говоришь, я не знаю, если только там поворот осуществляется не на 3, а на 2 угла?

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

По поводу дерганья машины. Предполагаю, что сначала происходит рендер машины, потом изменение координат, это вызывает заметные рывки. Есть функция 0x589AD0 CAutomobile::PreRender(). Желательно сделать туда внедрение, и менять матрицу машины до ее рендера. Но это, если интересно, потом расскажу, и это надо делать на си, у меня на этом многие возможности машин реализованы.

Shagg_E:
Про 9 адресов теперь ясно, спасибо! Раз это синусы и косинусы, то тогда действительно стоит их перемножить на 127 и перевести в INT8 для оптимизации выходного файла.
Про дергания забыл упомянуть: видео с авто немного устарело, теперь авто дергается лишь при столкновениях с объектами, которых не было на пути авто при записи(это норма).
Вектора скорости нужны, чтобы "сгладить" положение авто между тактами. Если их убрать - машина станет реально дерганой. Тогда придется записывать и читать с частотой более 30 тактов в секунду, что невозможно при ограничителе кадров, да и не нужно.
Кроме того - скрипт построен так, что воспроизведение можно остановить в любую секунду и авто "направится" в нужную сторону, в соответствии со своими векторами скорости(например - если вертолет сбит, или машина взорвалась).
На C++ такое можно сделать, но смысл задумки абсолютно теряется - как потом использовать это скриптеру в миссиях?

DK:

--- Цитата: Shagg_E от Май 28, 2017, 12:35:18 pm ---На C++ такое можно сделать, но смысл задумки абсолютно теряется - как потом использовать это скриптеру в миссиях?

--- Конец цитаты ---
Кастомные опкоды.
По сути, надо перенести опкоды, которые есть в SA, в VC  :P.

PS Не смотрел, как сделано в SA, но можно предположить, что третий вектор (at) "восстанавливается" из двух остальных.

Shagg_E:

--- Цитата: DK от Май 28, 2017, 12:51:48 pm ---
--- Цитата: Shagg_E от Май 28, 2017, 12:35:18 pm ---На C++ такое можно сделать, но смысл задумки абсолютно теряется - как потом использовать это скриптеру в миссиях?

--- Конец цитаты ---
Кастомные опкоды.
По сути, надо перенести опкоды, которые есть в SA, в VC  :P.
--- Конец цитаты ---
Всего-то ;D
Но вообще - была вначале задумка сделать структуру итогового файла полной копией САновского, но там нет силы вращения, плюс хочу сделать две версии(2 формата) файла на выбор: первый - SAновский минимум плюс сила вращения, второй - расширенный, в который добавлю доп. вещи типа угла поворота винта вертолета или колес авто(для некоторых задумок такое необходимо), статус повреждений, здоровье авто и пр(для отдельных задумок), хотя пока не уверен на счет этого.


--- Цитата: DK от Май 28, 2017, 12:51:48 pm ---PS Не смотрел, как сделано в SA, но можно предположить, что третий вектор (at) "восстанавливается" из двух остальных.

--- Конец цитаты ---
Да, только что проверил - можно обойтись и без третьей тройки векторов: никаких проблем не возникает!

Теперь, когда выяснилось, что переменные поворота можно действительно ужать до 1 байта каждую, а их кол-во сократилось до 6, то структура секции сократилась на 30 байт(почти половина от текущего размера секции)!

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии