|
Цитата:
Сообщение от Firefox3860
А, тут даже специальные команды есть. Это точно стоит попробовать.
Ну и всё равно же этот стэк будет в оперативной памяти находиться.
|
Попробовал. Не помогло.
Кажется, я начинаю понимать, почему.
Похоже, что, когда загружается сохранение, и игра воссоздаёт сохранённые потоки, они получают новые идентификаторы.
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
[свернуть]
Последний раз редактировалось KlassenAS; 09.10.2020 в 23:02.
|