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)

Melhior 06.10.2020 01:44

Когда-то делалось для СССР мода. Правда не помню рабочий ли это вариант.
Скрипт рассчитан на 4 радиостанции. Но это не точно.

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

Код:

dim_act 3

dim_flt 14

findactor 0,"Tommy"

findactor 1,"NULL"

citymusic_off

let flt[9]=0 // toggle fade1

let flt[10]=0 // toggle fade2

let flt[11]=0 // toggle fade3

let flt[12]=-1 // last radio

let flt[13]=0 //toggle stopped radio

label NotInCar

commandblock 0

//stream_getpos 0,5

//stream_destroy 0

//stream_getpos 1,6

//stream_destroy 1

//stream_getpos 2,7

//stream_destroy 2

//findnearactor 0,2,Car

getactorsdist 0,2,8

freeride_scoreset flt[11]

if flt[8]<5,-1,vol1

if flt[10]=0,-1,subvol1

if flt[9]=0,-1,vol1

stream_fadevol 0,1000,1,0.5

stream_fadevol 1,1000,1,0.5

stream_fadevol 2,1000,1,0.5

let flt[9]=1

goto vol4

label subvol1

stream_fadevol 0,1000,0.25,0.5

stream_fadevol 1,1000,0.25,0.5

stream_fadevol 2,1000,0.25,0.5

let flt[10]=0

goto vol4

label vol1

if flt[8]<15,-1,vol2

if flt[8]>5,-1,vol2

if flt[11]=0,-1,subvol2

if flt[10]=0,-1,vol2

stream_fadevol 0,1000,0.5,0.25

stream_fadevol 1,1000,0.5,0.25

stream_fadevol 2,1000,0.5,0.25

let flt[10]=1

goto vol4

label subvol2

stream_fadevol 0,1000,0,0.25

stream_fadevol 1,1000,0,0.25

stream_fadevol 2,1000,0,0.25

let flt[11]=0

goto vol4

label vol2

if flt[8]<30,-1,vol4

if flt[8]>15,-1,vol4

if flt[11]=0,-1,vol4

stream_fadevol 0,1000,0.25,0.01

stream_fadevol 1,1000,0.25,0.01

stream_fadevol 2,1000,0.25,0.01

let flt[11]=1

goto vol4

label vol4

if flt[8]>50,-1,gb

if flt[13]=0,-1,gb

stream_getpos 0,5

stream_destroy 0

stream_getpos 1,6

stream_destroy 1

stream_getpos 2,7

stream_destroy 2

let flt[13]=1

label gb

if flt[8]<50,-1,gb1

if flt[13]=1,-1,gb1

if flt[12]=0,-1,rad1

stream_create 0,"sounds/MUSIC/opr04KOJ.mp3"

stream_setloop 0, 1000

stream_setpos 0,5

stream_play 0

stream_fadevol 0,1,0.01,0.01

let flt[13]=0

label rad1

if flt[12]=1,-1,rad2

stream_create 1,"sounds/MUSIC/opr04UR3.mp3"

stream_setloop 1, 1000

stream_setpos 1,6

stream_play 1

stream_fadevol 1,1,0.01,0.01

let flt[13]=0

label rad2

if flt[12]=2,-1,gb1

stream_create 2,"sounds/MUSIC/opr04FYZ.mp3"

stream_setloop 2, 1000

stream_setpos 2,7

stream_play 2

stream_fadevol 2,1,0.01,0.01

let flt[13]=0

label gb1

compareownerwithex 0,1,NotInCar,-1

human_getowner 0,2

let flt[9]=0

let flt[10]=0

let flt[11]=0

if flt[12]=-1,-1,manualselect

stream_getpos 0,5

stream_destroy 0

stream_getpos 1,6

stream_destroy 1

stream_getpos 2,7

stream_destroy 2

rnd 4,3

if flt[4]=0,PreMusic1,-1

if flt[4]=1,PreMusic2,-1

if flt[4]=2,PreMusic3,-1

goto NoRadio

label manualselect

if flt[12]=0,Music1,-1

if flt[12]=1,Music2,-1

if flt[12]=2,Music3,-1

label NoRadio

commandblock 0

commandblock 1

let flt[12]=-1

compareownerwithex 0,1,NotInCar,-1

ctrl_read 3,FIRE1

if flt[3]>0,-1,NoRadio

label PreMusic1

console_addtext 99970011

stream_create 0,"sounds/MUSIC/opr04KOJ.mp3"

stream_setloop 0, 1000

stream_setpos 0,5

stream_play 0

let flt[12]=0

commandblock 0

wait 100

label Music1

commandblock 0

commandblock 1

stream_fadevol 0,1,1,1

compareownerwithex 0,1,NotInCar,-1

ctrl_read 3,FIRE1

if flt[3]>0,-1,Music1

stream_getpos 0,5

stream_destroy 0

label PreMusic2

console_addtext 99970012

stream_create 1,"sounds/MUSIC/opr04UR3.mp3"

stream_setloop 1, 1000

stream_setpos 1,6

stream_play 1

let flt[12]=1

commandblock 0

wait 100

label Music2

commandblock 0

commandblock 1

stream_fadevol 1,1,1,1

compareownerwithex 0,1,NotInCar,-1

ctrl_read 3,FIRE1

if flt[3]>0,-1,Music2

stream_getpos 1,6

stream_destroy 1

label PreMusic3

console_addtext 99970013

stream_create 2,"sounds/MUSIC/opr04FYZ.mp3"

stream_setloop 2, 1000

stream_setpos 2,7

stream_play 2

let flt[12]=2

commandblock 0

wait 100

label Music3

commandblock 0

commandblock 1

stream_fadevol 2,1,1,1

compareownerwithex 0,1,NotInCar,-1

ctrl_read 3,FIRE1

if flt[3]>0,-1,Music3

stream_getpos 2,7

stream_destroy 2

console_addtext 99970014

commandblock 0

wait 100

goto NoRadio

[свернуть]

KlassenAS 06.10.2020 06:52

Цитата:

Сообщение от Abradox (Сообщение 12266)
это хорошо, но почему .ogg ? Можно сделать чтобы любые аудио-файлы в этой папке воспроизводились .mp3 .wav?

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

еще надо исключить работу скрипта в главном меню.

С ogg как-то само получилось )
Просто такой формат был в исходном скрипте, от которого я отталкивался, и я, в первую очередь, думал над тем, чтобы всё правильно работало, не до форматов было.
Надо глянуть, по-моему для city bars +, когда делал пианисту скрипт с заказом музыки, использовал mp3.
Но, кажется, игра понимала файлы не с любым битрейтом, были нюансы. А ogg в скрипте заиграл без вопросов.

Да, выбор трека можно рандомизировать.
Но учти, что все имена файлов прописываются в скрипте. Поэтому желательно знать, сколько треков будет, и дать им универсальные имена, типа radio01, radio02, radio ga-ga, radio goo-goo

Работа скрипта в главном меню исключена.
За этим следит та часть кода, которую дал GOLOD55

Цитата:

Сообщение от Melhior (Сообщение 12271)
Когда-то делалось для СССР мода. Правда не помню рабочий ли это вариант.
Скрипт рассчитан на 4 радиостанции. Но это не точно.

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

Код:

dim_act 3

dim_flt 14

findactor 0,"Tommy"

findactor 1,"NULL"

citymusic_off

let flt[9]=0 // toggle fade1

let flt[10]=0 // toggle fade2

let flt[11]=0 // toggle fade3

let flt[12]=-1 // last radio

let flt[13]=0 //toggle stopped radio

label NotInCar

commandblock 0

//stream_getpos 0,5

//stream_destroy 0

//stream_getpos 1,6

//stream_destroy 1

//stream_getpos 2,7

//stream_destroy 2

//findnearactor 0,2,Car

getactorsdist 0,2,8

freeride_scoreset flt[11]

if flt[8]<5,-1,vol1

if flt[10]=0,-1,subvol1

if flt[9]=0,-1,vol1

stream_fadevol 0,1000,1,0.5

stream_fadevol 1,1000,1,0.5

stream_fadevol 2,1000,1,0.5

let flt[9]=1

goto vol4

label subvol1

stream_fadevol 0,1000,0.25,0.5

stream_fadevol 1,1000,0.25,0.5

stream_fadevol 2,1000,0.25,0.5

let flt[10]=0

goto vol4

label vol1

if flt[8]<15,-1,vol2

if flt[8]>5,-1,vol2

if flt[11]=0,-1,subvol2

if flt[10]=0,-1,vol2

stream_fadevol 0,1000,0.5,0.25

stream_fadevol 1,1000,0.5,0.25

stream_fadevol 2,1000,0.5,0.25

let flt[10]=1

goto vol4

label subvol2

stream_fadevol 0,1000,0,0.25

stream_fadevol 1,1000,0,0.25

stream_fadevol 2,1000,0,0.25

let flt[11]=0

goto vol4

label vol2

if flt[8]<30,-1,vol4

if flt[8]>15,-1,vol4

if flt[11]=0,-1,vol4

stream_fadevol 0,1000,0.25,0.01

stream_fadevol 1,1000,0.25,0.01

stream_fadevol 2,1000,0.25,0.01

let flt[11]=1

goto vol4

label vol4

if flt[8]>50,-1,gb

if flt[13]=0,-1,gb

stream_getpos 0,5

stream_destroy 0

stream_getpos 1,6

stream_destroy 1

stream_getpos 2,7

stream_destroy 2

let flt[13]=1

label gb

if flt[8]<50,-1,gb1

if flt[13]=1,-1,gb1

if flt[12]=0,-1,rad1

stream_create 0,"sounds/MUSIC/opr04KOJ.mp3"

stream_setloop 0, 1000

stream_setpos 0,5

stream_play 0

stream_fadevol 0,1,0.01,0.01

let flt[13]=0

label rad1

if flt[12]=1,-1,rad2

stream_create 1,"sounds/MUSIC/opr04UR3.mp3"

stream_setloop 1, 1000

stream_setpos 1,6

stream_play 1

stream_fadevol 1,1,0.01,0.01

let flt[13]=0

label rad2

if flt[12]=2,-1,gb1

stream_create 2,"sounds/MUSIC/opr04FYZ.mp3"

stream_setloop 2, 1000

stream_setpos 2,7

stream_play 2

stream_fadevol 2,1,0.01,0.01

let flt[13]=0

label gb1

compareownerwithex 0,1,NotInCar,-1

human_getowner 0,2

let flt[9]=0

let flt[10]=0

let flt[11]=0

if flt[12]=-1,-1,manualselect

stream_getpos 0,5

stream_destroy 0

stream_getpos 1,6

stream_destroy 1

stream_getpos 2,7

stream_destroy 2

rnd 4,3

if flt[4]=0,PreMusic1,-1

if flt[4]=1,PreMusic2,-1

if flt[4]=2,PreMusic3,-1

goto NoRadio

label manualselect

if flt[12]=0,Music1,-1

if flt[12]=1,Music2,-1

if flt[12]=2,Music3,-1

label NoRadio

commandblock 0

commandblock 1

let flt[12]=-1

compareownerwithex 0,1,NotInCar,-1

ctrl_read 3,FIRE1

if flt[3]>0,-1,NoRadio

label PreMusic1

console_addtext 99970011

stream_create 0,"sounds/MUSIC/opr04KOJ.mp3"

stream_setloop 0, 1000

stream_setpos 0,5

stream_play 0

let flt[12]=0

commandblock 0

wait 100

label Music1

commandblock 0

commandblock 1

stream_fadevol 0,1,1,1

compareownerwithex 0,1,NotInCar,-1

ctrl_read 3,FIRE1

if flt[3]>0,-1,Music1

stream_getpos 0,5

stream_destroy 0

label PreMusic2

console_addtext 99970012

stream_create 1,"sounds/MUSIC/opr04UR3.mp3"

stream_setloop 1, 1000

stream_setpos 1,6

stream_play 1

let flt[12]=1

commandblock 0

wait 100

label Music2

commandblock 0

commandblock 1

stream_fadevol 1,1,1,1

compareownerwithex 0,1,NotInCar,-1

ctrl_read 3,FIRE1

if flt[3]>0,-1,Music2

stream_getpos 1,6

stream_destroy 1

label PreMusic3

console_addtext 99970013

stream_create 2,"sounds/MUSIC/opr04FYZ.mp3"

stream_setloop 2, 1000

stream_setpos 2,7

stream_play 2

let flt[12]=2

commandblock 0

wait 100

label Music3

commandblock 0

commandblock 1

stream_fadevol 2,1,1,1

compareownerwithex 0,1,NotInCar,-1

ctrl_read 3,FIRE1

if flt[3]>0,-1,Music3

stream_getpos 2,7

stream_destroy 2

console_addtext 99970014

commandblock 0

wait 100

goto NoRadio

[свернуть]

О!, Спасибо, вечером я в нём покопаюсь.
Интересно, реализован здесь выбор радиостанции через выбор трека, в одном аудиопотоке, или через несколько параллельных потоков.
По идее, идеально будет сделать несколько параллельных аудиопотоков для радиостанций, с несколькими рандомизированными треками для каждой.
И надо будет выбор радиостанции к клавишам привязать.
Насколько я помню, пять лет назад приходилось довольствоваться только клавишами из тех, что в настройках дополнительного управления.
Сейчас появилось средство считывать в скрипте нажатие любой клавиши, или всё как раньше?

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

UPD: Глянул, в SityBars+ я использовал вообще wav. B исключительно 22Khz, потому, что 44,1 или 48 KHz игра не воспроизводила. Почему я тогда не использовал mp3 - честно, хз. Но это не критично, с форматами можно и потом поиграться.
Сейчас главное алгоритм отладить, чтоб скрипт работал точно, как швейцарские часы.

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

GOLOD55 06.10.2020 15:10

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

KlassenAS 06.10.2020 15:36

Цитата:

Сообщение от GOLOD55 (Сообщение 12282)
имейте в виду, что аудио_потоки запрошенные грузятся в память и занимают ее.
если счет пойдет на гигабайты то мб проблема.

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

Abradox
1 На какие клавиши будем назначать переключение радиостанций?
Я прям сейчас занимаюсь реализацией этого дела.
Предлагаю на W и S, при настройке управления по умолчанию. Т. е. Эти клавиши назначены как дополнительные при управлении персонажем.
2 Сколько радиостанций у нас будет?

Firefox3860 06.10.2020 16:18

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

GOLOD55 06.10.2020 18:13

Полагаю, стрим делетается из памяти при его дестрое.
Мда, команду для хнопичек че-то мы упустили из виду с Асмом в mse сделать.

Abradox 06.10.2020 19:46

W и S не надо! Нужно что-то типа F3 и F4

KlassenAS 06.10.2020 20:36

Вложений: 2
Цитата:

Сообщение от Abradox (Сообщение 12290)
W и S не надо! Нужно что-то типа F3 и F4

Ну, если в настройках игры назначишь F3 и F4 в качестве дополнительных, для управления персонажем, то будут тебе F3 и F4.
Повторюсь: если в настройках игры клавиша не назначена ни на одну из функций, то скрипты её не видят.
Я использовал дополнительные вперёд и назад. При управлении машиной они не используются. У меня им соответствуют W и S. А у тебя может быть что угодно.

Цитата:

Сообщение от GOLOD55 (Сообщение 12289)
Полагаю, стрим делетается из памяти при его дестрое

Да, всё верно. Я проверил. Переменная, используемая в команде Stream_Create 1, не указывает команде, с каким идентификатором надо делать поток, а лишь хранит идентификатор этого потока. То есть, если мы два раза подряд напишем в скрипте:
Stream_Create 1
Stream_Create 1
То будет создан новый поток, его идентификатор сохранится в переменной, и идентификатор предыдущего потока мы потеряем, а сам поток в памяти останется.
Так что, если мы хотим один поток поменять на другой, старый поток дестроить надо обязательно.

Так же я выяснил, что если создать подряд несколько потоков, то их номера будут просто идти друг за другом, например, 132, 133, 134. Следовательно, мы можем через одну и ту же переменную отдавать команды разным потокам, меняя её значение. Для этого понадобятся ещё две, в которых мы запомним номера первого и последнего потока.

Благодаря этому у меня получилось сделать скрипт, легко изменяемый под любое количество потоков-радиостанций.
Пока переключение оставил W и S, при настройках, как на скринах.
Поменять можно и потом, в любой момент.
Неактивные "радиостанции" пока находятся просто на паузе. Потом их можно будет мютить, убирая громкость.
Так же, пока что, одной радиостанции соответствует один аудиофайл.

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

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

Затестил его, вроде работает без сбоев.
Собственно, сам скрипт:

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

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

Let Flt[0]=0 //логика
Let Flt[1]=0 //поток 00
Let Flt[2]=-1 //сиденье
Let Flt[3]=0 //ещё пригодится )
Let Flt[4]=0 //ещё пригодится )
Let Flt[5]=0 //Нажатие клавиши вперёд 1
Let Flt[6]=0 //Запоминаем последний поток
Let Flt[7]=0 //Запоминаем первый поток
Let Flt[8]=0 //ещё пригодится )
Let Flt[9]=0 //номер радиостанции 0-3

CommandBlock 1
Stream_Create 1,"radio\radio00.ogg"
Let Flt[7]=Flt[1]
Stream_Create 1,"radio\radio01.ogg"
Stream_Create 1,"radio\radio02.ogg"
Stream_Create 1,"radio\radio03.ogg"
Let Flt[6]=Flt[1]
Let Flt[1]=Flt[1]-3
CommandBlock 0

Label CHECK
CommandBlock 0
Wait 350
Human_GetSeatIdx 0,2
If Flt[2]=-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
CommandBlock 1
If Flt[0]=0,-,CHECK
CityMusic_Off
Stream_Play 1
Let Flt[0]=1
CommandBlock 0
Wait 500
GoTo CHECK

Label CAR_OUT
CommandBlock 1
If Flt[0]=1,-,CHECK
Stream_Pause 1
CityMusic_On
Let Flt[0]=0
CommandBlock 0
Wait 500
GoTo CHECK

Label RADIO_UP
CommandBlock 1
Let Flt[5]=0
Stream_Pause 1
Let Flt[1]=Flt[1]+1
If Flt[1]>Flt[6],-1,CHANGEDUP
Let Flt[1]=Flt[1]-4
Label CHANGEDUP
Stream_Play 1
CommandBlock 0
GoTo READ_DOWN

Label RADIO_DOWN
CommandBlock 1
Let Flt[5]=0
Stream_Pause 1
Let Flt[1]=Flt[1]-1
If Flt[1]<Flt[7],-1,CHANGEDDOWN
Let Flt[1]=Flt[1]+4
Label CHANGEDDOWN
Stream_Play 1
CommandBlock 0
GoTo CHECKPLAY
[свернуть]

Тестим, находим баги, ругаемся на меня матом )
Позже проверю, любой ли mp3 может быть воспроизведён игрой.

UPD: Проверил, действительно, воспроизводит любой mp3, независимо от битрейта и частоты дискретизации. Так что я теперь хз, почему пять лет назад использовал wav. Наверное, потому, что тогда знал меньше )

grandshot 06.10.2020 21:25

Цитата:

Сообщение от KlassenAS (Сообщение 12292)
При управлении машиной они не используются. У меня им соответствуют W и S. А у тебя может быть что угодно.

Они используются при игре с контроллером, если на них назначить курки. Лучше назначить переключение на доп. клавишу Run \ Walk, тогда точно не будет коллизий.

KlassenAS 06.10.2020 21:52

Цитата:

Сообщение от grandshot (Сообщение 12294)
Они используются при игре с контроллером, если на них назначить курки. Лучше назначить переключение на доп. клавишу Run \ Walk, тогда точно не будет коллизий.

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

Почему-то вдруг появился баг с непрошеным воспроизведением потоков при нажатии ESC, о котором упоминал GOLOD55.
Видать, придётся, всё-таки, мютить потоки, убирая громкость, а не ставить на паузу.
Щас попробую, посмотрю, что из этого выйдет.

Firefox3860 06.10.2020 21:57

KlassenAS, Работает. А зачем в 32 строке задержка 350 мс? Можно ведь её вообще не делать, и тогда не надо будет долго держать кнопку переключения.
Mp3 читает все, вплоть до 320 кб/с, так что можно сразу на них переписать.

Один раз включились сразу все потоки после esc. Но чаще всего не включаются. Непонятно, от чего зависит. Может, при использовании mut'а такого не будет.

Ты, кстати, в чём со скриптом работаешь? У меня вот есть такая поддержка синтаксиса для Notepad++

https://mafia-game.ru/forum/imgcache...jpjuuv5umm.jpg

Цитата:

Сообщение от grandshot (Сообщение 12294)
Лучше назначить переключение на доп. клавишу Run \ Walk

А чего вам crouch1 и jump1 не нравятся?? На w и s некоторые ездят, так что они как раз используются в машине.

Ну и ещё, конечно, надо добавить отключение всех станций.

KlassenAS 06.10.2020 22:13

Цитата:

Сообщение от Firefox3860 (Сообщение 12296)
KlassenAS, А зачем в 32 строке задержка 350 мс? Можно ведь её вообще не делать, и тогда не надо будет долго держать кнопку переключения.

Тогда есть риск двойного срабатывания, а при удержании радиостанции переключаются слишком быстро.
Я вообще сейчас 500 сделал.
Хотя, можно поставить задержку не в цикле считывания, а в процедуре обработки нажатия. Тогда срабатывать будет сразу, и циклическое переключение при удержании будет работать.
Спасибо, на правильную мысль навёл меня )

Цитата:

Сообщение от Firefox3860 (Сообщение 12296)
KlassenAS, Mp3 читает все, вплоть до 320 кб/с, так что можно сразу на них переписать.

Уже.

Цитата:

Сообщение от Firefox3860 (Сообщение 12296)
KlassenAS, Один раз включились сразу все потоки после esc. Но чаще всего не включаются. Непонятно, от чего зависит. Может, при использовании mut'а такого не будет.

Уже сделал, с мютом такого нет, т. е., непрошеное воспроизведение включается, но его всё равно не слышно )

Цитата:

Сообщение от Firefox3860 (Сообщение 12296)
KlassenAS, Ты, кстати, в чём со скриптом работаешь? У меня вот есть такая поддержка синтаксиса для Notepad++

В нём и работаю. Но с подсветкой синтаксиса не пробовал. Кодим по хардкору )
Хорошо хоть, не на ассемблере :D
Как выделение цветом замутить?

Цитата:

Сообщение от Firefox3860 (Сообщение 12296)
KlassenAS, А чего вам crouch1 и jump1 не нравятся?? На w и s некоторые ездят, так что они как раз используются в машине.

Да это, в принципе, дело вкуса. Так-то на любую функцию можно любую клавишу назначить, и тогда что угодно пересечётся )

UPD:
Внёс необходимые изменения с задержками и замютиванием потоков:

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

Код:

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

Let Flt[0]=0 //логика
Let Flt[1]=0 //поток 00
Let Flt[2]=-1 //сиденье
Let Flt[3]=0  //прошлая длительность потока
Let Flt[4]=0 // текущая длительность потока
Let Flt[5]=0 //Нажатие клавиши вперёд 1
Let Flt[6]=0 //Запоминаем последний поток
Let Flt[7]=0 //Запоминаем первый поток
Let Flt[8]=0 //ещё пригодится )
Let Flt[9]=0 //номер радиостанции 0-3

CommandBlock 1
Stream_Create 1,"radio\radio00.mp3"
Stream_Fadevol 1,1,0,0
Let Flt[7]=Flt[1]
Stream_Create 1,"radio\radio01.mp3"
Stream_Fadevol 1,1,0,0
Stream_Create 1,"radio\radio02.mp3"
Stream_Fadevol 1,1,0,0
Stream_Create 1,"radio\radio03.mp3"
Stream_Fadevol 1,1,0,0
Let Flt[6]=Flt[1]
Let Flt[1]=Flt[1]-3
CommandBlock 0

Label CHECK
CommandBlock 0
Human_GetSeatIdx 0,2
If Flt[2]=-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
CommandBlock 1
If Flt[0]=0,-,CHECK
CityMusic_Off
Stream_Play 1
Stream_Fadevol 1,1,1,1
Let Flt[0]=1
CommandBlock 0
GoTo CHECK

Label CAR_OUT
CommandBlock 1
If Flt[0]=1,-,CHECK
Stream_Pause 1
Stream_Fadevol 1,1,0,0
CityMusic_On
Let Flt[0]=0
CommandBlock 0
GoTo CHECK

Label RADIO_UP
CommandBlock 1
        Let Flt[5]=0
        Stream_Pause 1
        Stream_Fadevol 1,1,0,0
        Let Flt[1]=Flt[1]+1
        If Flt[1]>Flt[6],-1,CHANGEDUP
        Let Flt[1]=Flt[1]-4
Label CHANGEDUP
Stream_Play 1
Stream_Fadevol 1,1,1,1
CommandBlock 0
Wait 1000
GoTo READ_DOWN

Label RADIO_DOWN
CommandBlock 1
        Let Flt[5]=0
        Stream_Pause 1
        Stream_Fadevol 1,1,0,0
        Let Flt[1]=Flt[1]-1
        If Flt[1]<Flt[7],-1,CHANGEDDOWN
        Let Flt[1]=Flt[1]+4
Label CHANGEDDOWN
Stream_Play 1
Stream_Fadevol 1,1,1,1
CommandBlock 0
Wait 1000
GoTo CHECKPLAY

[свернуть]

Теперь надо сделать на каждую радиостанцию несколько треков с рандомизированным порядком воспроизведения.
Но этим я завтра займусь, хватит с меня на сегодня программирования )

Firefox3860 06.10.2020 22:29

Цитата:

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

Ну на практике этого не происходит. Так всегда делают.

Цитата:

Сообщение от KlassenAS (Сообщение 12297)
В нём и работаю. Но с подсветкой синтаксиса не пробовал. Кодим по хардкору ) Хорошо хоть, не на ассемблере Как выделение цветом замутить?

хехе, да уж, ассемблер зло :D Вот файл, описывающий синтаксис https://dropmefiles.com/dG7kR
В программе выбери Снтаксисы - задать свой - импортировать.

Я ещё обычно для дебага скриптов ставлю в нужных местах команды console_addtext, чтобы видно было, когда стрим включается, когда выключается. Например, console_addtext 100.

А хошь ещё прикол? ;) Напиши вместо какого-нибудь потока, например: stream_create 1,"http://airtime.joyradio.cc:8000/airtime_192.mp3"
(В начале игры будет небольшая прогрузка)

Цитата:

Мда, команду для хнопичек че-то мы упустили из виду с Асмом в mse сделать.
А можно ли исправить это упущение? ;)

KlassenAS 06.10.2020 22:32

Цитата:

Сообщение от Firefox3860 (Сообщение 12299)
Вот файл, описывающий синтаксис https://dropmefiles.com/dG7kR
В программе выбери Снтаксисы - задать свой - импортировать.

Я ещё обычно для дебага скриптов ставлю в нужных местах команды console_addtext, чтобы видно было, когда стрим включается, когда выключается. Например, console_addtext 100.

А хошь ещё прикол? ;) Напиши вместо какого-нибудь потока, например: stream_create 1,"http://airtime.joyradio.cc:8000/airtime_192.mp3"
(В начале игры будет небольшая прогрузка)

Спасибо, завтра со всем этим побалуюсь )

Kaiser 06.10.2020 23:04

Цитата:

Я ещё обычно для дебага скриптов ставлю в нужных местах команды console_addtext, чтобы видно было, когда стрим включается, когда выключается. Например, console_addtext 100.
Кстати идея)):rus:

GOLOD55 06.10.2020 23:29

Цитата:

Сообщение от Firefox3860 (Сообщение 12299)
А можно ли исправить это упущение?

мм я когда-то, "мимо пробегая", наткнулся на блок памяти-хнопичный_буфер(или шо-то типа того), помому даже ассемлил хнопичку для дебуга. уж ни нипомню, давно было.
новой версии mse пока нету даж в планах, тут надо ж именно нам новую скрипт_команду, а вставлять новые команды только Асм умеет(я лишь могу пошариться в памяти и написать тело команды).
хотя..наверняка есть вариант замутить не новую команду, а модифицировать старую: кстати напр ctrl_readex команда у нас не юзается(а мб она и читает все хнопки, но заинактивена чехами)...

KlassenAS 07.10.2020 11:41

Цитата:

Сообщение от Firefox3860 (Сообщение 12299)
Вот файл, описывающий синтаксис
В программе выбери Снтаксисы - задать свой - импортировать.

С настройками синтаксиса разобрался, спасибо так намного удобнее!
Цитата:

Сообщение от Firefox3860 (Сообщение 12299)
Напиши вместо какого-нибудь потока, например: stream_create 1,"http://airtime.joyradio.cc:8000/airtime_192.mp3"
(В начале игры будет небольшая прогрузка)

Я правильно понял, это ссылка на аудиопоток реального интернет-радио?
Вообще, круто, что таким нехитрым образом, можно интегрировать в игру реальные радиостанции!

Firefox3860 07.10.2020 13:43

Цитата:

Сообщение от KlassenAS (Сообщение 12304)
С настройками синтаксиса разобрался, спасибо так намного удобнее!

:yep:
Цитата:

Сообщение от KlassenAS (Сообщение 12304)
Я правильно понял, это ссылка на аудиопоток реального интернет-радио?
Вообще, круто, что таким нехитрым образом, можно интегрировать в игру реальные радиостанции!

да! Несколько лет назад ещё на другом форуме эту фичу обнаружили, я тогда тоже офигел и не встал от того, что мафия может лезть в интернет и воспроизводить оттуда поток. Получается настоящее радио, в полном смысле слова :)

KlassenAS 07.10.2020 17:25

GOLOD55, Скажи, пожалуйста, размер скрипта script.sc, который может использовать твой патчер, как-нибудь ограничен?
Я сейчас делаю код, чтобы в каждом потоке могли рандомно меняться 10 треков, скрипт получается очень большой. Где-то после 220-ой строки команды просто не выполняются, как будто эта часть скрипта отрезана.
Если скрипт не сможет работать с твоим патчем, мне придётся его в сцену вставлять, там ограничений нет. Но это и неудобно в работе.

UPD: В scene2.bin такая же ошибка. Стало быть, проблема не в размере скрипта.
Буду думать.
Похоже, с условными переходами что-то не то набарагозил...

GOLOD55 07.10.2020 19:35

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

Abradox 08.10.2020 00:00

У вас тут большой прогресс по скриптам, это замечательно.

KlassenAS 08.10.2020 17:43

Цитата:

Сообщение от Abradox (Сообщение 12311)
У вас тут большой прогресс по скриптам, это замечательно.

У меня сейчас четыре потока-"радиостанции", на каждом рандомно стартует один из десяти треков. (40 треков в сумме)
При переключении треки не паузятся, а мютятся.
Баги исправил.
Сейчас осталось разобраться с отслеживанием окончания трека в каждом потоке, для рандомного перезапуска.

В итоге планирую опубликовать три версии скрипта:
1) Самый простой - четыре радиостанции, без отслеживания окончания трека и перезапуска. Удобен, если мы хотим вместо mp3 файлов подсунуть игре ссылку на поток реального интернет-радио.
2) С отслеживанием окончания и перезапуском трека. Но. Одна радиостанция - один трек. Это хорошо, если у пользователя трёхчасовая аудиозапись с "радиоэфиром".
3) Самый сложный - описал выще. Это вообще треш ) Я вчера офонарел, пока баги фиксил. Мне даже ночью снилось, что сдаю экзамен на квантового физика, и отвечаю на попросы про дискретизацию, корпускулярно-волновой дуализм и суперпозицию :D

Firefox3860 08.10.2020 17:55

Цитата:

Сообщение от KlassenAS (Сообщение 12337)
Я вчера офонарел, пока баги фиксил. Мне даже ночью снилось, что сдаю экзамен на квантового физика, и отвечаю на попросы про дискретизацию, корпускулярно-волновой дуализм и суперпозицию :D

Жесть, знаю, как это бывает :D А может тогда хотя бы в простую версию добавить отключение радио на место 5-ой радиостанции?
А почему решили, что должно быть именно 4 станции?

KlassenAS 08.10.2020 18:09

Вложений: 1
Цитата:

Сообщение от Firefox3860 (Сообщение 12339)
Жесть, знаю, как это бывает :D А может тогда хотя бы в простую версию добавить отключение радио на место 5-ой радиостанции?
А почему решили, что должно быть именно 4 станции?

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

А вот так выглядит плейлист моих "радиостанций":

Firefox3860 08.10.2020 18:26

Цитата:

Сообщение от KlassenAS (Сообщение 12342)
А вот, если радио отключать, то как лучше сделать, чтобы совсем тишина была, или чтобы дефолтная городская музыка играла?
Можно так и так. Тишину, конечно, сделать проще.

Мне кажется, можно сделать как abradox сказал - кинуть всю оригинальную ситимузыку на одну из станций.
Цитата:

Сообщение от KlassenAS (Сообщение 12342)
А вот так выглядит плейлист моих "радиостанций":

Музыка настоящей мафии :D :rock:

KlassenAS 08.10.2020 18:33

Цитата:

Сообщение от Firefox3860 (Сообщение 12343)
Мне кажется, можно сделать как abradox сказал - кинуть всю оригинальную ситимузыку на одну из станций.

А, ну да )
Тогда это уже забота того, кто составляет плейлист - первые три накидать кастомные, четвёртую с оригинальной музыкой, и пятым пунктом - гробовая тишина )
И можно добавить проверку, если Томми садится в катафалк - включается третья часть сонаты №2 Шопена )
Тогда решено - пятый пункт - выкл. и тишина.
Цитата:

Сообщение от Firefox3860 (Сообщение 12343)
Музыка настоящей мафии :D :rock:

Особенно трек 03-09 )

Firefox3860 08.10.2020 18:38

Цитата:

Сообщение от KlassenAS (Сообщение 12344)
Тогда это уже забота того, кто составляет плейлист - первые три накидать кастомные, четвёртую с оригинальной музыкой

А может, чтобы их не кидать... Ведь ситимузыка уже есть в файлах. Задать для одной из станций пути к файлам как sounds/music/city_music_xx.ogg.
И даже если ничего не положить в radio, останется ориг. музыка :)

KlassenAS 08.10.2020 18:42

Цитата:

Сообщение от Firefox3860 (Сообщение 12345)
А может, чтобы их не кидать... Ведь ситимузыка уже есть в файлах. Задать для одной из станций пути к файлам как sounds/music/city_music_xx.ogg.

Это если данные файлы у пользователя распакованы. А если нет?
Я просто не знаю, как это работает в самой игре.

Firefox3860 08.10.2020 18:43

Цитата:

Сообщение от KlassenAS (Сообщение 12346)
Это если данные файлы у пользователя распакованы. А если нет? Я просто не знаю, как это работает в самой игре.

Нет, без распаковки вплоне работает, в ориг. скриптах ведь так и сделано :)

KlassenAS 08.10.2020 18:50

Цитата:

Сообщение от Firefox3860 (Сообщение 12347)
Нет, без распаковки вплоне работает, в ориг. скриптах ведь так и сделано :)

А, ну тогда норм. А список имён файлов где посмотреть можно?

Firefox3860 08.10.2020 18:58

Цитата:

Сообщение от KlassenAS (Сообщение 12348)
А список имён файлов где посмотреть можно?

Обычно смотрится прямо по распаковке архива :) Отдельно music можно распаковать.

Kaiser 08.10.2020 22:48

2 KlassenAS

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

KlassenAS 08.10.2020 22:58

Цитата:

Сообщение от Kaiser (Сообщение 12352)
2 KlassenAS

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

Да, я уже знаю об этой ошибке.
Так происходит, когда поток зациклен командой Stream_SetLoop.
Я уже сообразил, как реализовать повтор обходным путём.
Завтра скину исправленный скрипт.

Firefox3860 09.10.2020 10:04

Вот и распаковка музыки подоспела → https://mafia-game.ru/forum/showpost...&postcount=169

Файл с музыкой радио: \Mafia Definitive Edition\edit\audio\packages\radio_global.pck

KlassenAS 09.10.2020 13:34

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

Далее, почему после загрузки играет музон.
А фишка в том, что игра помнит все работающие аудио-потоки, и из каких файлов они созданы.
Поэтому, при загрузке из сохранения, игра вспоминает, что был поток, из такого-то файла сделанный, и восстанавливает.

Теперь способ, как эти мафиозные выкрутасы побороть:
Игра помнит не только сам поток, но и состояние всех переменных на момент сохранения. И в этих переменных лежат идентификаторы аудиопотоков.
Следовательно, чтобы багов с непрошенным воспроизведением не возникало, надо в самом начале скрипта, ещё до объявления переменных, эти потоки отдестроить.

CommandBlock 1
Stream_Destroy 0
Stream_Destroy 1
Stream_Destroy 2
Stream_Destroy 3
CommandBlock 0

А уже потом пускать весь основной скрипт.
Если мы используем в скрипте "шапочку" от GOLOD55, чтобы внешний скрипт не работал в меню, то этот дестрой можно и до, и после "шапочки" продублировать. На всякий случай.

Ещё полезно отслеживать состояние здоровья персонажа и дестроить потоки, если Томми склеил ласты.

И вот при таком способе "зачистки" потоков я пока багов не заметил. Но это не точно. Может, потом ещё найдутся.

P.S. Предлагаю, сообщения из этой темы, начиная с №26 перенести в отдельную тему и назвать её "Скрипт авто-радио" или как-то иначе, на усмотрение администрации.

UPD: Написанному не верить. Более тщательная проверка показала, что ни шиша из этого не работает, как ожидалось.

Abradox 09.10.2020 14:03

Список музыки оригинальной Мафии.

папка Mafia/sounds/music (В стимовской и гоговской версиях эти треки отсутствуют.)
city_music_01.ogg
city_music_02.ogg
city_music_03.ogg
city_music_04.ogg
city_music_05.ogg
city_music_06.ogg
city_music_07.ogg
city_music_08.ogg
city_music_09.ogg
city_music_10.ogg
city_music_11.ogg
city_music_12.ogg
city_music_13.ogg
city_music_14.ogg
city_music_15.ogg
12_scene music.ogg
mise02-ulicka.ogg

папка Mafia/sounds (В стимовской и гоговской версиях эти треки "убиты" в них записана тишина вместо муызки).
03_music.wav
10_music.wav
10_musicin.wav
12_radio.wav
13b_music.wav
14_Coucou.wav
18_radio.wav
s_music1.wav
s_music2.wav
s_music3.wav
s_music5.wav

Firefox3860 09.10.2020 14:03

Цитата:

Сообщение от KlassenAS (Сообщение 12358)
Следовательно, чтобы багов с непрошенным воспроизведением не возникало, надо в самом начале скрипта, ещё до объявления переменных, эти потоки отдестроить.

Прямо до dim_flt? Интересно. Главное, чтобы при этом как-нибудь не уничтожился поток стандартной музыки главного меню :D
Цитата:

Сообщение от KlassenAS (Сообщение 12358)
Ещё полезно отслеживать состояние здоровья персонажа и дестроить потоки, если Томми склеил ласты.

Чтобы после перезагрузки игры их не было?
Цитата:

Сообщение от KlassenAS (Сообщение 12358)
P.S. Предлагаю, сообщения из этой темы, начиная с №26 перенести в отдельную тему и назвать её "Скрипт авто-радио" или как-то иначе, на усмотрение администрации.

"Скрипт автомобильного радио" :yep:
Цитата:

Сообщение от Abradox (Сообщение 12359)
папка Mafia/sounds

Эти — "неполноценные", лучше не использовать :) И wav, наверное, не пойдёт в стрим.
Цитата:

Сообщение от Abradox (Сообщение 12359)
папка Mafia/sounds/music (В стимовской и гоговской версиях эти треки отсутствуют.)
city_music_14.ogg

Этой не существует :net:

KlassenAS 09.10.2020 14:10

Цитата:

Сообщение от Firefox3860 (Сообщение 12360)
Прямо до dim_flt? Интересно.

Прикол в том, что в сохранении прописаны значения каждой переменной в каждом скрипте.
Поэтому после загрузки сохранения все эти значения восстанавливаются.
И если в скрипте с именем "1" на момент сохранения в переменной 7 было значение 648, то после загрузки сохранения это значение восстановится.
Соответственно, если в переменной 5 был идентификатор потока, то он там и будет.
Эту фичу можно использовать для отслеживания того, начал ли игрок новую игру или загрузил сейв.
Так что я сейчас ещё добавлю к дестрою дополнительную проверку, была ли загрузка из сейва.

Цитата:

Сообщение от Firefox3860 (Сообщение 12360)
Чтобы после перезагрузки игры их не было?

Ну да. А то опять начнут играть, когда их не просят )

Цитата:

Сообщение от Firefox3860 (Сообщение 12360)
И wav, наверное, не пойдёт в стрим.

Если частота дискретизации не больше 22kHz, воспроизводятся, как миленькие )
Цитата:

Сообщение от Firefox3860 (Сообщение 12360)
Цитата:

Сообщение от Abradox (Сообщение 12359)
Список музыки оригинальной Мафии.

папка Mafia/sounds/music (В стимовской и гоговской версиях эти треки отсутствуют.)
city_music_14.ogg

Этой не существует :net:

Странно, у меня существует )

Firefox3860 09.10.2020 14:23

Цитата:

Сообщение от KlassenAS (Сообщение 12362)
Странно, у меня существует )

Да? И что в ней? :D Если то же самое, что в 05, то она из Extended Mod'а — я положил :)

KlassenAS 09.10.2020 14:26

Цитата:

Сообщение от Firefox3860 (Сообщение 12363)
Да? И что в ней? :D Если то же самое, что в 05, то она из Extended Mod'а — я положил :)

Действительно, то же самое.

Ха! Ни фига. Я ошибся. Значение переменных не сохраняется.
Но фишка с уничтожением потоков, почему-то работает.
Хз, возможно, команда Stream_Destroy, в принципе, если видит некорректный идентификатор, докапывается до потоков, ранее созданных этом скрипте.
Хз почему, но работает как надо.

UPD: Я вообще теперь ничего не понимаю.
Снова была ошибка с непрошеным воспроизведением.
Хотя теперь, вроде, происходит реже.
Я уже ничего не понимаю.

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


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

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