Правила, действующие в этом форуме и всех его подфорумах:
1) Запрещена реклама в любых её проявлениях (сразу бан без предупреждения)! 2) Мат тоже не приветствуется на форуме, но иногда можно выразить свои чувства ( лучше заменяйте матные слова точками, пробелами, другими буквами)! 3) Категорически запрещается унижать, посылать, издеваться над участниками форума! Мы здесь все - одна большая и дружная семья! Поэтому за нарушение этого правила автоматически будем банить! 4) Разрешены ссылки на информацию, которые относятся к тому или иному разделу форума! 5) Ссылки не в тему будут удаляться и пользователь получит предупреждение или будет забанен! 6) Пользователям разрешено задавать любые вопросы относящиеся к теме, а мы все дружно ответим на эти вопросы. А также отвечать на вопросы и высказывать своё мнение. 7) Повторные темы, которые будут создаваться, будут удалены! Создавайте темы, удостоверившись, что такой темы нет на форуме! 8) Запрещён флуд во всех его проявлениях, сообщения не по теме, сообщения состоящие из одного или нескольких смайликов без текста, сообщения типа - Вах!, Рулез!, Круто! и т.п. Пользуйтесь пожалуйста кнопкой [EDIT], не плодите бессодержательные сообщения. 9) Использование смайликов разрешается не более 3-х подряд!
/* 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 секунд: Обнаружил косяк: при активном чит-коде не работает мой выход в меню из игры.
_______________________________________ There are 10 types of people in the world: those who understand binary, and those who don't.
D.S Не помню. Это относительно старая версия, вот поновее, она подписана точно. https://yadi.sk/d/2ULHNmVemCQXE Там все свежие фичи, включая выход в меню из игры.
_______________________________________ There are 10 types of people in the world: those who understand binary, and those who don't.
Versus, здорово! Погонял немного на эмуляторе. Самое главное, сбылась мечта - сохраняется весь твой процесс, а то раньше выключил, начинаешь играть, выбираешь уровень и.. всё, не оружия, не достигнутого статуса с 200% энергии/брони. Я не говорю о звуке при нахождении секретов, выглядит на 3DOшной версии ново и свежо. Единственное к чему можно придраться - быстро исчезающие сообщения о взятии чего либо. Отличная работа. Спасибо!
Единственное к чему можно придраться - быстро исчезающие сообщения о взятии чего либо.
Это я пофиксить пока не могу. В идеале - сделать маленький шрифт, этот смотрится слишком громоздким. Звуков я добавил два: нахождение секретов и взятие синего шара здоровья.
_______________________________________ There are 10 types of people in the world: those who understand binary, and those who don't.
Silentman Можно будет, когда решим проблему с Rezfile. Сейчас тоже можно попытаться, но моя картинка game saved отображается некорректно. Видимо, с прицелом будет та же лажа.
_______________________________________ There are 10 types of people in the world: those who understand binary, and those who don't.
Кстати, cel-ку создавал теперь уже из-под мака, на photoshop 4 с плагинами. Перетыкал практически все варианты, и в итоге в игре картинка или совсем не отображается, или показывается полупрозрачным темным прямоугольником, или сдвижка "гуляет" вправо или влево. Я грешу все-таки на прогу. Но функция вывода ведь на все остальное отрабатывает корректно...
Добавлено спустя 1 минуту 24 секунды: Может, картинка начинает показываться не сначала данных, а потом, ориентируясь на вычисленные размеры отображается "по кругу".
_______________________________________ There are 10 types of people in the world: those who understand binary, and those who don't.
Нашёл твой скриншот, попытался совместить - картинка обрезалась снизу и в букве D внизу несколько красных пикселей, которых там быть не должно. т.е получается она не просто сдвинута, а немного искажена и обрезана, совсем чуть-чуть. Даже и не знаю что это может быть... Ширина с высотой не совпадают что ли? А они же как раз и вычисляются той функцией, а в файле их нет...
aliast Причем, ситуация очень похожая практически со всеми вариантами создания этой cel-ки. Видимо, где-то в алгоритме обрезки косяк закрался. Жаль, я так и не научился обрезать их вручную.
_______________________________________ There are 10 types of people in the world: those who understand binary, and those who don't.
Я не помню выкладывал ли ты свою обрезку.. оригинал bmp нашёл, cel нашёл, а обрезки вроде не было. Выложи для сравнения чтоб всю игру не качать. Вот ещё раз всё перепроверил и сделал обрезку: http://ifolder.su/44545910
оригинал bmp нашёл, cel нашёл, а обрезки вроде не было.
Обрезку я делал твоей утилитой. То, что пытался сам делать, не работало совсем. Сейчас под рукой ничего нет, вечером могу выложить обрезанную, если ты сам быстрее своей утилитой не сделаешь.
Добавлено спустя 8 часов 5 минут 5 секунд: aliast Вот результат с новой картинкой.
Добавлено спустя 19 минут 26 секунд: Алгоритм показа картинки - один в один как для Loading, просто с измененной координатой вывода на экран.
_______________________________________ There are 10 types of people in the world: those who understand binary, and those who don't.
Сделал тоже самое с картинкой с такими же размерами, как у Loading. Один хрен, сдвижка. Значит, от размеров картинки это не зависит. Я все-таки ставлю на ошибку в алгоритме обрезки cel. Можно ли это как-то еще проверить?
Добавлено спустя 36 минут 58 секунд: Сравнил оригинальный loading из rezfile и нашу картинку game saved с такими же размерами. Вот сравнение. Интересно, почему в нашей пикче смещения к PDAT и PLUT нулевые? Пробовал менять эти параметры, меняется сдвижка картинки. Вот где собака порылась!
Добавлено спустя 43 минуты 17 секунд: Лютый WIN! Смещение к PDAT в моем случае должно быть 00 00 00 30. Почему так?
aliast Сможешь как-то пофиксить свою утилиту?
_______________________________________ There are 10 types of people in the world: those who understand binary, and those who don't.
Я тут обнаружил вчера, что файл шрифта имеет похожую с REZFILE структуру. В нем тоже сначала идут оффсеты, а потом куски картинок-букв. То есть, теоретически, я смогу модифицировать прогу для сборки REZFILE (убрать оттуда запись "шапки"), оставив там в начале файла только оффсеты. Для этого нужно сначала нарисовать буквы (или взять где-нибудь в инете) и сделать им обрезку заголовков. Затем, разместить в одной папке и с помощью нового скрипт-файла собрать файл шрифта. Если все пройдет удачно, то получим маленький шрифт, которым можно будет писать сообщения пользователю. Существующий шрифт слишком большой.
_______________________________________ There are 10 types of people in the world: those who understand binary, and those who don't.
Добавлено спустя 43 минуты 17 секунд: Лютый WIN! Смещение к PDAT в моем случае должно быть 00 00 00 30. Почему так?
Поздравляю! Странно, что смещения были нулевые. А в оригинале смещение 00 00 00 50? Может у тебя каких-то служебных данных меньше поэтому и смещение ближе?
В оригинале ненулевые, и в моем случае должны быть ненулевые. Заголовки режутся, да, но PLUT и PDAT начинаются не с самого начала файла же? Причем, оба сразу.
_______________________________________ There are 10 types of people in the world: those who understand binary, and those who don't.
Я думал эти смещения ни на что не влияют. К такому выводу пришёл, исследуя дамп памяти в отладчике Феникса. Теперь пытаюсь вспомнить как эти смещения считать, не могу вспомнить, хотя раньше вроде как разобрался. Ничего сложного там не было, но не помню хоть убей :(
Сделал на основе утилиты по сборке REZFILE утилиту по сборке файлов шрифта и цифр. Проверил утилиту CelCutter на распакованных из REZFILE цифрах (cel-ках). Картинку цифры режет нормально, вроде, но дописывает кучу нулей:
Добавлено спустя 16 минут 5 секунд: Далее, запакованные в новый файл цифр, они отображаются частично. Отображаются только 4, 6, 8. Причем, в оригинальном файле цифр 12 символов (цифры, знак процента и минус), а в распакованных почему-то 11.
_______________________________________ There are 10 types of people in the world: those who understand binary, and those who don't.
Победил! Моя утилита сборки буковок/циферок работает, игра корректно отображает цифирьки. Можно теперь попытаться создать свой шрифт с маленькими буквами.
_______________________________________ There are 10 types of people in the world: those who understand binary, and those who don't.
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.
Доперло. Это нужно, чтобы уменьшить фрагментацию памяти. Когда флаг не выставлен, данные грузятся, условно говоря, с начала оперативки и до тех пор, пока не закончатся. Если флаг выставлен, то данные грузятся в оперативку начиная с ее "конца". Тогда мы имеем пустое место в середине.
_______________________________________ There are 10 types of people in the world: those who understand binary, and those who don't.
Раскурил создание и работу собственного шрифта. Начал потихоньку его делать. То, что пока получается, можно глянуть здесь:
Буквы уже выровнял и "склеил". Осталось нарисовать их полностью перерисовать (изменить цвет, форму, сделать заглавные буквы) и добавить туда же маленькие цифры.
Добавлено спустя 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 Спасибо! Это получается, что если я захочу добавить текстуру пола или стены, то мне нужно править этот файл? А нельзя никак автоматизировать процесс?
_______________________________________ There are 10 types of people in the world: those who understand binary, and those who don't.
Сейчас этот форум просматривают: Google [Bot], Trendiction [Bot] и гости: 1
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения