typedef enum { /* All the sounds in the game */ Song_None, Song_intro, Song_final, Song_bunny, Song_intermission, Song_e1m1, NUMMUSIC=Song_e1m1+24 /* Song count */ } musicnum_t;
typedef enum { /* All the sounds in the game */ 0, ///Song_None=0, нет музыки 1, ///Song_intro=1, вступительная музыка 2, ///Song_final=2, победная музыка 3, ///Song_bunny=3, что это за музыка?? :))) 4, ///Song_intermission=4, какая-то промежуточная музыка 5, ///Song_e1m1=5, номер муз.трека уровня 6 ///NUMMUSIC=Song_e1m1+24 /* Song count */ хитрое исчиление } musicnum_t; :du_ma_et:
Versus писал(а):
S_StartSong(Song_e1m1-1+gamemap,TRUE);
окончательно запутался так и не поняв как получится номер файла Song5...Song8
Последний раз редактировалось Author 29 июн 2015, 12:05, всего редактировалось 1 раз.
Я не помню, а они фактически есть в игре? Играют? Для Song5 получается мы должны вызвать: SongLookup[5] или SongLookup[6] или SongLookup[16]. Для этого выражение S_StartSong(5-1+gamemap,TRUE) должно получать эти цифры.
Versus, в общем лучше в дебаггере смотреть какие значения приходят и что выбирается по ним. В SongLookup 36 значений. Что значит коментарий /*Map 1 */ я так и не врубился, то ли он для всей строки, то ли для первого значения т.е. "5", что значило бы на первом уровне играет 5 мелодия, тогда на 6 уровне должна играть 10, а её нет. Надо весь исходник смотреть видимо.
Versus, да в этом ничего сложного нет, но вот как это сделать с приложением, которое должно запускаться не на ПК вопрос хороший. В среде разработки, после сборки программы (компиляции) и запуска или до этого в интересующих участках исходного кода ставятся точки останова напротив строки, где мы хотим посмотреть промежуточные результаты каких либо вычислений в программе. Начинаем выполнение программы (запускаем игру) и как только мы достигнем точки останова выполнение проги прерывается и мы может залезть в содержимое переменных. Но это когда прога/игра на ПК запускается. Для наших целей видимо нужен DEV kit или эмуль со спец.возможностями.
Как вариант ты можешь сохранить файл с данными в NVram (раз сейвы удалось добавить) в который скинешь, что передаётся в S_StartSong и как это было вычислено (т.е значения формирующиеся до вызова S_StartSong(5-1+gamemap,TRUE). Либо пробовать методом тыка менять значения в SongLookUp.Либо в перечисляемом типе musicnum_t изменить NUMMUSIC=Song_e1m1+24 на NUMMUSIC=Song_e1m1+25 и добавить в папку с музыкой трек с именем SONG9. Затем проверить поменялся ли где-то звук?
Author На счёт NVRAM мне уже приходила мысль, но что именно туда писать? В какие моменты? Пока вплотную не брался за музыку, может, удастся раскурить и без дебаггера.
На счёт NVRAM мне уже приходила мысль, но что именно туда писать?
Пиши туда содержимое переменной music_id и по возможности значение Song_e1m1 (хотя вероятно оно всегда 5) вместе с NUMMUSIC.
Versus писал(а):
В какие моменты?
Скидывание в файл вероятно следует разместить в процедуре S_StartSong перед строкой PlaySong(SongLookup[music_id]) файл sound.c, можно и после этой строки. Тогда информация в файл будет скидываться при старте мелодий (т.е. в начале уровня или входе в главное меню).
Чтобы знать, откуда произошёл вызов процедуры S_StartSong с этими параметрами желательно в этот же файл писать текст типа "главное меню", "загрузка уровня", для этого придётся найти все обращения к этой процедуре в исходнике. Но, если это сложно сделать можно ограничиться параметрами.
Да, все эти файлы есть. Как ты написал, я уже пробовал, все работает. SongLookup[] можно ведь и больше сделать. Обнаружилась проблемка с сохранениями. Вернее, недоработка. Нужно вырубить возможность сейва, когда мы закончили уровень 23. А то получается, что при последующей загрузке запускается секретный уровень 24. И еще. Даже в оригинале после окончания 22 уровня не пишется Entering Dis. Надо как-то пофиксить.
Для чего? У меня только вариант с увеличением количества уровней.
Versus писал(а):
А то получается, что при последующей загрузке запускается секретный уровень 24.
Ну, это не баг, а фича! Своего рода награда за прохождение всей игры. Игрок видит финальный экран, делает сейв, а потом решив его вдруг загрузить попадает в секретный уровень. А так-то выпилить это не проблема судя по всему.
У меня только вариант с увеличением количества уровней.
Ну да... Я все-таки надеюсь на победу над REZFILE. Произойдет когда-нибудь это или нет?
Author писал(а):
Ну, это не баг, а фича!
Кстати, да, не подумал об этом.
Author писал(а):
Поздравляю с подвижкой в замене музыки!
Спасибо!
Добавлено спустя 58 минут 58 секунд:
Versus писал(а):
Даже в оригинале после окончания 22 уровня не пишется Entering Dis. Надо как-то пофиксить.
Пофиксил. Странно, Ребекка написала все правильно, а почему-то не работало... И оставил возможность выбора 24 уровня из главного меню, когда мы его прошли. Мне кажется, что так будет честно.
Добавлено спустя 5 часов 5 минут 31 секунду: Уточню. После прохождения игры без захода в секретный уровень максимально возможный уровень для выбора из главного меню - 23. А если мы прошли (получили доступ) секретный уровень, то максимально возможный уровень для выбора 24.
Хм... Косячокс... Дело в том, что когда мы делаем возможным выбор 24 уровня из меню после его прохождения, то тем самым открываем доступ ко всем НЕПРОЙДЕННЫМ уровням 4-23. Неправильно это. Придется возвращать назад. Ну, или извращаться и делать возможным выбор уровня 1-3, 24. Хз, как это делать...
Author Когда мы проходим секретный 24 и сохраняемся в конце уровня, то он становится доступным для выбора. Но вот только получается, что мы можем теперь перелистать уровни назад и запустить любой, хотя до этого прошли только 3.
Versus, если возможно покажи кусок кода, который за сейв этого хозяйства отвечает и за загрузку тоже, т.е. там, где параметры пройденных уровней сохраняются.
На секретный уровень, если нужно, там выходить если идти прямо после открытия первой двери в третьем уровне, для этого надо пойти сразу влево и после того как... Блин, легче показать...
Author Вопрос комплексный. По умолчанию (то есть, в оригинале) уровень сохраняется в NVRAM, когда пройден. Вроде, все так, но у меня ситуация уже другая. Когда просто проходишь и сохраняешь игру, все работает четко. Но представим, что мы потерли файл DoomPrefs и оставили наш DoomSave. Тогда при первом запуске игры у нас доступен только первый уровень. Но, когда мы загружаем игру, то нам нужно обновить DoomPrefs нашими загружаемыми параметрами. Итого, имеем: Приравниваем максимально доступный уровень из меню текущему уровню загружаемой игры. Но когда мы загружаем сохранение уровня 24, получается, что мы открываем на него доступ. Вот одна из моих вставок:
void G_InitNew_LOAD(skill_t skill,Word map) { Randomize(); /* Reset the random number generator */ ReadPrefsFile(); /*Read params from PrefsFile. I need only MaxLevel value */ ReadSaveFile(); /*Override params loaded*/
/* Force players to be initialized upon first level load */
players.playerstate = PST_LOAD; players.mo = 0; /* For net consistancy checks */
DemoRecording = FALSE; /* No demo in progress */ DemoPlayback = FALSE;
if (skill == sk_nightmare ) { /* Hack for really BAD monsters */ states[S_SARG_ATK1].Time = 2*4; /* Speed up the demons */ states[S_SARG_ATK2].Time = 2*4; states[S_SARG_ATK3].Time = 2*4; mobjinfo[MT_SERGEANT].Speed = 15; mobjinfo[MT_SHADOWS].Speed = 15; mobjinfo[MT_BRUISERSHOT].Speed = 40; /* Baron of hell */ mobjinfo[MT_HEADSHOT].Speed = 40; /* Cacodemon */ mobjinfo[MT_TROOPSHOT].Speed = 40; } else { states[S_SARG_ATK1].Time = 4*4; /* Set everyone back to normal */ states[S_SARG_ATK2].Time = 4*4; states[S_SARG_ATK3].Time = 4*4; mobjinfo[MT_SERGEANT].Speed = 8; mobjinfo[MT_SHADOWS].Speed = 8; mobjinfo[MT_BRUISERSHOT].Speed = 30; mobjinfo[MT_HEADSHOT].Speed = 20; mobjinfo[MT_TROOPSHOT].Speed = 20; } StartMap = gamemap; StartSkill = gameskill; if (MaxLevel<gamemap){ MaxLevel = gamemap; }
if (gamemap == 24) { MaxLevel = 3; ВОТ ТУТ НУЖНО ПРОПИСАТЬ ПРАВИЛЬНО!!!! StartMap = 3; ЭТОТ КОД НЕПОЛНЫЙ! } WritePrefsFile(); }
Вроде, работает. Криво, но часто эта фигня не вызывается, поэтому можно забить. Правда, палево получается. Третий уровень намекает, что выход на 24 находится там. А как иначе сделать?
Добавлено спустя 58 минут 49 секунд: Yaranga Выходить-то известно как. Задача - что делать с параметрами игрока после.
Добавлено спустя 3 часа 2 минуты 43 секунды: Появился околовсяческий вопрос. Как использовать внешний asm файл в своем c# проекте?
if (MaxLevel > gamemap) { MaxLevel = MaxLevel; //// это точно правильно?? если да, то этот кусок вообще можно выбросить ибо ничего не меняется в переменной. }
if (MaxLevel<=gamemap){ MaxLevel = gamemap; }
if (gamemap == 24) { MaxLevel = 3; /// может замененить на 1??? StartMap = 3; }
А не получится, что после выхода на 24 уровень мы потеряем доступ к пройденному 3му?
Нет. У нас идет отработка ситуации, когда в файле настроек информация противоречит загружаемому уровню. Здесь нам сразу же нужно подкорректировать файл настроек. При загрузке на 24 уровень мы и корректируем его, назначая доступным для выбора только первый уровень. А если уже много уровней открыто (первое мое условие), то ничего не меняем.
Author писал(а):
можно вообще это условие убрать
Почему-то без него корректно не работало.
Добавлено спустя 11 часов 56 минут 22 секунды: Просьба потестировать образ (подписан). -Работают сохранения. -Добавлена музыка (на каждом уровне своя, музыка финальных титров и между уровнями). Оригинальная тоже присутствует вся. -Тест записи демок работает по кнопке С на Load game, Заканчиваем запись демки по кнопке Start. Потом демка циклически повторяется. Файл деморолика также сохраняется в NVRAM. Чтение демки из памяти приставки пока не работает. Планирую делать проигрывание демки из памяти, скажем, кнопкой B на Load game. -Работает остановка чтения музыки, когда громкость установлена на ноль. Если есть какие пожелания, или будут найдены ошибки, буду рад критике. https://yadi.sk/d/OhY_a-YNhexW2
Versus очень понравилась муз. тема после прохождения уровня тогда может заодно и перемещения черепа и Loading озвучишь в меню игры, как в версии PS1, если конечно имеется возможность?
а вот Load game хорошо бы перенести в раздел options, а то надпись "DOOM" перекрывает, но если всех устраивает, то можно не заморачиваться