/* Look at sample information. */ /* DebugSample(SampleItem); */
/* Connect Sampler to Mixer */ Result = ConnectInstruments (SamplerIns, "Output", DelayCon.dlc_MixerIns, "Input0"); CHECKRESULT(Result,"ConnectInstruments"); Result = ConnectInstruments (DelayCon.dlc_MixerIns, "RightOutput", DelayCon.dlc_OutputIns, "InputLeft"); CHECKRESULT(Result,"ConnectInstruments"); Result = ConnectInstruments (DelayCon.dlc_MixerIns, "RightOutput", DelayCon.dlc_OutputIns, "InputRight"); CHECKRESULT(Result,"ConnectInstruments");
/* Attach the sample to the instrument. */ Attachment = AttachSample(SamplerIns, SampleItem, 0); CHECKRESULT(Attachment,"AttachSample");
/* Instruments must be started */ Result = StartInstrument( DelayCon.dlc_MixerIns, NULL ); CHECKRESULT(Result,"StartInstrument"); /* Start Delay first to test START_AT. It is safer to start ** the tap after the delay. */ Result = StartInstrument( DelayCon.dlc_DelayIns, NULL ); CHECKRESULT(Result,"StartInstrument"); Result = StartInstrument( DelayCon.dlc_TapIns, NULL ); CHECKRESULT(Result,"StartInstrument"); Result = StartInstrument( DelayCon.dlc_OutputIns, NULL ); CHECKRESULT(Result,"StartInstrument");
/********************************************************************/ /***** Play a note based on MIDI pitch. *****************************/ /********************************************************************/
/* Notes: . Error trapping has been removed for brevity. . Use of SleepAudioTicks() is not a real good way to do this sort of delay in real code (see Caveats). */
Result = StartInstrumentVA (Instrument, AF_TAG_VELOCITY, Velocity, AF_TAG_PITCH, Note, TAG_END); Result = SleepAudioTicks( Duration>>1 );
ReleaseInstrument( Instrument, NULL); Result = SleepAudioTicks( Duration>>1 );
/* ** Create a delay line. This must be allocated by the AudioFolio ** because the memory is written to by hardware. A delay line ** is just a sample with a special write permission. ** 1=channel, TR loop */ #define NUM_CHANNELS (1) #define IF_LOOP (TRUE) dlc->dlc_DelayLine = CreateDelayLine( DelaySize, NUM_CHANNELS, IF_LOOP ); CHECKRESULT(dlc->dlc_DelayLine,"CreateDelayLine");
/* ** Load the basic delay instrument which just writes data to ** an output DMA channel of the DSP. */ dlc->dlc_DelayIns = LoadInstrument("delaymono.dsp", 0, 100); CHECKRESULT(dlc->dlc_DelayIns,"LoadInstrument");
/* Attach the delay line to the delay instrument output. */ Att = AttachSample( dlc->dlc_DelayIns, dlc->dlc_DelayLine, "OutFIFO" ); CHECKRESULT(Att,"AttachDelay"); Result = SetAudioItemInfoVA( Att, AF_TAG_START_AT, DelayFrames, TAG_END ); CHECKRESULT(Result,"SetAudioItemInfo: START_AT");
/* ** Load an instrument to read the output of the delay. */ dlc->dlc_TapIns = LoadInstrument("fixedmonosample.dsp", 0, 100); CHECKRESULT(dlc->dlc_TapIns,"LoadInstrument");
/* Attach the delay line to the delay tap. */ Att = AttachSample( dlc->dlc_TapIns, dlc->dlc_DelayLine, "InFIFO" ); CHECKRESULT(Att,"AttachSample"); /* ** Load a submixer that we can use to mix delayed and original signal. ** We will use the left side to mix for the delay, and the right side ** for the output from the circuit. */ dlc->dlc_MixerIns = LoadInstrument("submixer4x2.dsp", 0, 100); CHECKRESULT(dlc->dlc_MixerIns,"LoadInstrument");
/* Connect the output of Tap0 to channel 1 of the mixer. */ Result = ConnectInstruments (dlc->dlc_TapIns, "Output", dlc->dlc_MixerIns, "Input1"); CHECKRESULT(Result,"ConnectInstruments");
/* Connect the left output of the mixer to the delay. */ Result = ConnectInstruments (dlc->dlc_MixerIns, "LeftOutput", dlc->dlc_DelayIns, "Input"); CHECKRESULT(Result,"ConnectInstruments");
/* Mix for the Delay Line connected to Left channel. */ TweakKnob( dlc->dlc_OriginalSend, 0x3000 ); TweakKnob( dlc->dlc_DelayedSend, 0x4000 );
/* Mix for the Output instrument connected to Right channel. */ TweakKnob( dlc->dlc_OriginalMix, 0x3fff ); TweakKnob( dlc->dlc_DelayedMix, 0x4000 );
void PlaySound(Word SoundNum) { Word Number; Word i; Word OldPrior;
if (SoundNum&0x8000) { /* Stop previous sound */ SoundNum&=(~0x8000); /* Clear the flag */ StopSound(SoundNum); /* Stop the sound */ } if (!SoundNum || /* No sound at all? */ !AllSamples[SoundNum-1] || /* Valid sound loaded? */ !(SystemState&SfxActive)) { /* Sound enabled? */ goto WrapUp; }
Number = 0; do { if (!SampleSound[Number]) { /* Find an empty sound channel */ goto Begin; /* Found it! */ } } while (++Number<VOICECOUNT);
Number = 0; /* Get the lowest priority sound */ do { if (!SamplePriority[Number]) { /* Get the priority */ break; /* Priority zero? */ } } while (++Number<(VOICECOUNT-1)); /* Drop out on the last channel */
StopInstrument(SamplerIns[Number],0); /* Stop the sound */ if (SampleAtt[Number]) { /* Delete the attachment */ DetachSample(SampleAtt[Number]); }
Begin: SampleSound[Number] = SoundNum; /* Attach the sound number to this channel */ SampleAtt[Number] = AttachSample(SamplerIns[Number],AllSamples[SoundNum-1],0); TweakKnob(SamplerRateKnob[Number],AllRates[SoundNum-1]); /* Set to 11 Khz fixed */ TweakKnob(LeftKnobs[Number],LeftVolume<<6); /* Set the volume setting */ TweakKnob(RightKnobs[Number],RightVolume<<6); StartInstrument(SamplerIns[Number],0); /* Begin playing... */ i = 0; OldPrior = SamplePriority[Number]; /* Get the old priority */ do { if (SamplePriority[i]>=OldPrior) { --SamplePriority[i]; /* Reduce the priority */ } } while (++i<VOICECOUNT); SamplePriority[Number] = (VOICECOUNT-1); /* Set the higher priority */ WrapUp: LeftVolume = 255; /* Reset the volume */ RightVolume = 255; }
Задача: используя код №1 дополнить код №2 эффектом эха. Что делать потом - я знаю. Вводим дополнительный параметр в функцию PlaySound, и дописываем этот параметр во всех местах, где вызывается функция проигрывания звука. Для звуков в меню нет нужды делать эхо, там этот параметр будет =0.
Добавлено спустя 13 минут 39 секунд: Обнаружил косяк: при активном чит-коде не работает мой выход в меню из игры.
08 дек 2015, 00:32
D.S
Мегажитель
Группа: Пользователи Сообщения: 353 Регистрация: 26 сен 2012, 20:21 Откуда: Третья планета от Солнца
Модель 3DO:GoldStar GDO-202P
D.S Не помню. Это относительно старая версия, вот поновее, она подписана точно. https://yadi.sk/d/2ULHNmVemCQXE Там все свежие фичи, включая выход в меню из игры.
13 дек 2015, 21:42
D.S
Мегажитель
Группа: Пользователи Сообщения: 353 Регистрация: 26 сен 2012, 20:21 Откуда: Третья планета от Солнца
Модель 3DO:GoldStar GDO-202P
Versus, здорово! Погонял немного на эмуляторе. Самое главное, сбылась мечта - сохраняется весь твой процесс, а то раньше выключил, начинаешь играть, выбираешь уровень и.. всё, не оружия, не достигнутого статуса с 200% энергии/брони. Я не говорю о звуке при нахождении секретов, выглядит на 3DOшной версии ново и свежо. Единственное к чему можно придраться - быстро исчезающие сообщения о взятии чего либо. Отличная работа. Спасибо!
Единственное к чему можно придраться - быстро исчезающие сообщения о взятии чего либо.
Это я пофиксить пока не могу. В идеале - сделать маленький шрифт, этот смотрится слишком громоздким. Звуков я добавил два: нахождение секретов и взятие синего шара здоровья.
14 дек 2015, 00:23
Silentman
Ломаю джойстик взглядом
Группа: Модераторы Сообщения: 762 Регистрация: 04 дек 2009, 12:13 Откуда: Пермь
Модель 3DO:Panasonic FZ-10 NTSC-J
Silentman Можно будет, когда решим проблему с Rezfile. Сейчас тоже можно попытаться, но моя картинка game saved отображается некорректно. Видимо, с прицелом будет та же лажа.
Кстати, cel-ку создавал теперь уже из-под мака, на photoshop 4 с плагинами. Перетыкал практически все варианты, и в итоге в игре картинка или совсем не отображается, или показывается полупрозрачным темным прямоугольником, или сдвижка "гуляет" вправо или влево. Я грешу все-таки на прогу. Но функция вывода ведь на все остальное отрабатывает корректно...
Добавлено спустя 1 минуту 24 секунды: Может, картинка начинает показываться не сначала данных, а потом, ориентируясь на вычисленные размеры отображается "по кругу".
Нашёл твой скриншот, попытался совместить - картинка обрезалась снизу и в букве D внизу несколько красных пикселей, которых там быть не должно. т.е получается она не просто сдвинута, а немного искажена и обрезана, совсем чуть-чуть. Даже и не знаю что это может быть... Ширина с высотой не совпадают что ли? А они же как раз и вычисляются той функцией, а в файле их нет...
aliast Причем, ситуация очень похожая практически со всеми вариантами создания этой cel-ки. Видимо, где-то в алгоритме обрезки косяк закрался. Жаль, я так и не научился обрезать их вручную.
Я не помню выкладывал ли ты свою обрезку.. оригинал bmp нашёл, cel нашёл, а обрезки вроде не было. Выложи для сравнения чтоб всю игру не качать. Вот ещё раз всё перепроверил и сделал обрезку: http://ifolder.su/44545910
оригинал bmp нашёл, cel нашёл, а обрезки вроде не было.
Обрезку я делал твоей утилитой. То, что пытался сам делать, не работало совсем. Сейчас под рукой ничего нет, вечером могу выложить обрезанную, если ты сам быстрее своей утилитой не сделаешь.
Добавлено спустя 8 часов 5 минут 5 секунд: aliast Вот результат с новой картинкой.
Добавлено спустя 19 минут 26 секунд: Алгоритм показа картинки - один в один как для Loading, просто с измененной координатой вывода на экран.
Сделал тоже самое с картинкой с такими же размерами, как у Loading. Один хрен, сдвижка. Значит, от размеров картинки это не зависит. Я все-таки ставлю на ошибку в алгоритме обрезки cel. Можно ли это как-то еще проверить?
Добавлено спустя 36 минут 58 секунд: Сравнил оригинальный loading из rezfile и нашу картинку game saved с такими же размерами. Вот сравнение. Интересно, почему в нашей пикче смещения к PDAT и PLUT нулевые? Пробовал менять эти параметры, меняется сдвижка картинки. Вот где собака порылась!
Добавлено спустя 43 минуты 17 секунд: Лютый WIN! Смещение к PDAT в моем случае должно быть 00 00 00 30. Почему так?
Я тут обнаружил вчера, что файл шрифта имеет похожую с REZFILE структуру. В нем тоже сначала идут оффсеты, а потом куски картинок-букв. То есть, теоретически, я смогу модифицировать прогу для сборки REZFILE (убрать оттуда запись "шапки"), оставив там в начале файла только оффсеты. Для этого нужно сначала нарисовать буквы (или взять где-нибудь в инете) и сделать им обрезку заголовков. Затем, разместить в одной папке и с помощью нового скрипт-файла собрать файл шрифта. Если все пройдет удачно, то получим маленький шрифт, которым можно будет писать сообщения пользователю. Существующий шрифт слишком большой.
Добавлено спустя 43 минуты 17 секунд: Лютый WIN! Смещение к PDAT в моем случае должно быть 00 00 00 30. Почему так?
Поздравляю! Странно, что смещения были нулевые. А в оригинале смещение 00 00 00 50? Может у тебя каких-то служебных данных меньше поэтому и смещение ближе?
В оригинале ненулевые, и в моем случае должны быть ненулевые. Заголовки режутся, да, но PLUT и PDAT начинаются не с самого начала файла же? Причем, оба сразу.
Я думал эти смещения ни на что не влияют. К такому выводу пришёл, исследуя дамп памяти в отладчике Феникса. Теперь пытаюсь вспомнить как эти смещения считать, не могу вспомнить, хотя раньше вроде как разобрался. Ничего сложного там не было, но не помню хоть убей :(
Сделал на основе утилиты по сборке REZFILE утилиту по сборке файлов шрифта и цифр. Проверил утилиту CelCutter на распакованных из REZFILE цифрах (cel-ках). Картинку цифры режет нормально, вроде, но дописывает кучу нулей:
Добавлено спустя 16 минут 5 секунд: Далее, запакованные в новый файл цифр, они отображаются частично. Отображаются только 4, 6, 8. Причем, в оригинальном файле цифр 12 символов (цифры, знак процента и минус), а в распакованных почему-то 11.
Победил! Моя утилита сборки буковок/циферок работает, игра корректно отображает цифирьки. Можно теперь попытаться создать свой шрифт с маленькими буквами.
The flag is used by the memory manager to load from high memory to reduce fragmentation. Clear. Load for location 0 and up. Set. Load from fffffff down.
Доперло. Это нужно, чтобы уменьшить фрагментацию памяти. Когда флаг не выставлен, данные грузятся, условно говоря, с начала оперативки и до тех пор, пока не закончатся. Если флаг выставлен, то данные грузятся в оперативку начиная с ее "конца". Тогда мы имеем пустое место в середине.
Раскурил создание и работу собственного шрифта. Начал потихоньку его делать. То, что пока получается, можно глянуть здесь:
Буквы уже выровнял и "склеил". Осталось нарисовать их полностью перерисовать (изменить цвет, форму, сделать заглавные буквы) и добавить туда же маленькие цифры.
Добавлено спустя 1 минуту 27 секунд:
aliast писал(а):
Разницы в упаковке с флагом и без мы так и не увидели.
Может, эта "дефрагментация" была сделана "на вырост"? В таком случае, пока память полностью не забьется, мы эффекта и не заметим. И что если так и продолжать паковать последние 3 лумпа с флагом и забить на все?
Добавлено спустя 11 часов 47 минут 47 секунд: Кстати, а что за самый первый файл в REZFILE (D0001)? Это не текстура стены, слишком маленький. Сделал себе для удобства добавления ресурсов в REZFILE вот такой скрипт:
typedef struct { /* Actual structure of TEXTURE1 */ Word Count; /* Count of entries */ Word First; /* Starting resource # */ Word FlatCount; /* Count of flats */ Word FirstFlat; /* Starting resource # for flats */ texture_t Array[1]; /* Array of entries[Count] */ } Filemaptexture_t;
texture_t Array[1]; - это ширина и высота каждой структуры плюс 00000000
aliast Спасибо! Это получается, что если я захочу добавить текстуру пола или стены, то мне нужно править этот файл? А нельзя никак автоматизировать процесс?