Mafia-Game Forum

Mafia-Game Forum (https://mafia-game.ru/forum/index.php)
-   Скриптинг (https://mafia-game.ru/forum/forumdisplay.php?f=10)
-   -   Скрипт автомобильного радио (https://mafia-game.ru/forum/showthread.php?t=1047)

Firefox3860 09.10.2020 15:38

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

KlassenAS 09.10.2020 15:44

Цитата:

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

Что за способ?
Хотя, если честно, не уверен, что это поможет.
Ведь игра уже загрузилась. А с ней загрузились и ненужные аудиопотоки.

Ещё мысль появилась.
А что там со стэком? Он работает, кажется, независимо от сохранения?
Что, если в него сохранять идентификаторы потоков, а при загрузке из сохранения считывать их и дестроить их потоки?

Firefox3860 09.10.2020 16:00

Цитата:

Сообщение от KlassenAS (Сообщение 12370)
Что за способ?

Вот он - https://mafia-game.ru/forum/showpost...&postcount=143
Он немного костыльный, используется у меня в моде для загрузки chg-файлов и других начальных присвоений. Но вряд ли тут, конечно, поможет.

Цитата:

Сообщение от KlassenAS (Сообщение 12370)
А что там со стэком? Он работает, кажется, независимо от сохранения? Что, если в него сохранять идентификаторы потоков, а при загрузке из сохранения считывать их и дестроить их потоки?

Прямой доступ к оперативной памяти? Не знаю, можно ли такое сделать в скрипте.

KlassenAS 09.10.2020 16:08

Цитата:

Сообщение от Firefox3860 (Сообщение 12371)
Прямой доступ к оперативной памяти? Не знаю, можно ли такое сделать в скрипте.

Может, у движка есть собственное подобие стэка?

Развернуть для просмотра

floatreg_pop xx \\ есть в mise19mesto

найти последнее значение в стеке и записать его в переменную xx. Если стек пустой то команда вообще не сработает(даже не перепишет флт xx нулем).

xx - назначаемая переменная



floatreg_push xx \\ есть в mise19mesto\banka

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

xx - переменная, значение которой запоминаем
[свернуть]

Firefox3860 09.10.2020 16:44

Цитата:

Сообщение от KlassenAS (Сообщение 12373)
Может, у движка есть собственное подобие стэка?

А, тут даже специальные команды есть. Это точно стоит попробовать.
Ну и всё равно же этот стэк будет в оперативной памяти находиться.

KlassenAS 09.10.2020 17:26

Цитата:

Сообщение от Firefox3860 (Сообщение 12377)
А, тут даже специальные команды есть. Это точно стоит попробовать.
Ну и всё равно же этот стэк будет в оперативной памяти находиться.

Попробовал. Не помогло.
Кажется, я начинаю понимать, почему.
Похоже, что, когда загружается сохранение, и игра воссоздаёт сохранённые потоки, они получают новые идентификаторы.
ESC включает их воспроизведение рандомно.
А при следующем сохранении у нас сохраняются и те потоки, которые с прошлого сохранения остались, и к ним ещё новые добавляются.
Можно было бы дестроить потоки перед каждым сохранением.
Но для этого нужно лезть в скрипты в сценах, отвечающие за сохранение.
Перелопатить сохранения всех сцен ради одного скрипта - не рационально, мягко говоря.
Или хакнуть движок, чтобы созданные в скриптах аудиопотоки не сохранялись.
Это мне кажется более действенным, но нереальным.

А так-то я этот скрипт отладил - работает отлично. До первого сохранения.
А потом игра всю малину портит.

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

UPD: Тоже не прокатило...

Вот в таком виде сейчас существует этот скрипт.
Больше половины скрипта составляет алгоритм рандомизации треков.
Кому не лень состалять плейлист из 40 песен - можете протестировать )

Развернуть для просмотра

Код:

//Radio Script Ver. 2 10-10-2020 By KlassenAS

Dim_Act 1
Dim_Flt 19
GetActivePlayer 0
Human_GetProperty 0,4,Energy
If Flt[4]=0,-1,dan_on
Act_SetState 100,Off
Label dan_on

Let Flt[0]=0 //поток 00
Let Flt[1]=0 //поток 01
Let Flt[2]=0 //поток 02
Let Flt[3]=0 //поток 03 
Let Flt[4]=0 //логика
Let Flt[5]=0 //Нажатие клавиш вперёд1 и назад1
Let Flt[6]=0 //Последний активный поток
Let Flt[7]=0 //сиденье/Время с начала игры/текущее время потока/
Let Flt[8]=0 //Прошлое время с начала игры
Let Flt[9]=0 //номер радиостанции 0-3
Let Flt[10]=-1 //рандом для radio/разница во времени игры
Let Flt[11]=-1 //чтоб на radio00 не повторялись дважды
Let Flt[12]=-1 //чтоб на radio01 не повторялись дважды
Let Flt[13]=-1 //чтоб на radio02 не повторялись дважды
Let Flt[14]=-1 //чтоб на radio03 не повторялись дважды
Let Flt[15]=-1 //прошлое время потока 0
Let Flt[16]=-1 //прошлое время потока 1
Let Flt[17]=-1 //прошлое время потока 2
Let Flt[18]=-1 //прошлое время потока 3

//Это, чтобы сразу сохранение протестровать во фрирайде
FreeRide_ScoreAdd 2000

CommandBlock 1
Label RADIO00CREATE
Rnd 10,10
If Flt[11]=Flt[10],RADIO00CREATE,-1
Let Flt[11]=Flt[10]

        Label TRCK0000
        If Flt[10]=0,-1,TRCK0001
        Stream_Create 0,"radio\radio 00 - 00.mp3"
        GoTo RADIO00CREATED

        Label TRCK0001
        If Flt[10]=1,-1,TRCK0002
        Stream_Create 0,"radio\radio 00 - 01.mp3"
        GoTo RADIO00CREATED
       
        Label TRCK0002
        If Flt[10]=2,-1,TRCK0003
        Stream_Create 0,"radio\radio 00 - 02.mp3"
        GoTo RADIO00CREATED       
       
        Label TRCK0003
        If Flt[10]=3,-1,TRCK0004
        Stream_Create 0,"radio\radio 00 - 03.mp3"
        GoTo RADIO00CREATED       

        Label TRCK0004
        If Flt[10]=4,-1,TRCK0005
        Stream_Create 0,"radio\radio 00 - 04.mp3"
        GoTo RADIO00CREATED

        Label TRCK0005
        If Flt[10]=5,-1,TRCK0006
        Stream_Create 0,"radio\radio 00 - 05.mp3"
        GoTo RADIO00CREATED

        Label TRCK0006
        If Flt[10]=6,-1,TRCK0007
        Stream_Create 0,"radio\radio 00 - 06.mp3"
        GoTo RADIO00CREATED

        Label TRCK0007
        If Flt[10]=7,-1,TRCK0008
        Stream_Create 0,"radio\radio 00 - 07.mp3"
        GoTo RADIO00CREATED

        Label TRCK0008
        If Flt[10]=8,-1,TRCK0009
        Stream_Create 0,"radio\radio 00 - 08.mp3"
        GoTo RADIO00CREATED
       
        Label TRCK0009
        If Flt[10]=9,-1,RADIO00CREATED
        Stream_Create 0,"radio\radio 00 - 09.mp3"
        GoTo RADIO00CREATED

Label RADIO00CREATED
Stream_Fadevol 0,1,0,0
Stream_Play 0
If Flt[15]>0,REPLAY0,-1



Label RADIO01CREATE
Rnd 10,10
If Flt[12]=Flt[10],RADIO01CREATE,-1
Let Flt[12]=Flt[10]

        Label TRCK0100
        If Flt[10]=0,-1,TRCK0101
        Stream_Create 1,"radio\radio 01 - 00.mp3"
        GoTo RADIO01CREATED

        Label TRCK0101
        If Flt[10]=1,-1,TRCK0102
        Stream_Create 1,"radio\radio 01 - 01.mp3"
        GoTo RADIO01CREATED
       
        Label TRCK0102
        If Flt[10]=2,-1,TRCK0103
        Stream_Create 1,"radio\radio 01 - 02.mp3"
        GoTo RADIO01CREATED       
       
        Label TRCK0103
        If Flt[10]=3,-1,TRCK0104
        Stream_Create 1,"radio\radio 01 - 03.mp3"
        GoTo RADIO01CREATED       

        Label TRCK0104
        If Flt[10]=4,-1,TRCK0105
        Stream_Create 1,"radio\radio 01 - 04.mp3"
        GoTo RADIO01CREATED

        Label TRCK0105
        If Flt[10]=5,-1,TRCK0106
        Stream_Create 1,"radio\radio 01 - 05.mp3"
        GoTo RADIO01CREATED

        Label TRCK0106
        If Flt[10]=6,-1,TRCK0107
        Stream_Create 1,"radio\radio 01 - 06.mp3"
        GoTo RADIO01CREATED

        Label TRCK0107
        If Flt[10]=7,-1,TRCK0108
        Stream_Create 1,"radio\radio 01 - 07.mp3"
        GoTo RADIO01CREATED

        Label TRCK0108
        If Flt[10]=8,-1,TRCK0109
        Stream_Create 1,"radio\radio 01 - 08.mp3"
        GoTo RADIO01CREATED
       
        Label TRCK0109
        If Flt[10]=9,-1,RADIO01CREATED
        Stream_Create 1,"radio\radio 01 - 09.mp3"
        GoTo RADIO01CREATED

Label RADIO01CREATED
Stream_Fadevol 1,1,0,0
Stream_Play 1
If Flt[16]>0,REPLAY1,-1



Label RADIO02CREATE
Rnd 10,10
If Flt[13]=Flt[10],RADIO02CREATE,-1
Let Flt[13]=Flt[10]

        Label TRCK0200
        If Flt[10]=0,-1,TRCK0201
        Stream_Create 2,"radio\radio 02 - 00.mp3"
        GoTo RADIO02CREATED

        Label TRCK0201
        If Flt[10]=1,-1,TRCK0202
        Stream_Create 2,"radio\radio 02 - 01.mp3"
        GoTo RADIO02CREATED
       
        Label TRCK0202
        If Flt[10]=2,-1,TRCK0203
        Stream_Create 2,"radio\radio 02 - 02.mp3"
        GoTo RADIO02CREATED       
       
        Label TRCK0203
        If Flt[10]=3,-1,TRCK0204
        Stream_Create 2,"radio\radio 02 - 03.mp3"
        GoTo RADIO02CREATED       

        Label TRCK0204
        If Flt[10]=4,-1,TRCK0205
        Stream_Create 2,"radio\radio 02 - 04.mp3"
        GoTo RADIO02CREATED

        Label TRCK0205
        If Flt[10]=5,-1,TRCK0206
        Stream_Create 2,"radio\radio 02 - 05.mp3"
        GoTo RADIO02CREATED

        Label TRCK0206
        If Flt[10]=6,-1,TRCK0207
        Stream_Create 2,"radio\radio 02 - 06.mp3"
        GoTo RADIO02CREATED

        Label TRCK0207
        If Flt[10]=7,-1,TRCK0208
        Stream_Create 2,"radio\radio 02 - 07.mp3"
        GoTo RADIO02CREATED

        Label TRCK0208
        If Flt[10]=8,-1,TRCK0209
        Stream_Create 2,"radio\radio 02 - 08.mp3"
        GoTo RADIO02CREATED
       
        Label TRCK0209
        If Flt[10]=9,-1,RADIO02CREATED       
        Stream_Create 2,"radio\radio 02 - 09.mp3"
        GoTo RADIO02CREATED

Label RADIO02CREATED
Stream_Fadevol 2,1,0,0
Stream_Play 2
If Flt[17]>0,REPLAY2,-1



Label RADIO03CREATE
Rnd 10,10
If Flt[14]=Flt[10],RADIO03CREATE,-1
Let Flt[14]=Flt[10]

        Label TRCK0300
        If Flt[10]=0,-1,TRCK0301
        Stream_Create 3,"radio\radio 03 - 00.mp3"
        GoTo RADIO03CREATED

        Label TRCK0301
        If Flt[10]=1,-1,TRCK0302
        Stream_Create 3,"radio\radio 03 - 01.mp3"
        GoTo RADIO03CREATED
       
        Label TRCK0302
        If Flt[10]=2,-1,TRCK0303
        Stream_Create 3,"radio\radio 03 - 02.mp3"
        GoTo RADIO03CREATED       
       
        Label TRCK0303
        If Flt[10]=3,-1,TRCK0304
        Stream_Create 3,"radio\radio 03 - 03.mp3"
        GoTo RADIO03CREATED       

        Label TRCK0304
        If Flt[10]=4,-1,TRCK0305
        Stream_Create 3,"radio\radio 03 - 04.mp3"
        GoTo RADIO03CREATED

        Label TRCK0305
        If Flt[10]=5,-1,TRCK0306
        Stream_Create 3,"radio\radio 03 - 05.mp3"
        GoTo RADIO03CREATED

        Label TRCK0306
        If Flt[10]=6,-1,TRCK0307
        Stream_Create 3,"radio\radio 03 - 06.mp3"
        GoTo RADIO03CREATED

        Label TRCK0307
        If Flt[10]=7,-1,TRCK0308
        Stream_Create 3,"radio\radio 03 - 07.mp3"
        GoTo RADIO03CREATED

        Label TRCK0308
        If Flt[10]=8,-1,TRCK0309
        Stream_Create 3,"radio\radio 03 - 08.mp3"
        GoTo RADIO03CREATED
       
        Label TRCK0309
        If Flt[10]=9,-1,RADIO03CREATED       
        Stream_Create 3,"radio\radio 03 - 09.mp3"
        GoTo RADIO03CREATED

Label RADIO03CREATED
Stream_Fadevol 3,1,0,0
Stream_Play 3
If Flt[18]>0,REPLAY3,-1

Let Flt[6]=Flt[0]



CommandBlock 0
Label CHECK
CommandBlock 1
Human_GetProperty 0,7,Energy
If Flt[7]=0,DEATH,-1
GoTo POSITION
Label CHECK_IN_CAR
CommandBlock 0
Human_GetSeatIdx 0,7
If Flt[7]=-1,CAR_OUT,CAR_IN



Label CAR_IN
        Ctrl_Read 5,UP1
        If Flt[5]=0,-1,RADIO_UP
        Label READ_DOWN
        Ctrl_Read 5,DOWN1
        If Flt[5]=0,-1,RADIO_DOWN
Label CHECKPLAY
If Flt[4]=0,-,CHECK
CommandBlock 1
CityMusic_Off
If Flt[9]>-1,-1,RADIO_OFF
Stream_Fadevol 6,1,1,1
Label RADIO_OFF
Let Flt[4]=1
CommandBlock 0
Wait 1000
GoTo CHECK



Label CAR_OUT
If Flt[4]=1,-1,CHECK
Stream_Fadevol 6,1,0,0
CityMusic_On
Let Flt[4]=0
Wait 1000
GoTo CHECK



Label RADIO_UP
CommandBlock 1
Stream_Fadevol 6,1,0,0

        Label CHNGUPTO_1
        If Flt[9]=0,-1,CHNGUPTO_2
        Let Flt[6]=Flt[1]
        GoTo RADIOPLUS
       
        Label CHNGUPTO_2
        If Flt[9]=1,-1,CHNGUPTO_3
        Let Flt[6]=Flt[2]
        GoTo RADIOPLUS       

        Label CHNGUPTO_3
        If Flt[9]=2,-1,CHNGUPTO_0
        Let Flt[6]=Flt[3]
        GoTo RADIOPLUS
       
        Label CHNGUPTO_0
        If Flt[9]=3,-1,RADIOPLUS
        Let Flt[6]=Flt[0]
       
Label RADIOPLUS
Let Flt[9]=Flt[9]+1
If Flt[9]>3,-1,CHANGEDUP
Let Flt[9]=-1
GoTo RADIO_OFF_UP
Label CHANGEDUP
Stream_Fadevol 6,1,1,1
Label RADIO_OFF_UP
CommandBlock 0

Let Flt[7]=0
Label 3333
Ctrl_Read 5,UP1
If Flt[5]=1,-1,READ_DOWN
Wait 200
Let Flt[7]=Flt[7]+1
If Flt[7]<10,3333,-1
GoTo READ_DOWN



Label RADIO_DOWN
CommandBlock 1
Stream_Fadevol 6,1,0,0

        Label CHNGDWNTO_3
        If Flt[9]=-1,-1,CHNGDWNTO_2
        Let Flt[6]=Flt[3]
        GoTo RADIOMINUS

        Label CHNGDWNTO_2
        If Flt[9]=3,-1,CHNGDWNTO_1
        Let Flt[6]=Flt[2]
        GoTo RADIOMINUS

        Label CHNGDWNTO_1
        If Flt[9]=2,-1,CHNGDWNTO_0
        Let Flt[6]=Flt[1]
        GoTo RADIOMINUS
       
        Label CHNGDWNTO_0
        If Flt[9]=1,-1,RADIOMINUS
        Let Flt[6]=Flt[0]
       
Label RADIOMINUS
Let Flt[9]=Flt[9]-1
If Flt[9]=-1,RADIO_OFF_DOWN,-1
If Flt[9]<-1,-1,CHANGEDDOWN
Let Flt[9]=3
Label CHANGEDDOWN
Stream_Fadevol 6,1,1,1
Label RADIO_OFF_DOWN
CommandBlock 0

Let Flt[7]=0
Label 2222
Ctrl_Read 5,DOWN1
If Flt[5]=1,-1,CHECKPLAY
Wait 200
Let Flt[7]=Flt[7]+1
If Flt[7]<10,2222,-1
GoTo CHECKPLAY



Label POSITION
GetGameTime 7
Let Flt[10]=Flt[7]-Flt[8]
If Flt[10]<1000,CHECK_IN_CAR,-1
Let Flt[8]=Flt[7]

        Label GETPOS0
        Stream_GetPos 0,7
        If Flt[7]=Flt[15],RADIO0END,-1
        Let Flt[15]=Flt[7]
        GoTo GETPOS1
        Label RADIO0END
        Stream_Destroy 0
        GoTo RADIO00CREATE
        Label REPLAY0
        Let Flt[15]=-1
        If Flt[4]=0,GETPOS1,-1
        If Flt[9]=0,-1,GETPOS1
        Let Flt[6]=Flt[0]
        Stream_Fadevol 0,1,1,1

        Label GETPOS1
        Stream_GetPos 1,7
        If Flt[7]=Flt[16],RADIO1END,-1
        Let Flt[16]=Flt[7]
        GoTo GETPOS2
        Label RADIO1END
        Stream_Destroy 1
        GoTo RADIO01CREATE
        Label REPLAY1
        Let Flt[16]=-1
        If Flt[4]=0,GETPOS2,-1
        If Flt[9]=1,-1,GETPOS2
        Let Flt[6]=Flt[1]
        Stream_Fadevol 1,1,1,1

        Label GETPOS2
        Stream_GetPos 2,7
        If Flt[7]=Flt[17],RADIO2END,-1
        Let Flt[17]=Flt[7]
        GoTo GETPOS3
        Label RADIO2END
        Stream_Destroy 2
        GoTo RADIO02CREATE
        Label REPLAY2
        Let Flt[17]=-1
        If Flt[4]=0,GETPOS3,-1
        If Flt[9]=2,-1,GETPOS3
        Let Flt[6]=Flt[2]
        Stream_Fadevol 2,1,1,1

        Label GETPOS3
        Stream_GetPos 3,7
        If Flt[7]=Flt[18],RADIO3END,-1
        Let Flt[18]=Flt[7]
        GoTo CHECK_IN_CAR
        Label RADIO3END
        Stream_Destroy 3
        GoTo RADIO03CREATE
        Label REPLAY3
        Let Flt[18]=-1
        If Flt[4]=0,CHECK_IN_CAR,-1
        If Flt[9]=3,-1,CHECK_IN_CAR
        Let Flt[6]=Flt[3]
        Stream_Fadevol 3,1,1,1

GoTo CHECK_IN_CAR

Label DEATH
CommandBlock 1
Stream_Destroy 0
Stream_Destroy 1
Stream_Destroy 2
Stream_Destroy 3
CommandBlock 0

[свернуть]

Kaiser 09.10.2020 21:06

2 KlassenAS

Я немного запутался. Ты проверял скрипт с коммандоблоками или мне нужно протестировать?

KlassenAS 09.10.2020 21:26

Цитата:

Сообщение от Kaiser (Сообщение 12388)
Я немного запутался. Ты проверял скрипт с коммандоблоками или мне нужно протестировать?

В чём именно запутался?
Это не тот скрипт, что нужен для твоего мода, это другая версия.
Написанная с подачи Abradox.
Этот скрипт, что я сейчас выложил, я проверил вдоль и поперёк.
4 радиостанции по 10 треков на каждой, с рандомизацией. Работает хорошо, но из-за кривых особенностей игры после сохранения начинаются проблемы с непрошеным воспроизведением потоков, которые не удалось решить средствами скриптинга.
Если хочешь, - можешь попробовать этот скрипт в деле.
Не хочешь - так и не заморачивайся )

Я планировал сегодня исправить версию скрипта для твоего мода, но после тщетных попыток побороть ошибки в своей, "флагманской", версии, силы мои иссякли, увы.

Kaiser 09.10.2020 21:29

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

KlassenAS 09.10.2020 21:31

Цитата:

Сообщение от Kaiser (Сообщение 12392)
Так может тогда убрать из него функцию запоминания? Пусть тогда каждый раз сначала играет, коли команда несовершенна.

Теперь я запутался. Какое запоминание ты имеешь в виду?


Текущее время: 04:36. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.11 Release Candidate 2
Copyright ©2000 - 2025, vBulletin Solutions Inc. Перевод: zCarot