Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
Erick194

[GEC] Master Edition PSX Doom for the PlayStation. Beta 4 Released [11/16/2022]

Recommended Posts

I'd be open to picking up some of those if they'd rather free them up, sure. My time is somewhat limited until Spring Break in April (approximately a month from now, to be precise), but I get a bit over a week off then, and then finish my work year in the last third of June and don't go back until September.

 

The project is otherwise mostly done after all - most of what remains are GEC maps and what @mr-around is working on.

 

That said, I also know the slowness is due to Erick reverse-engineering the game thoroughly, too.

 

EDIT: Specifically, I'd consider Bloodsea Keep, Mephisto's Mausoleum, Neurosphere, and (especially) Tech Gone Bad if they wanted to free those up.

Edited by Dark Pulse

Share this post


Link to post
6 hours ago, riderr3 said:

I know GEC still doing The Living End for the last 3 months.

You're right and I'm still stuck with it.

Share this post


Link to post
4 hours ago, Gerardo194 said:

You're right and I'm still stuck with it.

There's a reason I didn't name that one, but hey, it could be worse - Tech Gone Bad looks like it'll be real torture to make run.

 

Hopefully Erick can help us out with that via reverse-engineering so we have a better idea of what the PS1's limits will be :P

Share this post


Link to post
17 hours ago, Gerardo194 said:

You're right and I'm still stuck with it.


I suppose there will be a problem with some areas with slow framerate (looking at Anti-Christ starting area FPS is drops massively). You can see how I did in Final Frontier as example changing stairs into the lift (area before the exit where you meet the Cyberdemon on Living End, in case if he stay here), this mostly won't change the progression. Because PSX Doom is unfriendly to stairs in huge areas. Or just modifying map in style of Gotcha, leaving areas which only needed for progression.

Edited by riderr3

Share this post


Link to post
2 hours ago, riderr3 said:


You can see how I did in Final Frontier as example changing stairs into the lift (area before the exit where you meet the Cyberdemon on Living End, in case if he stay here), this mostly won't change the progression. Because PSX Doom is unfriendly to stairs in huge areas. Or just modifying map in style of Gotcha, leaving areas which only needed for progression.

That's what I did in phobos mission control. The fps was really bad in the computer room thanks to all the stairs and how open it was.

 

Honestly, if it were me, I wouldn't be too afraid of cutting down rooms or changing them up just enough so that the original flow of the map is preserved but with better fps. He'll, some maps had areas completely removed in the psx version.

Share this post


Link to post

This project scratches the itch that TLL simply can't: TLL is an amazing achievement but it feels like PC Doom with PSX sounds. It's too fast, too smooth and feels too polished. This is not to detract from the fantastic efforts of the TLL team of course -- there was just no way to know if a PC project would actually have run on a Playstation, until GEC Master Edition began.

 

My apologies if this has been asked before, but:

 

Is there a detailed, user-friendly walkthrough of what the hell to do to convert an existing map to PSX format so that it can be modified to run on a PSX? I need something that is relatively easy to follow, as I have severe ADHD and struggle to learn technical or complex things, and haven't opened Doom builder for about four years in any case. If I can understand it, I can get to work seeing which Alien Vendetta maps would actually work on a PSX. I suspect at least one of them might, maybe!

 

Better yet, is there an easy to follow guide to create a brand new map that will run on a PSX? 

 

When I say easy to follow, I mean something that is not split up across multiple posts/threads, does not require a degree in computing, explains every technical term it uses, tells you exactly which programs you need and where to find them, and progresses in a clear, step-by-step fashion, as opposed to some "compile the X format from the lookup table" nonsense. I am willing to create a thread compiling all such information if it already exists.

Share this post


Link to post
1 hour ago, MajorRawne said:

Is there a detailed, user-friendly walkthrough of what the hell to do to convert an existing map to PSX format so that it can be modified to run on a PSX? I need something that is relatively easy to follow, as I have severe ADHD and struggle to learn technical or complex things, and haven't opened Doom builder for about four years in any case.


I also seconded this, at least when this project will done the guide need to be published in readable form.

For myself, when converting maps I found many stuff which never mentioned before and many bizarre things. In a nutshell - even small inconspicuous changes can break the map/progression, and these bugs can be detected late or even not detected at all. Like as example "if the teleporting line is too long, you can also teleport from it's back side", "if the midtextures have scrolling parameter, the back side will not scroll" e.t.c. Tons of them!

I have collected many known information about the features of the engine and errors which added to text file of 17 kilobytes. But it's too messy, also considering my English. I may help to provide info to such a guide.

Share this post


Link to post
5 hours ago, MajorRawne said:

My apologies if this has been asked before, but:

 

Is there a detailed, user-friendly walkthrough of what the hell to do to convert an existing map to PSX format so that it can be modified to run on a PSX? I need something that is relatively easy to follow, as I have severe ADHD and struggle to learn technical or complex things, and haven't opened Doom builder for about four years in any case. If I can understand it, I can get to work seeing which Alien Vendetta maps would actually work on a PSX. I suspect at least one of them might, maybe!

 

Better yet, is there an easy to follow guide to create a brand new map that will run on a PSX? 

 

When I say easy to follow, I mean something that is not split up across multiple posts/threads, does not require a degree in computing, explains every technical term it uses, tells you exactly which programs you need and where to find them, and progresses in a clear, step-by-step fashion, as opposed to some "compile the X format from the lookup table" nonsense. I am willing to create a thread compiling all such information if it already exists.

Well, part of the problem is that the full limits of the PS1 version are unknown.

 

For example, in my version of TNT's MAP05: Hanger (which should be coming with the next beta), I tried to merge two sectors to save some lines (since too much lines in view will bomb the renderer). Problem is, merging them also bombed the renderer when I looked in a certain direction, every time. I was forced to keep the sectors split, and only then was the renderer happy.

 

While we can say there are some definite things we can say (16 flats per level, limited texture size due to VRAM space (which in turn is dependent on what sorts of textures you use - 16/64-wide textures will let you have more variety than the 128-wide ones), also limited monster variety due to VRAM space with some monsters taking up more types than others, no heights over 256 units or textures will stretch/flip, etc.), a lot more of this is by trial and error. You simply have to build, test, optimize, refine, and play on an accurate emulator (like the BeetlePSX cores in RetroArch) to try to make it as performant and bug-free as possible.

 

But there is no one single "PSX Doom Hacker's Bible" like there is for Doom 64 EX yet, precisely because lots of it is unknown, and being documented as we go along. Erick is reverse-engineering it, and we may have more then, but in a nutshell, most of the info we've dug up is scattered in the dozens of pages in this thread. We could certainly pool all that information together (I wouldn't mind writing and organizing it, since writing is one of my strong suits), but there is no single document to read that will tell you every technical detail and answer every question you could ever have about making a map for PSX Doom yet. (If people are serious about wanting a document like that though, send me your info on problems you've run into and solutions you've found, and I'll see if I can get a draft document up sometime in the next few weeks.)

 

That said, otherwise making the maps is fairly straightforward if you know GZDoom Builder, and Erick has provided tools where you just plop your map into a directory, run a batchfile, and it will spit out an ISO that will slot your map into MAP01 for testing purposes.

 

Speaking from experience (having made three levels for this project, with more if Erick/Gerardo don't mind giving up some GEC slots), you will run into three major problems with Alien Vendetta:

  1. High monster variety will force you to compromise - you can have a lot of the little guys with relative ease, but once you start getting into Mancubi, Revenants, etc. you will definitely have to choose between having a lot of fodder, or a lot of the biggies scattered around the map. Adding a Cyberdemon or Spider Mastermind will also consume most of the VRAM set for monsters - you literally can never have both on the same map, ever. There's simply not enough memory. For my version of E3M8: Dis (in the current beta), I was able to fit three enemies: Spider Mastermind, Barons of Hell, and Pain Elementals (which also gave me "free" Lost Souls since they're included with it). I was forced to chop the Cacodemons that would've replaced the Pain Elementals on non-Ultra-Violence difficulties - there simply wasn't enough VRAM.
  2. It's made for Boom, so PSX Doom will certainly have some problems with anything that really relies on Boom features. If it's just making use of the expanded limits, then you can chop it down a bit and things will be mostly fine, but actual reliance on new additions Boom had will definitely make your life harder in porting it.
  3. Some levels (like Misri Halek) are simply never, ever going to work unless you chop them down so much they barely resemble their original forms.

In short, the closer the PWAD sticks to vanilla in terms of size and scope, the more likely you can port it right across while making perhaps marginal cuts. The further along you go in Doom's lifetime, the less likely you'd be able to do a more or less straight port. Anything for Boom and later would definitely need some major cutting or reworking if it's an effect Boom added, and forget about WADs built for highly advanced engines like Eternity or ZDoom without essentially only sticking to vestiges of gameplay that could be crudely simulated by the PSX engine.

Edited by Dark Pulse

Share this post


Link to post

Hi guys, from what I see we almost have the complete NRTFL maps, now that they mention it we have not been able to finish our maps for several time factors and apart from what I am really busy, I will release some slots of our maps for you.

 

@MajorRawne, in good theory at the end of the project, all of us with our discoveries will have to create the "PSX Doom Hacker's Bible", for the future.

The next beta I have planned for the end of March or early April.

 

Another small view of the PSXDOOM audio code, what I'm working on right now::

 

Spoiler

int wess_load_module (void *wmd_ptr,
                      char *memory_pointer,
                      int memory_allowance,
                      int **settings_tag_lists)
{
#ifndef BLOCK_SOUND_WESS

    int i, j, k, n, z, types, num, indx, loadit;
	int tracks_toload;
	int readrequest, readresult;
	char max_tracks_inseq, max_voices_intrk, max_substack_intrk;
	char *pdest;
	char *pmem;
	unsigned long patfpos, trkinfosize;
	char *tempwmd;
	int setting, flag, flag2;

	mem_limit = memory_allowance;
	tempwmd = wmd_ptr;

	if (module_loaded)
	{
		wess_unload_module();
	}

	num_sd = get_num_Wess_Sound_Drivers(settings_tag_lists);
	printf("num_sd %d\n", num_sd);

	if (memory_pointer == NULL)
	{
		wmd_mem_is_mine = 1;
		if (tempwmd == NULL)
		{
			return(module_loaded);
		}
	}
	else {
		wmd_mem_is_mine = 0;
		wmd_mem = memory_pointer;
	}

	wmd_size = memory_allowance;
	zeroset(wmd_mem, wmd_size);

	max_seq_num = 0;

	if (!Is_System_Active())
	{
		free_mem_if_mine();
		return (module_loaded);
	}

	if (tempwmd == NULL)
	{
		free_mem_if_mine();
		return (module_loaded);
	}

	/*if (!(fp_wmd_file = module_open(wmd_filename)))
	{
		err(wess_FOPEN);
		free_mem_if_mine();
		return (module_loaded);
	}*/

	max_tracks_inseq = MINIMUM_TRACK_INDXS_FOR_A_SEQUENCE;
	printf("max_tracks_inseq %d\n", max_tracks_inseq);
	max_voices_intrk = 0;
	max_substack_intrk = 0;

	/* loads a related group of patches and sequences */
	/* a module has the information necessary to set up sequencer work
	areas and data areas */
	/*
	The module loading sequence works as follows :
	*/

	pmem = wmd_mem;

	/*
	- allocate space for a master_status_structure
	- update the pmasterstat pointer
	*/

	pm_stat = (master_status_structure *)pmem;
	pmem += sizeof(*pm_stat);

	pm_stat->fp_module = (int)fp_wmd_file;//falta verificar
	pm_stat->pabstime = &millicount;

	/*
	- allocate for the module_data structure
	- update the pmod_info pointer
	*/

	pm_stat->pmod_info = (module_data *)pmem;
	pmem += sizeof(*pm_stat->pmod_info);

	/*
	- read in sizeof(pm_stat->pmod_info->mod_hdr)
	bytes from the .lmd file into the pm_stat->pmod_info->mod_hdr
	structure.
	*/

	wmd_file_ptr2 = tempwmd;
	wmd_file_ptr = wmd_file_ptr2;

	readrequest = sizeof(pm_stat->pmod_info->mod_hdr);
	//module_read(&pm_stat->pmod_info->mod_hdr, tempwmd, readrequest);
	module_memcpy(&pm_stat->pmod_info->mod_hdr, tempwmd, readrequest);
	wmd_file_ptr += readrequest;

	//readresult = module_read(&pm_stat->pmod_info->mod_hdr, readrequest, fp_wmd_file);
	/*if (readrequest != readresult)
	{
		//err(wess_FREAD);
		free_mem_if_mine();
		return(0);
	}*/

	if ((pm_stat->pmod_info->mod_hdr.module_id_text != WESS_SSSP_TEXT) ||
		(pm_stat->pmod_info->mod_hdr.module_version != WESS_CORE_VERSION))
	{
		free_mem_if_mine();
		return(0);
	}
	printf("WESS_SSSP_TEXT %x\n", pm_stat->pmod_info->mod_hdr.module_id_text);
	printf("WESS_CORE_VERSION %x\n", pm_stat->pmod_info->mod_hdr.module_version);

	/*
	--init work structures --------------------------------------------
	- allocate and initialize space for
	pmod_info->mod_hdr.seq_work_areas sequence_status structures
	and update the pmseqstattbl pointer and zero seqs_active.
	*/

	pm_stat->pseqstattbl = (sequence_status *)pmem;
	pmem += sizeof(*pm_stat->pseqstattbl) *
		pm_stat->pmod_info->mod_hdr.seq_work_areas;

	/*
	- allocate and initialize space for
	pmod_info->mod_hdr.trk_work_areas track_status structures
	and update the pmtrkstattbl pointer and zero trks_active.
	*/

	pm_stat->ptrkstattbl = (track_status *)pmem;
	pmem += sizeof(*pm_stat->ptrkstattbl) *
		pm_stat->pmod_info->mod_hdr.trk_work_areas;

	/*
	--load data structures --------------------------------------------
	- update pm_stat->patch_types with the sb_num global and
	allocate and copy in pm_stat->patch_types bytes
	of the patch_id_list and update the pm_stat->ppat_id_list pointer.
	*/

	pm_stat->patch_types_loaded = num_sd;

	/*
	- allocate and initialize space for master_volumes of each
	patch type loaded.
	*/

	pm_stat->pmaster_volume = (char *)pmem;
	pmem += sizeof(char) * pm_stat->patch_types_loaded;
#if _ALIGN4_ == 1
	//force align to word boundary because previous pmem adjust
	//may wind up with odd address
	pmem += (unsigned int)pmem & 1;
	pmem += (unsigned int)pmem & 2;
#endif


	pdest = pm_stat->pmaster_volume;
	n = pm_stat->patch_types_loaded;
	while (n--)
	{
		*pdest++ = 0x80;
	}


	/*
	- allocate and initialize space for
	pm_stat->patch_types patch_group_data structures
	and update the pm_stat->ppat_info pointer.
	*/

	pm_stat->ppat_info = (patch_group_data *)pmem;
	pmem += sizeof(*pm_stat->ppat_info) * pm_stat->patch_types_loaded;

	//printf("here\n");

	if (settings_tag_lists)
	{
		k = pm_stat->patch_types_loaded;
		//printf("k %d\n", k);
		while (k--)
		{
			/* get the settings tags for this patch type */

			/*
			copy settings_tag_lists to the patch's sndhw_tags array
			*/
			z = 0;

			while (settings_tag_lists[k][z] != SNDHW_TAG_END)
			{
				(pm_stat->ppat_info + k)->sndhw_tags[z] = settings_tag_lists[k][z];
				(pm_stat->ppat_info + k)->sndhw_tags[z + 1] = settings_tag_lists[k][z + 1];

				if ((pm_stat->ppat_info + k)->sndhw_tags[z] == SNDHW_TAG_DRIVER_ID)
				{
					(pm_stat->ppat_info + k)->hw_tl_list.hardware_ID = (pm_stat->ppat_info + k)->sndhw_tags[z + 1];
				}
				else if ((pm_stat->ppat_info + k)->sndhw_tags[z] == SNDHW_TAG_SOUND_EFFECTS)
				{
					setting = (pm_stat->ppat_info + k)->sndhw_tags[z + 1];
					flag = (pm_stat->ppat_info + k)->hw_tl_list.flags_load;

					flag2 = flag & ~TAG_SOUND_EFFECTS;
					flag = (flag & 1 | setting) & 1;
					(pm_stat->ppat_info + k)->hw_tl_list.flags_load = (flag2 | flag);
				}
				else if ((pm_stat->ppat_info + k)->sndhw_tags[z] == SNDHW_TAG_MUSIC)
				{
					setting = (pm_stat->ppat_info + k)->sndhw_tags[z + 1];
					flag = (pm_stat->ppat_info + k)->hw_tl_list.flags_load;

					flag2 = flag & ~TAG_MUSIC;
					flag = ((flag >> 1 & 1 | setting) & 1) << 1;
					(pm_stat->ppat_info + k)->hw_tl_list.flags_load = (flag2 | flag);
				}
				else if ((pm_stat->ppat_info + k)->sndhw_tags[z] == SNDHW_TAG_DRUMS)
				{
					setting = (pm_stat->ppat_info + k)->sndhw_tags[z + 1];
					flag = (pm_stat->ppat_info + k)->hw_tl_list.flags_load;

					flag2 = flag & ~TAG_DRUMS;
					flag = ((flag >> 2 & 1 | setting) & 1) << 2;
					(pm_stat->ppat_info + k)->hw_tl_list.flags_load = (flag2 | flag);
				}

				/*if ((pm_stat->ppat_info + k)->sndhw_tags[z] == SNDHW_TAG_DRIVER_ID)
					(pm_stat->ppat_info + k)->hw_tl_list.hardware_ID = (pm_stat->ppat_info + k)->sndhw_tags[z + 1];
				else if ((pm_stat->ppat_info + k)->sndhw_tags[z] == SNDHW_TAG_SOUND_EFFECTS)
					(pm_stat->ppat_info + k)->hw_tl_list.sfxload |= (pm_stat->ppat_info + k)->sndhw_tags[z + 1];
				else if ((pm_stat->ppat_info + k)->sndhw_tags[z] == SNDHW_TAG_MUSIC)
					(pm_stat->ppat_info + k)->hw_tl_list.musload |= (pm_stat->ppat_info + k)->sndhw_tags[z + 1];
				else if ((pm_stat->ppat_info + k)->sndhw_tags[z] == SNDHW_TAG_DRUMS)
					(pm_stat->ppat_info + k)->hw_tl_list.drmload |= (pm_stat->ppat_info + k)->sndhw_tags[z + 1];*/

				z += 2;
			}
		}
	}

	//printf("z %d\n", z);

	/*
	- for pm_stat->patch_types scan through the
	pm_stat->pmod_info->pmod_hdr.patch_types_infile
	and load each patch_area with a matching patch_id
	*/

	pm_stat->voices_total = 0;

	j = pm_stat->pmod_info->mod_hdr.patch_types_infile;
	while (j--)
	{
		readrequest = sizeof(scratch_pat_grp_hdr);
		printf("readrequest %d\n", readrequest);
		//module_read(&scratch_pat_grp_hdr, wmd_file_ptr, readrequest);
		module_memcpy(&scratch_pat_grp_hdr, wmd_file_ptr, readrequest);
		wmd_file_ptr += readrequest;

		printf("load_flags %d\n", (unsigned int)scratch_pat_grp_hdr.load_flags);

		/*readresult = module_read(&scratch_pat_grp_hdr, readrequest, fp_wmd_file);
		if (readrequest != readresult)
		{
			err(wess_FREAD);
			free_mem_if_mine();
			return(0);
		}*/

		k = pm_stat->patch_types_loaded;
		while (k--)
		{
			if (scratch_pat_grp_hdr.patch_id == (pm_stat->ppat_info + k)->hw_tl_list.hardware_ID)
			{
				memcpy(&(pm_stat->ppat_info + k)->pat_grp_hdr,
					&scratch_pat_grp_hdr,
					sizeof(scratch_pat_grp_hdr));

				/*(pm_stat->ppat_info + k)->pat_grp_hdr.load_flags = scratch_pat_grp_hdr.load_flags;
				(pm_stat->ppat_info + k)->pat_grp_hdr.patch_id = scratch_pat_grp_hdr.patch_id;
				//(pm_stat->ppat_info + k)->pat_grp_hdr.hw_voice_limit = scratch_pat_grp_hdr.hw_voice_limit;//
				//(pm_stat->ppat_info + k)->pat_grp_hdr.pad1 = scratch_pat_grp_hdr.pad1;//
				(pm_stat->ppat_info + k)->pat_grp_hdr.patches = scratch_pat_grp_hdr.patches;
				//(pm_stat->ppat_info + k)->pat_grp_hdr.patch_size = scratch_pat_grp_hdr.patch_size;//
				(pm_stat->ppat_info + k)->pat_grp_hdr.patchmaps = scratch_pat_grp_hdr.patchmaps;
				//(pm_stat->ppat_info + k)->pat_grp_hdr.patchmap_size = scratch_pat_grp_hdr.patchmap_size;//
				(pm_stat->ppat_info + k)->pat_grp_hdr.patchinfo = scratch_pat_grp_hdr.patchinfo;
				//(pm_stat->ppat_info + k)->pat_grp_hdr.patchinfo_size = scratch_pat_grp_hdr.patchinfo_size;//
				(pm_stat->ppat_info + k)->pat_grp_hdr.drummaps = scratch_pat_grp_hdr.drummaps;
				//(pm_stat->ppat_info + k)->pat_grp_hdr.drummap_size = scratch_pat_grp_hdr.drummap_size;//
				(pm_stat->ppat_info + k)->pat_grp_hdr.extra_data_size = scratch_pat_grp_hdr.extra_data_size;*/

				pm_stat->voices_total += scratch_pat_grp_hdr.hw_voice_limit;

				(pm_stat->ppat_info + k)->ppat_data = pmem;

				//patfpos = module_tell(fp_wmd_file);

				//?? Checkear
				patfpos = (unsigned long)((unsigned long)wmd_file_ptr - (unsigned long)wmd_file_ptr2);
				printf("patfpos %d\n", patfpos);


				(pm_stat->ppat_info + k)->data_fileposition = patfpos;

				if (!conditional_read(scratch_pat_grp_hdr.load_flags & LOAD_PATCHES,
					&pmem,
					(int)scratch_pat_grp_hdr.patches *
					(int)scratch_pat_grp_hdr.patch_size))
				{
					return(0);
				}

				if (!conditional_read(scratch_pat_grp_hdr.load_flags & LOAD_PATCHMAPS,
					&pmem,
					(int)scratch_pat_grp_hdr.patchmaps *
					(int)scratch_pat_grp_hdr.patchmap_size))
				{
					return(0);
				}

				if (!conditional_read(scratch_pat_grp_hdr.load_flags & LOAD_PATCHINFO,
					&pmem,
					(int)scratch_pat_grp_hdr.patchinfo *
					(int)scratch_pat_grp_hdr.patchinfo_size))
				{
					return(0);
				}

				if (!conditional_read(scratch_pat_grp_hdr.load_flags & LOAD_DRUMMAPS,
					&pmem,
					(int)scratch_pat_grp_hdr.drummaps *
					(int)scratch_pat_grp_hdr.drummap_size))
				{
					return(0);
				}

				if (!conditional_read(scratch_pat_grp_hdr.load_flags & LOAD_EXTRADATA,
					&pmem,
					(int)scratch_pat_grp_hdr.extra_data_size))
				{
					return(0);
				}

				break;
			}
		}
	}

	/*
	- allocate and initialize space for
	voice_total voice_status structures
	and update the pmvoicestattbl pointer and zero voices_active.
	*/

	pm_stat->pvoicestattbl = (voice_status *)pmem;
	pmem += sizeof(*pm_stat->pvoicestattbl) * pm_stat->voices_total;

	/*
	- initialize patch_type parameter for each voice work area.
	only the amount of hardware voices possible for each
	patch_type loaded will have voice work areas!!!
	you will run out of voice work areas for a given patch type
	at the same time you have run out of hardware polyphony!!!
	eh,eh,this is cool!,eh,eh
	*/

	if (pm_stat->patch_types_loaded)
	{
		types = pm_stat->patch_types_loaded;
		n = 0;
		num = (pm_stat->ppat_info + n)->pat_grp_hdr.hw_voice_limit;
		indx = 0;

		for (i = 0; i<pm_stat->voices_total; i++)
		{
			if (types)
			{
				if (num--)
				{
					(pm_stat->pvoicestattbl + i)->patchtype =
						(pm_stat->ppat_info + n)->pat_grp_hdr.patch_id;
					(pm_stat->pvoicestattbl + i)->refindx = indx++;//ó 0
				}
				else {
					n++;
					if (--types)
					{
						num = (pm_stat->ppat_info + n)->pat_grp_hdr.hw_voice_limit;
						indx = 0;
						if (num--)
						{
							(pm_stat->pvoicestattbl + i)->patchtype =
								(pm_stat->ppat_info + n)->pat_grp_hdr.patch_id;
							(pm_stat->pvoicestattbl + i)->refindx = indx++;
						}
					}
				}
			}
		}
	}

	/*
	- allocate and initialize space for
	pmod_info->mod_hdr.sequences sequence_data structures
	and update the pmod_info->pseq_info pointer.
	*/

	pm_stat->pmod_info->pseq_info = (sequence_data *)pmem;
	pmem += sizeof(*pm_stat->pmod_info->pseq_info) *
		pm_stat->pmod_info->mod_hdr.sequences;

	/*
	- for mod_hdr.sequences fill the sequence_data structures :
	read in pseq_info->seq_hdr,
	save fp_wmd_file pointer and
	scan throuch pseq_info->seq_hdr.tracks of track_headers
	seeking over the data to get to each header and
	increment track_toload for each voice_type matching any
	members of the pm_stat->ppat_id_list
	update pseq_info->ptrk_info pointer and
	allocate the resultant track_toload track_data structures
	seek to the saved fp_wmd_file pointer and read in each
	track_hdr with a voice_type matching the pm_stat->ppat_id_list
	and allocate and read in the corresponding data section :
	point pseq_info->ptrk_info->ptrk_data at this area,
	read in pseq_info->ptrk_info->data_size to this pointer.
	seek over non matching tracks.
	assign pseq_info->tracks = tracks_toload,
	for pseq_info->tracks fill the track_data structures that are
	of correct voices_type :
	read in sizeof(pseq_info->ptrk_info->trk_hdr),
	if it is in the tracks_toload the
	allocate pseq_info->ptrk_info->trk_hdr.voices_max chars,
	point pseq_info->ptrk_info->pvoices_indx at this area,
	allocate pseq_info->ptrk_info->trk_hdr.substack_size pointers,
	point pseq_info->ptrk_info->psubstack at this area,
	allocate pseq_info->ptrk_info->trk_hdr.labellist_size pointers,
	point pseq_info->ptrk_info->plabellist at this area,
	allocate pseq_info->ptrk_info->trk_hdr.data_size chars,
	update pm_stat->pmod_info->pseq_info->seq_hdr.tracks for
	each sequence with the number of tracks actually loaded.
	*/

	for (i = 0; i<pm_stat->pmod_info->mod_hdr.sequences; i++)
	{
		patfpos = (unsigned long)((unsigned long)wmd_file_ptr - (unsigned long)wmd_file_ptr2);
        printf("--------\n");
        printf("num %d\n",i);
        printf("patfpos %d\n", patfpos);
		readrequest = sizeof(pm_stat->pmod_info->pseq_info->seq_hdr);
		printf("readrequest %d\n", readrequest);

		//module_read(&(pm_stat->pmod_info->pseq_info + i)->seq_hdr, wmd_file_ptr, readrequest);
		module_memcpy(&(pm_stat->pmod_info->pseq_info + i)->seq_hdr, wmd_file_ptr, readrequest);
		wmd_file_ptr += readrequest;

		/*patfpos = module_tell(fp_wmd_file);

		readrequest = sizeof(pm_stat->pmod_info->pseq_info->seq_hdr);
		readresult = module_read(&(pm_stat->pmod_info->pseq_info + i)->seq_hdr, readrequest, fp_wmd_file);
		if (readrequest != readresult)
		{
			err(wess_FREAD);
			free_mem_if_mine();
			return(0);
		}*/


		tracks_toload = 0;
		trkinfosize = 0;


		j = (pm_stat->pmod_info->pseq_info + i)->seq_hdr.tracks;
		printf("tracks %d\n", j);
		while (j--)
		{
			readrequest = sizeof(scratch_trk_hdr);
			printf("readrequest %d\n", readrequest);
			//module_read(&scratch_trk_hdr, wmd_file_ptr, readrequest);
			module_memcpy(&scratch_trk_hdr, wmd_file_ptr, readrequest);

			/*printf("voices_type %d\n",scratch_trk_hdr.voices_type);
            printf("voices_max %d\n",scratch_trk_hdr.voices_max);
            printf("priority %d\n",scratch_trk_hdr.priority);
            printf("lockchannel %d\n",scratch_trk_hdr.lockchannel);
            printf("voices_class %d\n",scratch_trk_hdr.voices_class);
            printf("reverb %d\n",scratch_trk_hdr.reverb);
            printf("initpatchnum %d\n",scratch_trk_hdr.initpatchnum);
            printf("initpitch_cntrl %d\n",scratch_trk_hdr.initpitch_cntrl);
            printf("initvolume_cntrl %d\n",scratch_trk_hdr.initvolume_cntrl);
            printf("initpan_cntrl %d\n",scratch_trk_hdr.initpan_cntrl);
            printf("substack_count %d\n",scratch_trk_hdr.substack_count);
            printf("mutebits %d\n",scratch_trk_hdr.mutebits);
            printf("initppq %d\n",scratch_trk_hdr.initppq);
            printf("initqpm %d\n",scratch_trk_hdr.initqpm);
            printf("labellist_count %d\n",scratch_trk_hdr.labellist_count);
            printf("data_size %d\n",scratch_trk_hdr.data_size);*/

			wmd_file_ptr += readrequest;

			/*readresult = module_read(&scratch_trk_hdr, readrequest, fp_wmd_file);
			if (readrequest != readresult)
			{
				err(wess_FREAD);
				free_mem_if_mine();
				return(0);
			}*/

			loadit = 0;
			if ((scratch_trk_hdr.voices_type == NoSound_ID) ||
				(scratch_trk_hdr.voices_type == GENERIC_ID))
			{
				loadit = 1;
			}
			else {
				k = pm_stat->patch_types_loaded;
				while (k--)
				{
					/*if (((scratch_trk_hdr.voices_type == (pm_stat->ppat_info + k)->hw_tl_list.hardware_ID) &&
						(((scratch_trk_hdr.voices_class == SNDFX_CLASS) && (pm_stat->ppat_info + k)->hw_tl_list.sfxload) ||
						((scratch_trk_hdr.voices_class == SFXDRUMS_CLASS) && (pm_stat->ppat_info + k)->hw_tl_list.sfxload) ||
							((scratch_trk_hdr.voices_class == MUSIC_CLASS) && (pm_stat->ppat_info + k)->hw_tl_list.musload) ||
							((scratch_trk_hdr.voices_class == DRUMS_CLASS) && (pm_stat->ppat_info + k)->hw_tl_list.drmload))))*/
					if (((scratch_trk_hdr.voices_type == (pm_stat->ppat_info + k)->hw_tl_list.hardware_ID) &&
						(((scratch_trk_hdr.voices_class == SNDFX_CLASS) && ((pm_stat->ppat_info + k)->hw_tl_list.flags_load & TAG_SOUND_EFFECTS)) ||
						((scratch_trk_hdr.voices_class == SFXDRUMS_CLASS) && ((pm_stat->ppat_info + k)->hw_tl_list.flags_load & TAG_SOUND_EFFECTS)) ||
							((scratch_trk_hdr.voices_class == MUSIC_CLASS) && ((pm_stat->ppat_info + k)->hw_tl_list.flags_load & TAG_MUSIC)) ||
							((scratch_trk_hdr.voices_class == DRUMS_CLASS) && ((pm_stat->ppat_info + k)->hw_tl_list.flags_load & TAG_DRUMS)))))
					{
						loadit = 1;
						break;
					}
				}
			}

			printf("loadit %d\n", loadit);
			if (loadit)
			{

				trkinfosize += sizeof(*pm_stat->pmod_info->pseq_info->ptrk_info) +
					(scratch_trk_hdr.labellist_count * sizeof(long)) +
					scratch_trk_hdr.data_size;

                printf("trkinfosize %d\n", trkinfosize);
#if _ALIGN4_ == 1
				//force align to word boundary because previous size adjust
				//may wind up with odd address
				trkinfosize += trkinfosize & 1;
				trkinfosize += trkinfosize & 2;
#endif

				if (scratch_trk_hdr.voices_max > max_voices_intrk)
				{
					max_voices_intrk = scratch_trk_hdr.voices_max;
				}

				if (scratch_trk_hdr.substack_count > max_substack_intrk)
				{
					max_substack_intrk = scratch_trk_hdr.substack_count;
				}

				tracks_toload++;
			}

			wmd_file_ptr += (scratch_trk_hdr.labellist_count * sizeof(long)) +
				scratch_trk_hdr.data_size;

			/*if (module_seek(fp_wmd_file,
				(scratch_trk_hdr.labellist_count * sizeof(long)) +
				scratch_trk_hdr.data_size,
				SEEK_CUR))
			{
				err(wess_FSEEK);
				free_mem_if_mine();
				return(0);
			}*/
		}

		if (tracks_toload>max_tracks_inseq)
		{
			max_tracks_inseq = tracks_toload;
		}

		if (tracks_toload == 0)
		{
			/* since there are no tracks to load we create area for the
			track info + 2 (0 delta and TrkEnd) */
			trkinfosize = sizeof(*pm_stat->pmod_info->pseq_info->ptrk_info) + 2;
#if _ALIGN4_ == 1
			//force align to word boundary because previous size adjust
			//may wind up with odd address
			trkinfosize += trkinfosize & 1;
			trkinfosize += trkinfosize & 2;
#endif

		}

		(pm_stat->pmod_info->pseq_info + i)->trkstoload = tracks_toload;
		(pm_stat->pmod_info->pseq_info + i)->trkinfolength = trkinfosize;
		(pm_stat->pmod_info->pseq_info + i)->fileposition = patfpos;
	}

	/* now we dont load the track data anymore */
	/* now we dont load the track data anymore */
	/* now we dont load the track data anymore */

	/*
	- allocate pm_stat->max_tracks_inseq chars for the ptrk_indxs
	pointers in each sequence_status structure.
	update each pointer to each area.
	initialize indexes to 0xFF.
	*/

	pm_stat->pcalltable = (callback_status *)pmem;
	pmem += sizeof(*pm_stat->pcalltable) *
		pm_stat->pmod_info->mod_hdr.callback_areas;

	pm_stat->max_trks_perseq = max_tracks_inseq;

	for (i = 0; i<pm_stat->pmod_info->mod_hdr.seq_work_areas; i++)
	{
		(pm_stat->pseqstattbl + i)->pgates = (char *)pmem;
		pmem += sizeof(char) *
			pm_stat->pmod_info->mod_hdr.gates_per_seq;
#if _ALIGN4_ == 1
		//force align to word boundary because previous pmem adjust
		//may wind up with odd address
		pmem += (unsigned int)pmem & 1;
		pmem += (unsigned int)pmem & 2;
#endif


		(pm_stat->pseqstattbl + i)->piters = (char *)pmem;
		pmem += sizeof(char) *
			pm_stat->pmod_info->mod_hdr.iters_per_seq;
#if _ALIGN4_ == 1
		//force align to word boundary because previous pmem adjust
		//may wind up with odd address
		pmem += (unsigned int)pmem & 1;
		pmem += (unsigned int)pmem & 2;
#endif


		j = max_tracks_inseq;//
		pdest = (pm_stat->pseqstattbl + i)->ptrk_indxs = (char *)pmem;
		pmem += sizeof(char) * j;
#if _ALIGN4_ == 1
		//force align to word boundary because previous pmem adjust
		//may wind up with odd address
		pmem += (unsigned int)pmem & 1;
		pmem += (unsigned int)pmem & 2;
#endif

		while (j--)
		{
			*pdest++ = 0xFF;
		}
	}

	/*
	- allocate pm_stat->max_voices_intrk chars for the pvoice_indxs
	pointers in each track_status structure.
	update each pointer to each area.
	initialize indexes to 0xFF.
	*/

	pm_stat->max_voices_pertrk = max_voices_intrk;

	pm_stat->max_substack_pertrk = max_substack_intrk;

	for (i = 0; i<pm_stat->pmod_info->mod_hdr.trk_work_areas; i++)
	{
		(pm_stat->ptrkstattbl + i)->refindx = i;
		(pm_stat->ptrkstattbl + i)->psubstack = (unsigned long *)pmem;
		/* (pm_stat->ptrkstattbl+i)->psp is set when sequence is triggered */
		pmem += sizeof(long) * pm_stat->max_substack_pertrk;
		(pm_stat->ptrkstattbl + i)->pstackend = (unsigned long *)pmem;
	}

	/* load the drivers here */
	/* load the drivers here */
	/* load the drivers for each patch type and update the CmdFuncArr */
	/* load the drivers here */
	/* load the drivers here */

	/* initialize the loaded drivers and SeqEngine */

	//CmdFuncArr[NoSound_ID][DriverInit]((track_status *)pm_stat);

	for (i = 0; i<pm_stat->patch_types_loaded; i++)
	{
		/*if ((pm_stat->ppat_info + i)->hw_tl_list.sfxload ||
			(pm_stat->ppat_info + i)->hw_tl_list.musload ||
			(pm_stat->ppat_info + i)->hw_tl_list.drmload)*/
		if (((pm_stat->ppat_info + i)->hw_tl_list.flags_load & (TAG_SOUND_EFFECTS| TAG_MUSIC| TAG_DRUMS)) != 0)
		{
			//CmdFuncArr[(pm_stat->ppat_info + i)->hw_tl_list.hardware_ID][DriverInit]((track_status *)pm_stat);
		}
	}

	//module_close(fp_wmd_file);

	max_seq_num = pm_stat->pmod_info->mod_hdr.sequences;

#if _ALIGN4_ == 1
	//force align to word boundary because previous pmem adjust
	//may wind up with odd address
	pmem += (unsigned int)pmem & 1;
	pmem += (unsigned int)pmem & 2;
#endif
	wmd_end = pmem;
	module_loaded = 1;
	SeqOn = 1;

	return (1);
#endif
}

int wess_seq_loader_init(void *input_pm_stat, char *seqfile, enum OpenSeqHandleFlag flag)
{
    printf("wess_seq_loader_init\n");

    seq_loader_enable = 0;
	seqfilename = seqfile;

	seq_pm_stat = input_pm_stat;

	if (seq_pm_stat)
	{
		seq_loader_enable = 1;

		base_track_header.priority = 0x80;
		base_track_header.initvolume_cntrl = 0x7f;
		base_track_header.initpan_cntrl = 0x40;
		base_track_header.initppq = 120;
		base_track_header.initqpm = 120;
		base_track_header.voices_type = 0;
		base_track_header.voices_max = 0;
		base_track_header.reverb = 0;
		base_track_header.voices_class = 0;
		base_track_header.initpatchnum = 0;
		base_track_header.initpitch_cntrl = 0;
		base_track_header.substack_count = 0;
		base_track_header.mutebits = 0;
		base_track_header.labellist_count = 0;
		base_track_header.data_size = 2;

		seq_maxsequences = seq_pm_stat->pmod_info->mod_hdr.sequences;
		seq_loader_enable = 1;

		if (flag == YesOpenSeqHandle)
		{
			if (!open_sequence_data())
			{
				wess_seq_err(SEQLOAD_FOPEN);
				return 0;
			}
			return 1;
		}
	}
	return 0;
}

The MK3 code has been very helpful. ;)

 

Share this post


Link to post
19 minutes ago, Erick194 said:

Hi guys, from what I see we almost have the complete NRTFL maps, now that they mention it we have not been able to finish our maps for several time factors and apart from what I am really busy, I will release some slots of our maps for you.

 

@MajorRawne, in good theory at the end of the project, all of us with our discoveries will have to create the "PSX Doom Hacker's Bible", for the future.

The next beta I have planned for the end of March or early April.

 

Another small view of the PSXDOOM audio code, what I'm working on right now::

 

  Hide contents


int wess_load_module (void *wmd_ptr,
                      char *memory_pointer,
                      int memory_allowance,
                      int **settings_tag_lists)
{
#ifndef BLOCK_SOUND_WESS

    int i, j, k, n, z, types, num, indx, loadit;
	int tracks_toload;
	int readrequest, readresult;
	char max_tracks_inseq, max_voices_intrk, max_substack_intrk;
	char *pdest;
	char *pmem;
	unsigned long patfpos, trkinfosize;
	char *tempwmd;
	int setting, flag, flag2;

	mem_limit = memory_allowance;
	tempwmd = wmd_ptr;

	if (module_loaded)
	{
		wess_unload_module();
	}

	num_sd = get_num_Wess_Sound_Drivers(settings_tag_lists);
	printf("num_sd %d\n", num_sd);

	if (memory_pointer == NULL)
	{
		wmd_mem_is_mine = 1;
		if (tempwmd == NULL)
		{
			return(module_loaded);
		}
	}
	else {
		wmd_mem_is_mine = 0;
		wmd_mem = memory_pointer;
	}

	wmd_size = memory_allowance;
	zeroset(wmd_mem, wmd_size);

	max_seq_num = 0;

	if (!Is_System_Active())
	{
		free_mem_if_mine();
		return (module_loaded);
	}

	if (tempwmd == NULL)
	{
		free_mem_if_mine();
		return (module_loaded);
	}

	/*if (!(fp_wmd_file = module_open(wmd_filename)))
	{
		err(wess_FOPEN);
		free_mem_if_mine();
		return (module_loaded);
	}*/

	max_tracks_inseq = MINIMUM_TRACK_INDXS_FOR_A_SEQUENCE;
	printf("max_tracks_inseq %d\n", max_tracks_inseq);
	max_voices_intrk = 0;
	max_substack_intrk = 0;

	/* loads a related group of patches and sequences */
	/* a module has the information necessary to set up sequencer work
	areas and data areas */
	/*
	The module loading sequence works as follows :
	*/

	pmem = wmd_mem;

	/*
	- allocate space for a master_status_structure
	- update the pmasterstat pointer
	*/

	pm_stat = (master_status_structure *)pmem;
	pmem += sizeof(*pm_stat);

	pm_stat->fp_module = (int)fp_wmd_file;//falta verificar
	pm_stat->pabstime = &millicount;

	/*
	- allocate for the module_data structure
	- update the pmod_info pointer
	*/

	pm_stat->pmod_info = (module_data *)pmem;
	pmem += sizeof(*pm_stat->pmod_info);

	/*
	- read in sizeof(pm_stat->pmod_info->mod_hdr)
	bytes from the .lmd file into the pm_stat->pmod_info->mod_hdr
	structure.
	*/

	wmd_file_ptr2 = tempwmd;
	wmd_file_ptr = wmd_file_ptr2;

	readrequest = sizeof(pm_stat->pmod_info->mod_hdr);
	//module_read(&pm_stat->pmod_info->mod_hdr, tempwmd, readrequest);
	module_memcpy(&pm_stat->pmod_info->mod_hdr, tempwmd, readrequest);
	wmd_file_ptr += readrequest;

	//readresult = module_read(&pm_stat->pmod_info->mod_hdr, readrequest, fp_wmd_file);
	/*if (readrequest != readresult)
	{
		//err(wess_FREAD);
		free_mem_if_mine();
		return(0);
	}*/

	if ((pm_stat->pmod_info->mod_hdr.module_id_text != WESS_SSSP_TEXT) ||
		(pm_stat->pmod_info->mod_hdr.module_version != WESS_CORE_VERSION))
	{
		free_mem_if_mine();
		return(0);
	}
	printf("WESS_SSSP_TEXT %x\n", pm_stat->pmod_info->mod_hdr.module_id_text);
	printf("WESS_CORE_VERSION %x\n", pm_stat->pmod_info->mod_hdr.module_version);

	/*
	--init work structures --------------------------------------------
	- allocate and initialize space for
	pmod_info->mod_hdr.seq_work_areas sequence_status structures
	and update the pmseqstattbl pointer and zero seqs_active.
	*/

	pm_stat->pseqstattbl = (sequence_status *)pmem;
	pmem += sizeof(*pm_stat->pseqstattbl) *
		pm_stat->pmod_info->mod_hdr.seq_work_areas;

	/*
	- allocate and initialize space for
	pmod_info->mod_hdr.trk_work_areas track_status structures
	and update the pmtrkstattbl pointer and zero trks_active.
	*/

	pm_stat->ptrkstattbl = (track_status *)pmem;
	pmem += sizeof(*pm_stat->ptrkstattbl) *
		pm_stat->pmod_info->mod_hdr.trk_work_areas;

	/*
	--load data structures --------------------------------------------
	- update pm_stat->patch_types with the sb_num global and
	allocate and copy in pm_stat->patch_types bytes
	of the patch_id_list and update the pm_stat->ppat_id_list pointer.
	*/

	pm_stat->patch_types_loaded = num_sd;

	/*
	- allocate and initialize space for master_volumes of each
	patch type loaded.
	*/

	pm_stat->pmaster_volume = (char *)pmem;
	pmem += sizeof(char) * pm_stat->patch_types_loaded;
#if _ALIGN4_ == 1
	//force align to word boundary because previous pmem adjust
	//may wind up with odd address
	pmem += (unsigned int)pmem & 1;
	pmem += (unsigned int)pmem & 2;
#endif


	pdest = pm_stat->pmaster_volume;
	n = pm_stat->patch_types_loaded;
	while (n--)
	{
		*pdest++ = 0x80;
	}


	/*
	- allocate and initialize space for
	pm_stat->patch_types patch_group_data structures
	and update the pm_stat->ppat_info pointer.
	*/

	pm_stat->ppat_info = (patch_group_data *)pmem;
	pmem += sizeof(*pm_stat->ppat_info) * pm_stat->patch_types_loaded;

	//printf("here\n");

	if (settings_tag_lists)
	{
		k = pm_stat->patch_types_loaded;
		//printf("k %d\n", k);
		while (k--)
		{
			/* get the settings tags for this patch type */

			/*
			copy settings_tag_lists to the patch's sndhw_tags array
			*/
			z = 0;

			while (settings_tag_lists[k][z] != SNDHW_TAG_END)
			{
				(pm_stat->ppat_info + k)->sndhw_tags[z] = settings_tag_lists[k][z];
				(pm_stat->ppat_info + k)->sndhw_tags[z + 1] = settings_tag_lists[k][z + 1];

				if ((pm_stat->ppat_info + k)->sndhw_tags[z] == SNDHW_TAG_DRIVER_ID)
				{
					(pm_stat->ppat_info + k)->hw_tl_list.hardware_ID = (pm_stat->ppat_info + k)->sndhw_tags[z + 1];
				}
				else if ((pm_stat->ppat_info + k)->sndhw_tags[z] == SNDHW_TAG_SOUND_EFFECTS)
				{
					setting = (pm_stat->ppat_info + k)->sndhw_tags[z + 1];
					flag = (pm_stat->ppat_info + k)->hw_tl_list.flags_load;

					flag2 = flag & ~TAG_SOUND_EFFECTS;
					flag = (flag & 1 | setting) & 1;
					(pm_stat->ppat_info + k)->hw_tl_list.flags_load = (flag2 | flag);
				}
				else if ((pm_stat->ppat_info + k)->sndhw_tags[z] == SNDHW_TAG_MUSIC)
				{
					setting = (pm_stat->ppat_info + k)->sndhw_tags[z + 1];
					flag = (pm_stat->ppat_info + k)->hw_tl_list.flags_load;

					flag2 = flag & ~TAG_MUSIC;
					flag = ((flag >> 1 & 1 | setting) & 1) << 1;
					(pm_stat->ppat_info + k)->hw_tl_list.flags_load = (flag2 | flag);
				}
				else if ((pm_stat->ppat_info + k)->sndhw_tags[z] == SNDHW_TAG_DRUMS)
				{
					setting = (pm_stat->ppat_info + k)->sndhw_tags[z + 1];
					flag = (pm_stat->ppat_info + k)->hw_tl_list.flags_load;

					flag2 = flag & ~TAG_DRUMS;
					flag = ((flag >> 2 & 1 | setting) & 1) << 2;
					(pm_stat->ppat_info + k)->hw_tl_list.flags_load = (flag2 | flag);
				}

				/*if ((pm_stat->ppat_info + k)->sndhw_tags[z] == SNDHW_TAG_DRIVER_ID)
					(pm_stat->ppat_info + k)->hw_tl_list.hardware_ID = (pm_stat->ppat_info + k)->sndhw_tags[z + 1];
				else if ((pm_stat->ppat_info + k)->sndhw_tags[z] == SNDHW_TAG_SOUND_EFFECTS)
					(pm_stat->ppat_info + k)->hw_tl_list.sfxload |= (pm_stat->ppat_info + k)->sndhw_tags[z + 1];
				else if ((pm_stat->ppat_info + k)->sndhw_tags[z] == SNDHW_TAG_MUSIC)
					(pm_stat->ppat_info + k)->hw_tl_list.musload |= (pm_stat->ppat_info + k)->sndhw_tags[z + 1];
				else if ((pm_stat->ppat_info + k)->sndhw_tags[z] == SNDHW_TAG_DRUMS)
					(pm_stat->ppat_info + k)->hw_tl_list.drmload |= (pm_stat->ppat_info + k)->sndhw_tags[z + 1];*/

				z += 2;
			}
		}
	}

	//printf("z %d\n", z);

	/*
	- for pm_stat->patch_types scan through the
	pm_stat->pmod_info->pmod_hdr.patch_types_infile
	and load each patch_area with a matching patch_id
	*/

	pm_stat->voices_total = 0;

	j = pm_stat->pmod_info->mod_hdr.patch_types_infile;
	while (j--)
	{
		readrequest = sizeof(scratch_pat_grp_hdr);
		printf("readrequest %d\n", readrequest);
		//module_read(&scratch_pat_grp_hdr, wmd_file_ptr, readrequest);
		module_memcpy(&scratch_pat_grp_hdr, wmd_file_ptr, readrequest);
		wmd_file_ptr += readrequest;

		printf("load_flags %d\n", (unsigned int)scratch_pat_grp_hdr.load_flags);

		/*readresult = module_read(&scratch_pat_grp_hdr, readrequest, fp_wmd_file);
		if (readrequest != readresult)
		{
			err(wess_FREAD);
			free_mem_if_mine();
			return(0);
		}*/

		k = pm_stat->patch_types_loaded;
		while (k--)
		{
			if (scratch_pat_grp_hdr.patch_id == (pm_stat->ppat_info + k)->hw_tl_list.hardware_ID)
			{
				memcpy(&(pm_stat->ppat_info + k)->pat_grp_hdr,
					&scratch_pat_grp_hdr,
					sizeof(scratch_pat_grp_hdr));

				/*(pm_stat->ppat_info + k)->pat_grp_hdr.load_flags = scratch_pat_grp_hdr.load_flags;
				(pm_stat->ppat_info + k)->pat_grp_hdr.patch_id = scratch_pat_grp_hdr.patch_id;
				//(pm_stat->ppat_info + k)->pat_grp_hdr.hw_voice_limit = scratch_pat_grp_hdr.hw_voice_limit;//
				//(pm_stat->ppat_info + k)->pat_grp_hdr.pad1 = scratch_pat_grp_hdr.pad1;//
				(pm_stat->ppat_info + k)->pat_grp_hdr.patches = scratch_pat_grp_hdr.patches;
				//(pm_stat->ppat_info + k)->pat_grp_hdr.patch_size = scratch_pat_grp_hdr.patch_size;//
				(pm_stat->ppat_info + k)->pat_grp_hdr.patchmaps = scratch_pat_grp_hdr.patchmaps;
				//(pm_stat->ppat_info + k)->pat_grp_hdr.patchmap_size = scratch_pat_grp_hdr.patchmap_size;//
				(pm_stat->ppat_info + k)->pat_grp_hdr.patchinfo = scratch_pat_grp_hdr.patchinfo;
				//(pm_stat->ppat_info + k)->pat_grp_hdr.patchinfo_size = scratch_pat_grp_hdr.patchinfo_size;//
				(pm_stat->ppat_info + k)->pat_grp_hdr.drummaps = scratch_pat_grp_hdr.drummaps;
				//(pm_stat->ppat_info + k)->pat_grp_hdr.drummap_size = scratch_pat_grp_hdr.drummap_size;//
				(pm_stat->ppat_info + k)->pat_grp_hdr.extra_data_size = scratch_pat_grp_hdr.extra_data_size;*/

				pm_stat->voices_total += scratch_pat_grp_hdr.hw_voice_limit;

				(pm_stat->ppat_info + k)->ppat_data = pmem;

				//patfpos = module_tell(fp_wmd_file);

				//?? Checkear
				patfpos = (unsigned long)((unsigned long)wmd_file_ptr - (unsigned long)wmd_file_ptr2);
				printf("patfpos %d\n", patfpos);


				(pm_stat->ppat_info + k)->data_fileposition = patfpos;

				if (!conditional_read(scratch_pat_grp_hdr.load_flags & LOAD_PATCHES,
					&pmem,
					(int)scratch_pat_grp_hdr.patches *
					(int)scratch_pat_grp_hdr.patch_size))
				{
					return(0);
				}

				if (!conditional_read(scratch_pat_grp_hdr.load_flags & LOAD_PATCHMAPS,
					&pmem,
					(int)scratch_pat_grp_hdr.patchmaps *
					(int)scratch_pat_grp_hdr.patchmap_size))
				{
					return(0);
				}

				if (!conditional_read(scratch_pat_grp_hdr.load_flags & LOAD_PATCHINFO,
					&pmem,
					(int)scratch_pat_grp_hdr.patchinfo *
					(int)scratch_pat_grp_hdr.patchinfo_size))
				{
					return(0);
				}

				if (!conditional_read(scratch_pat_grp_hdr.load_flags & LOAD_DRUMMAPS,
					&pmem,
					(int)scratch_pat_grp_hdr.drummaps *
					(int)scratch_pat_grp_hdr.drummap_size))
				{
					return(0);
				}

				if (!conditional_read(scratch_pat_grp_hdr.load_flags & LOAD_EXTRADATA,
					&pmem,
					(int)scratch_pat_grp_hdr.extra_data_size))
				{
					return(0);
				}

				break;
			}
		}
	}

	/*
	- allocate and initialize space for
	voice_total voice_status structures
	and update the pmvoicestattbl pointer and zero voices_active.
	*/

	pm_stat->pvoicestattbl = (voice_status *)pmem;
	pmem += sizeof(*pm_stat->pvoicestattbl) * pm_stat->voices_total;

	/*
	- initialize patch_type parameter for each voice work area.
	only the amount of hardware voices possible for each
	patch_type loaded will have voice work areas!!!
	you will run out of voice work areas for a given patch type
	at the same time you have run out of hardware polyphony!!!
	eh,eh,this is cool!,eh,eh
	*/

	if (pm_stat->patch_types_loaded)
	{
		types = pm_stat->patch_types_loaded;
		n = 0;
		num = (pm_stat->ppat_info + n)->pat_grp_hdr.hw_voice_limit;
		indx = 0;

		for (i = 0; i<pm_stat->voices_total; i++)
		{
			if (types)
			{
				if (num--)
				{
					(pm_stat->pvoicestattbl + i)->patchtype =
						(pm_stat->ppat_info + n)->pat_grp_hdr.patch_id;
					(pm_stat->pvoicestattbl + i)->refindx = indx++;//ó 0
				}
				else {
					n++;
					if (--types)
					{
						num = (pm_stat->ppat_info + n)->pat_grp_hdr.hw_voice_limit;
						indx = 0;
						if (num--)
						{
							(pm_stat->pvoicestattbl + i)->patchtype =
								(pm_stat->ppat_info + n)->pat_grp_hdr.patch_id;
							(pm_stat->pvoicestattbl + i)->refindx = indx++;
						}
					}
				}
			}
		}
	}

	/*
	- allocate and initialize space for
	pmod_info->mod_hdr.sequences sequence_data structures
	and update the pmod_info->pseq_info pointer.
	*/

	pm_stat->pmod_info->pseq_info = (sequence_data *)pmem;
	pmem += sizeof(*pm_stat->pmod_info->pseq_info) *
		pm_stat->pmod_info->mod_hdr.sequences;

	/*
	- for mod_hdr.sequences fill the sequence_data structures :
	read in pseq_info->seq_hdr,
	save fp_wmd_file pointer and
	scan throuch pseq_info->seq_hdr.tracks of track_headers
	seeking over the data to get to each header and
	increment track_toload for each voice_type matching any
	members of the pm_stat->ppat_id_list
	update pseq_info->ptrk_info pointer and
	allocate the resultant track_toload track_data structures
	seek to the saved fp_wmd_file pointer and read in each
	track_hdr with a voice_type matching the pm_stat->ppat_id_list
	and allocate and read in the corresponding data section :
	point pseq_info->ptrk_info->ptrk_data at this area,
	read in pseq_info->ptrk_info->data_size to this pointer.
	seek over non matching tracks.
	assign pseq_info->tracks = tracks_toload,
	for pseq_info->tracks fill the track_data structures that are
	of correct voices_type :
	read in sizeof(pseq_info->ptrk_info->trk_hdr),
	if it is in the tracks_toload the
	allocate pseq_info->ptrk_info->trk_hdr.voices_max chars,
	point pseq_info->ptrk_info->pvoices_indx at this area,
	allocate pseq_info->ptrk_info->trk_hdr.substack_size pointers,
	point pseq_info->ptrk_info->psubstack at this area,
	allocate pseq_info->ptrk_info->trk_hdr.labellist_size pointers,
	point pseq_info->ptrk_info->plabellist at this area,
	allocate pseq_info->ptrk_info->trk_hdr.data_size chars,
	update pm_stat->pmod_info->pseq_info->seq_hdr.tracks for
	each sequence with the number of tracks actually loaded.
	*/

	for (i = 0; i<pm_stat->pmod_info->mod_hdr.sequences; i++)
	{
		patfpos = (unsigned long)((unsigned long)wmd_file_ptr - (unsigned long)wmd_file_ptr2);
        printf("--------\n");
        printf("num %d\n",i);
        printf("patfpos %d\n", patfpos);
		readrequest = sizeof(pm_stat->pmod_info->pseq_info->seq_hdr);
		printf("readrequest %d\n", readrequest);

		//module_read(&(pm_stat->pmod_info->pseq_info + i)->seq_hdr, wmd_file_ptr, readrequest);
		module_memcpy(&(pm_stat->pmod_info->pseq_info + i)->seq_hdr, wmd_file_ptr, readrequest);
		wmd_file_ptr += readrequest;

		/*patfpos = module_tell(fp_wmd_file);

		readrequest = sizeof(pm_stat->pmod_info->pseq_info->seq_hdr);
		readresult = module_read(&(pm_stat->pmod_info->pseq_info + i)->seq_hdr, readrequest, fp_wmd_file);
		if (readrequest != readresult)
		{
			err(wess_FREAD);
			free_mem_if_mine();
			return(0);
		}*/


		tracks_toload = 0;
		trkinfosize = 0;


		j = (pm_stat->pmod_info->pseq_info + i)->seq_hdr.tracks;
		printf("tracks %d\n", j);
		while (j--)
		{
			readrequest = sizeof(scratch_trk_hdr);
			printf("readrequest %d\n", readrequest);
			//module_read(&scratch_trk_hdr, wmd_file_ptr, readrequest);
			module_memcpy(&scratch_trk_hdr, wmd_file_ptr, readrequest);

			/*printf("voices_type %d\n",scratch_trk_hdr.voices_type);
            printf("voices_max %d\n",scratch_trk_hdr.voices_max);
            printf("priority %d\n",scratch_trk_hdr.priority);
            printf("lockchannel %d\n",scratch_trk_hdr.lockchannel);
            printf("voices_class %d\n",scratch_trk_hdr.voices_class);
            printf("reverb %d\n",scratch_trk_hdr.reverb);
            printf("initpatchnum %d\n",scratch_trk_hdr.initpatchnum);
            printf("initpitch_cntrl %d\n",scratch_trk_hdr.initpitch_cntrl);
            printf("initvolume_cntrl %d\n",scratch_trk_hdr.initvolume_cntrl);
            printf("initpan_cntrl %d\n",scratch_trk_hdr.initpan_cntrl);
            printf("substack_count %d\n",scratch_trk_hdr.substack_count);
            printf("mutebits %d\n",scratch_trk_hdr.mutebits);
            printf("initppq %d\n",scratch_trk_hdr.initppq);
            printf("initqpm %d\n",scratch_trk_hdr.initqpm);
            printf("labellist_count %d\n",scratch_trk_hdr.labellist_count);
            printf("data_size %d\n",scratch_trk_hdr.data_size);*/

			wmd_file_ptr += readrequest;

			/*readresult = module_read(&scratch_trk_hdr, readrequest, fp_wmd_file);
			if (readrequest != readresult)
			{
				err(wess_FREAD);
				free_mem_if_mine();
				return(0);
			}*/

			loadit = 0;
			if ((scratch_trk_hdr.voices_type == NoSound_ID) ||
				(scratch_trk_hdr.voices_type == GENERIC_ID))
			{
				loadit = 1;
			}
			else {
				k = pm_stat->patch_types_loaded;
				while (k--)
				{
					/*if (((scratch_trk_hdr.voices_type == (pm_stat->ppat_info + k)->hw_tl_list.hardware_ID) &&
						(((scratch_trk_hdr.voices_class == SNDFX_CLASS) && (pm_stat->ppat_info + k)->hw_tl_list.sfxload) ||
						((scratch_trk_hdr.voices_class == SFXDRUMS_CLASS) && (pm_stat->ppat_info + k)->hw_tl_list.sfxload) ||
							((scratch_trk_hdr.voices_class == MUSIC_CLASS) && (pm_stat->ppat_info + k)->hw_tl_list.musload) ||
							((scratch_trk_hdr.voices_class == DRUMS_CLASS) && (pm_stat->ppat_info + k)->hw_tl_list.drmload))))*/
					if (((scratch_trk_hdr.voices_type == (pm_stat->ppat_info + k)->hw_tl_list.hardware_ID) &&
						(((scratch_trk_hdr.voices_class == SNDFX_CLASS) && ((pm_stat->ppat_info + k)->hw_tl_list.flags_load & TAG_SOUND_EFFECTS)) ||
						((scratch_trk_hdr.voices_class == SFXDRUMS_CLASS) && ((pm_stat->ppat_info + k)->hw_tl_list.flags_load & TAG_SOUND_EFFECTS)) ||
							((scratch_trk_hdr.voices_class == MUSIC_CLASS) && ((pm_stat->ppat_info + k)->hw_tl_list.flags_load & TAG_MUSIC)) ||
							((scratch_trk_hdr.voices_class == DRUMS_CLASS) && ((pm_stat->ppat_info + k)->hw_tl_list.flags_load & TAG_DRUMS)))))
					{
						loadit = 1;
						break;
					}
				}
			}

			printf("loadit %d\n", loadit);
			if (loadit)
			{

				trkinfosize += sizeof(*pm_stat->pmod_info->pseq_info->ptrk_info) +
					(scratch_trk_hdr.labellist_count * sizeof(long)) +
					scratch_trk_hdr.data_size;

                printf("trkinfosize %d\n", trkinfosize);
#if _ALIGN4_ == 1
				//force align to word boundary because previous size adjust
				//may wind up with odd address
				trkinfosize += trkinfosize & 1;
				trkinfosize += trkinfosize & 2;
#endif

				if (scratch_trk_hdr.voices_max > max_voices_intrk)
				{
					max_voices_intrk = scratch_trk_hdr.voices_max;
				}

				if (scratch_trk_hdr.substack_count > max_substack_intrk)
				{
					max_substack_intrk = scratch_trk_hdr.substack_count;
				}

				tracks_toload++;
			}

			wmd_file_ptr += (scratch_trk_hdr.labellist_count * sizeof(long)) +
				scratch_trk_hdr.data_size;

			/*if (module_seek(fp_wmd_file,
				(scratch_trk_hdr.labellist_count * sizeof(long)) +
				scratch_trk_hdr.data_size,
				SEEK_CUR))
			{
				err(wess_FSEEK);
				free_mem_if_mine();
				return(0);
			}*/
		}

		if (tracks_toload>max_tracks_inseq)
		{
			max_tracks_inseq = tracks_toload;
		}

		if (tracks_toload == 0)
		{
			/* since there are no tracks to load we create area for the
			track info + 2 (0 delta and TrkEnd) */
			trkinfosize = sizeof(*pm_stat->pmod_info->pseq_info->ptrk_info) + 2;
#if _ALIGN4_ == 1
			//force align to word boundary because previous size adjust
			//may wind up with odd address
			trkinfosize += trkinfosize & 1;
			trkinfosize += trkinfosize & 2;
#endif

		}

		(pm_stat->pmod_info->pseq_info + i)->trkstoload = tracks_toload;
		(pm_stat->pmod_info->pseq_info + i)->trkinfolength = trkinfosize;
		(pm_stat->pmod_info->pseq_info + i)->fileposition = patfpos;
	}

	/* now we dont load the track data anymore */
	/* now we dont load the track data anymore */
	/* now we dont load the track data anymore */

	/*
	- allocate pm_stat->max_tracks_inseq chars for the ptrk_indxs
	pointers in each sequence_status structure.
	update each pointer to each area.
	initialize indexes to 0xFF.
	*/

	pm_stat->pcalltable = (callback_status *)pmem;
	pmem += sizeof(*pm_stat->pcalltable) *
		pm_stat->pmod_info->mod_hdr.callback_areas;

	pm_stat->max_trks_perseq = max_tracks_inseq;

	for (i = 0; i<pm_stat->pmod_info->mod_hdr.seq_work_areas; i++)
	{
		(pm_stat->pseqstattbl + i)->pgates = (char *)pmem;
		pmem += sizeof(char) *
			pm_stat->pmod_info->mod_hdr.gates_per_seq;
#if _ALIGN4_ == 1
		//force align to word boundary because previous pmem adjust
		//may wind up with odd address
		pmem += (unsigned int)pmem & 1;
		pmem += (unsigned int)pmem & 2;
#endif


		(pm_stat->pseqstattbl + i)->piters = (char *)pmem;
		pmem += sizeof(char) *
			pm_stat->pmod_info->mod_hdr.iters_per_seq;
#if _ALIGN4_ == 1
		//force align to word boundary because previous pmem adjust
		//may wind up with odd address
		pmem += (unsigned int)pmem & 1;
		pmem += (unsigned int)pmem & 2;
#endif


		j = max_tracks_inseq;//
		pdest = (pm_stat->pseqstattbl + i)->ptrk_indxs = (char *)pmem;
		pmem += sizeof(char) * j;
#if _ALIGN4_ == 1
		//force align to word boundary because previous pmem adjust
		//may wind up with odd address
		pmem += (unsigned int)pmem & 1;
		pmem += (unsigned int)pmem & 2;
#endif

		while (j--)
		{
			*pdest++ = 0xFF;
		}
	}

	/*
	- allocate pm_stat->max_voices_intrk chars for the pvoice_indxs
	pointers in each track_status structure.
	update each pointer to each area.
	initialize indexes to 0xFF.
	*/

	pm_stat->max_voices_pertrk = max_voices_intrk;

	pm_stat->max_substack_pertrk = max_substack_intrk;

	for (i = 0; i<pm_stat->pmod_info->mod_hdr.trk_work_areas; i++)
	{
		(pm_stat->ptrkstattbl + i)->refindx = i;
		(pm_stat->ptrkstattbl + i)->psubstack = (unsigned long *)pmem;
		/* (pm_stat->ptrkstattbl+i)->psp is set when sequence is triggered */
		pmem += sizeof(long) * pm_stat->max_substack_pertrk;
		(pm_stat->ptrkstattbl + i)->pstackend = (unsigned long *)pmem;
	}

	/* load the drivers here */
	/* load the drivers here */
	/* load the drivers for each patch type and update the CmdFuncArr */
	/* load the drivers here */
	/* load the drivers here */

	/* initialize the loaded drivers and SeqEngine */

	//CmdFuncArr[NoSound_ID][DriverInit]((track_status *)pm_stat);

	for (i = 0; i<pm_stat->patch_types_loaded; i++)
	{
		/*if ((pm_stat->ppat_info + i)->hw_tl_list.sfxload ||
			(pm_stat->ppat_info + i)->hw_tl_list.musload ||
			(pm_stat->ppat_info + i)->hw_tl_list.drmload)*/
		if (((pm_stat->ppat_info + i)->hw_tl_list.flags_load & (TAG_SOUND_EFFECTS| TAG_MUSIC| TAG_DRUMS)) != 0)
		{
			//CmdFuncArr[(pm_stat->ppat_info + i)->hw_tl_list.hardware_ID][DriverInit]((track_status *)pm_stat);
		}
	}

	//module_close(fp_wmd_file);

	max_seq_num = pm_stat->pmod_info->mod_hdr.sequences;

#if _ALIGN4_ == 1
	//force align to word boundary because previous pmem adjust
	//may wind up with odd address
	pmem += (unsigned int)pmem & 1;
	pmem += (unsigned int)pmem & 2;
#endif
	wmd_end = pmem;
	module_loaded = 1;
	SeqOn = 1;

	return (1);
#endif
}

int wess_seq_loader_init(void *input_pm_stat, char *seqfile, enum OpenSeqHandleFlag flag)
{
    printf("wess_seq_loader_init\n");

    seq_loader_enable = 0;
	seqfilename = seqfile;

	seq_pm_stat = input_pm_stat;

	if (seq_pm_stat)
	{
		seq_loader_enable = 1;

		base_track_header.priority = 0x80;
		base_track_header.initvolume_cntrl = 0x7f;
		base_track_header.initpan_cntrl = 0x40;
		base_track_header.initppq = 120;
		base_track_header.initqpm = 120;
		base_track_header.voices_type = 0;
		base_track_header.voices_max = 0;
		base_track_header.reverb = 0;
		base_track_header.voices_class = 0;
		base_track_header.initpatchnum = 0;
		base_track_header.initpitch_cntrl = 0;
		base_track_header.substack_count = 0;
		base_track_header.mutebits = 0;
		base_track_header.labellist_count = 0;
		base_track_header.data_size = 2;

		seq_maxsequences = seq_pm_stat->pmod_info->mod_hdr.sequences;
		seq_loader_enable = 1;

		if (flag == YesOpenSeqHandle)
		{
			if (!open_sequence_data())
			{
				wess_seq_err(SEQLOAD_FOPEN);
				return 0;
			}
			return 1;
		}
	}
	return 0;
}

The MK3 code has been very helpful. ;)

 

You're doing God's work, sir.

 

This might actually make PS1 Doom the fourth Doom to have a console version ported back to PC (after Jaguar's source release, D64's reversing, and 3DO's source release).

Share this post


Link to post

I released the following:

Level 18: Neurosphere

Level 29: The Living End

Bloodsea Keep (BLOODSEA.WAD)

E1M8B: Tech Gone Bad

Share this post


Link to post

I'll take Neurosphere, Bloodsea Keep, and Tech Gone Bad then. I probably won't get all of them done by the time of your next beta release, but I'll try to get at least one of them done.

Share this post


Link to post
1 hour ago, Erick194 said:

Only remains: The Living End, do you want to take it to @riderr3?

 

How 'bout to assign the LE to me and send the semi-done "Level 9: March of the Demons" of NRFTL to @riderr3 as a swappingg instead? (aren't here too many maps I have taken in the project?)

Share this post


Link to post
2 hours ago, mr-around said:

 

How 'bout to assign the LE to me and send the semi-done "Level 9: March of the Demons" of NRFTL to @riderr3 as a swappingg instead?


Ok LE is yours and I'll get March of the Demons then. Send me map via PM.

@Dark Pulse by the way Bloodsea Keep contain special tag, the passage opens after particular monster type death.

P.S. I wonder how is the Dead Zone progress, in case it will be released for beta3, secret levels will move to their respective slots.
 

Edited by riderr3

Share this post


Link to post
On 3/17/2019 at 7:04 PM, riderr3 said:

@Dark Pulse by the way Bloodsea Keep contain special tag, the passage opens after particular monster type death.

Yeah, I know. It's for a secret that only opens if you kill a Mancubus. Since the tags are the same between both versions of the game, though, I shouldn't have to touch anything - it should "just work."

 

I might do something about that, since the Mancubus is only there on HMP or higher, basically meaning you can only get that secret on HMP or higher. Especially if I wind up chopping the Mancubus - monsters that only appear 1-3x in the map are the first things chopped if I need to claw back memory space, and in Bloodsea Keep, that'd be four enemies - Heavy Weapon Dude (1 in all difficulties), Revenant (1 in all difficulties), Mancubus (1 on HMP and higher), and the Cacodemon (2 or 3 depending on difficulty).

 

The Archvile is naturally gone, and I'm likely to replace the Barons of Hell with Nightmare Hell Knights for even more RAM savings, unless I can get both by as-is, but they're also a likely casualty, especially since it would probably let me squeeze another monster type in. Hell Knights themselves would be a casualty, but you get five on UV, and they're very versatile due to being able to basically be ghetto Barons.

 

Pain Elementals will likely stick too despite there being only 2-4 of them depending on difficulty (none at all on IAAW/NTR), since there's a lot of Lost Souls in the map, and Pain Elementals let Lost Souls be "free." Subtract how much it costs for standalone Lost Souls, and the cost for a PE becomes reduced to about the cost of a Cacodemon or Hell Knight, almost giving you two monster types for the price of one.

Share this post


Link to post

Updated the Wiki page on the Doom Wiki.

  • Doom/Ultimate Doom is, of course, completed (and has been since Beta 2).
  • Doom II is missing just two maps: MAP13: Downtown, and MAP30: Icon of Sin.
    • MAP29: The Living End was finished for Beta 3.
    • Icon of Sin is done, but Downtown is still MIA. Whether or not GEC will be adding Icon of Sin into Beta 3, I don't know though...
  • Master Levels is missing three maps: Bloodsea Keep, Mephisto's Mausoleum, and Tom Mustaine's Doom II MAP14 Homage.
    • Trapped on Titan was finished for Beta 3.
    • I just took over Bloodsea Keep from Team GEC, and it's being started from scratch due to that (AFAIK no previous work was done on it). It's second on my priorities list (after Plutonia's MAP18: Neurosphere).
  • TNT: Evilution is missing four maps: MAP15: Dead Zone, MAP19: Shipping/Respawning, MAP20: Central Processing, and MAP30: Last Call.
    • MAP05: Hanger, MAP06: Open Season, MAP21: Administration Center, and MAP32: Caribbean will be making their debuts in Beta 3.
  • The Plutonia Experiment is missing three maps: MAP08: Realm, MAP18: Neurosphere, and MAP30: The Gateway of Hell.
    • MAP19: NME and MAP26: Bunker will be in Beta 3.
    • I am trying hard to get Neurosphere done in time for Beta 3 (having taken it over from Team GEC), and just like Bloodsea Keep, started from scratch. I've gotten the map to now run without crashing on geometry and with monsters replaced, so now it should simply be a matter of coloring the lighting and some other tweaking and it should be good to go.
  • No Rest For The Living is missing just one map: MAP09: March of the Demons.
    • Virtually the entire episode was completed for Beta 3 - MAP03: Canyon of the Dead, MAP04: Hell Mountain, MAP05: Vivisection, MAP06: Inferno of Blood, and MAP07: Baron's Banquet will be making their debut in Beta 3.
  • John Romero's maps had Tech Gone Bad switch from Team GEC to Dark Pulse.
    • Easily the least likely to make Beta 3 due to how huge the level is, starting from scratch, and me needing to seriously chop some geometry to make it work. But I'll try. Just probably not in time for Beta 3, with two other maps to try to get in and a planned release within the next month or so. :)

Share this post


Link to post

@Dark Pulse , please think about correcting some of the misinfo in the Master Edition article on Doomwiki. Inaccuracies include:

 

12 hours ago, Dark Pulse said:

Virtually the entire episode was completed for Beta 3 - MAP03: Canyon of the Dead, MAP04: Hell Mountain, MAP05: Vivisection, MAP06: Inferno of Blood, and MAP07: Baron's Banquet will be making their debut in Beta 3.

 

Level 6: Inferno of Blood was actually in Beta 2 fully working (there were four maps in total). Level 9 should also be completed soon.

 

12 hours ago, Dark Pulse said:

MAP29: The Living End was finished for Beta 3.

 

The article says of a different author. Me and @riderr3 finally agreed I finish the map toward Beta3, so the author is @mr-around

Share this post


Link to post

Yes, The Living End if fully on @mr-around.

Also there a lot of things to do in March of the Demons. I reduced some linedefs which consist from just extra vertices, this is leftovers from what is done previously. The minimal monster cast will be 6 species by now.

Share this post


Link to post

I'll fix them when I get home from work then, my apologies.

 

If there's any other inaccuracies, list them.

Share this post


Link to post
On 3/20/2019 at 8:28 PM, Dark Pulse said:

I'll fix them when I get home from work then, my apologies.

 

If there's any other inaccuracies, list them.

1

 

Awesome job on the wiki DP

It should actually be linked in the OP

https://doomwiki.org/wiki/PlayStation_Doom:_Master_Edition

 

I have a small question though, I believe most of us would be interested in playing this with a mouse and keyboard,

and I remember there was a discussion about how to configure those to work, Any plan to add that information on the wiki?

Share this post


Link to post
4 hours ago, Alfaifi said:

 

Awesome job on the wiki DP

It should actually be linked in the OP

https://doomwiki.org/wiki/PlayStation_Doom:_Master_Edition

It is linked in the OP already.

 

4 hours ago, Alfaifi said:

I have a small question though, I believe most of us would be interested in playing this with a mouse and keyboard,

and I remember there was a discussion about how to configure those to work, Any plan to add that information on the wiki?

No, for two reasons.

 

1) There's all sorts of different emulators for the PS1, meaning each one would need its own setup guide. Retroarch is probably the most common denominator (and what I'd recommend - its BeetlePSX cores are actually quite accurate), but some people will use ePSXe, some will use XEBRA, some will emulate it on PSP via POPS, and yet others will play it on PS3/PS Vita/PSTV by emulating the PSP (which in turn will emulate the PS1 via the aforementioned POPS). If other people want to contribute that setup information, then sure, but "How to emulate a PlayStation" is out of scope for the wiki page itself.

 

2) Honestly, setting up keyboard and mouse support is a pain in the ass. Yeah you could do it, but just like the different emulators, different emulators handle emulating the PlayStation mouse differently (and obviously some of those don't handle it at all, like PSP or the stuff that'd emulate a PSP). Plus for the original game, unless Erick has gotten it to run on the Final Doom codebase or has backported the mouse support to the original game, you will never be able to run that with the PlayStation mouse, meaning you'd be forced to use the controller anyway, and on some platforms, you literally don't got a choice.

 

It, too, is out of the scope for the article really, as it's a general emulation question more than anything.

Share this post


Link to post
11 hours ago, Alfaifi said:

I have a small question though, I believe most of us would be interested in playing this with a mouse and keyboard,

and I remember there was a discussion about how to configure those to work, Any plan to add that information on the wiki?

For what it's worth: I'll be playing this with a mouse and keyboard - Hopefully all the way through, if the original PS1 Doom was ported to Final Doom! (I brought up the original PS1 Doom's lack of mouse support some months ago.) Mednafen's PS1 emulation is pretty decent nowadays, and in my experience, it supports gamepad+mouse setups without any issues. I can share my emulation configuration for Doom once this master edition is released, I'm sure other players will likely share their setups too.

Share this post


Link to post
5 minutes ago, Lollie said:

For what it's worth: I'll be playing this with a mouse and keyboard - Hopefully all the way through, if the original PS1 Doom was ported to Final Doom! (I brought up the original PS1 Doom's lack of mouse support some months ago.) Mednafen's PS1 emulation is pretty decent nowadays, and in my experience, it supports gamepad+mouse setups without any issues. I can share my emulation configuration for Doom once this master edition is released, I'm sure other players will likely share their setups too.

Also for what it's worth, RetroArch's BeetlePSX cores are basically the Mednafen ones, just renamed and tweaked slightly. If you'd rather have something with a GUI, give that a spin. (Especially since you can overclock the emulated CPU, which will eliminate the slowdown - I'm testing all my maps at normal clockrate though, so as to know how it will perform for those playing it on actual hardware or via stuff like POPS. Trying to make sure at worst the maps don't go below 10, and ideally most of the map is at least 15-20. The game caps out at 30 FPS, after all.)

 

And yeah, I totally don't mind other players sharing that info if they want to. It's just kind of out of the scope of what the actual project is about, since again, then you're more getting into general emulation questions and emulation setup, so it's more a question for this mod's FAQ than the Doom Wiki page itself (which should stick to info about the mod).

Share this post


Link to post

I am wondering if there will be updates for PSX Doom Builder? At the moment there are cases when the editor does not find stretched/inverted textures, for example when re-closing a door with a negative offset (it's mentioned before about They Will Repent).

Moreover I found annoyance where is not possible to copy/paste sector properties along with the sector color (SHIFT+CTRL+C and SHIFT+CTRL+V)
There are possibly should be "sector color" tick:
HPPEMpM.png

It would also be handy if nightmare skill and vram viewer cheat were included in updated test build.
 

Also I found bugged flat "GRATE". Just look at this transparent pixels!

Probably devs convert it improperly, along with REDROK01. It was also fixed in Final Doom.
OZUwy38.png

The transparent dots are barely visible on March of the demons especially when you close to outside (it's actually a sky). I hope @Erick194 will add fixed flat to beta3.

et2Qg8C.jpg
How I not seen this bug on official maps before? Maybe that GRATE is rarely used.

On a positive side I have permission from GEC to make a secret exit for They Will Repent.
Consider I have some free linedefs, I will add secret room maybe with some special effects.

Share this post


Link to post
1 hour ago, riderr3 said:

Also I found bugged flat "GRATE". Just look at this transparent pixels!

Probably devs convert it improperly, along with REDROK01. It was also fixed in Final Doom.

 

That bug was always in the original PSX Doom, they accidentally added pixels that were transparent . That's why I had to change graphically everything on Inferno of Blood & Baron's Banquet . Those maps rely on rock Red!

 

1 hour ago, riderr3 said:

How I not seen this bug on official maps before? Maybe that GRATE is rarely used.

 

Perfect Hate had one. No rockred1 at all in whole game! The Entryway probably too but placed as a floor texture, you won't notice the sky on it.

 

@riderr3, I see you made the map successfully work. Would you manage it done in time till beta3 release? Maybe you'll record a video walkthru

Share this post


Link to post
1 hour ago, riderr3 said:

On a positive side I have permission from GEC to make a secret exit for They Will Repent

 

Was this map secret?

Share this post


Link to post
1 hour ago, riderr3 said:

I am wondering if there will be updates for PSX Doom Builder? At the moment there are cases when the editor does not find stretched/inverted textures, for example when re-closing a door with a negative offset (it's mentioned before about They Will Repent).

Moreover I found annoyance where is not possible to copy/paste sector properties along with the sector color (SHIFT+CTRL+C and SHIFT+CTRL+V)
There are possibly should be "sector color" tick:
HPPEMpM.png

It would also be handy if nightmare skill and vram viewer cheat were included in updated test build.

This probably would be good. I'd really like a "No monsters" mode as well for testing geometry, but to be fair, this could be done by a build batch file - basically just read the THINGS lump, and for every monster DoomEd number, disable all the difficulty flags and multiplayer flag. Then we can test if our geometry will crash in peace without having to deal with monsters or anything like that.

 

1 hour ago, riderr3 said:

Also I found bugged flat "GRATE". Just look at this transparent pixels!

Probably devs convert it improperly, along with REDROK01. It was also fixed in Final Doom.
OZUwy38.png

The transparent dots are barely visible on March of the demons especially when you close to outside (it's actually a sky). I hope @Erick194 will add fixed flat to beta3.

et2Qg8C.jpg
How I not seen this bug on official maps before? Maybe that GRATE is rarely used.

I was gonna say, I used that a fair bit in my maps (definitely on Open Season and Neuroshphere), but those are both Final Doom. If it's bugged, it probably should be fixed.

 

1 hour ago, riderr3 said:

On a positive side I have permission from GEC to make a secret exit for They Will Repent.

Consider I have some free linedefs, I will add secret room maybe with some special effects.

Where will it go to? Or are we hiding a Team room somewhere or something? Personally a team credit would be better for that hypothesized original set of maps for it that was tossed around after all the conversions and stuff were done.

Share this post


Link to post
54 minutes ago, mr-around said:

 

That bug was always in the original PSX Doom, they accidentally added pixels that were transparent . That's why I had to change graphically everything on Inferno of Blood & Baron's Banquet . Those maps rely on rock Red!

Red rock is fixed in Master Edition since beta2 and it's safe to use it.

 

54 minutes ago, mr-around said:

I see you made the map successfully work. Would you manage it done in time till beta3 release? Maybe you'll record a video walkthru

Yeah, the map is almost done, I only need to adjust some sector colors.
 

46 minutes ago, Dark Pulse said:

but to be fair, this could be done by a build batch file - basically just read the THINGS lump, and for every monster DoomEd number, disable all the difficulty flags and multiplayer flag. Then we can test if our geometry will crash in peace without having to deal with monsters or anything like that.

That's also a good alternate idea.
 

46 minutes ago, Dark Pulse said:

Where will it go to?

The map will contain secret exit to Fear, it is a GEC decision. That's only what I know.
 

Share this post


Link to post
1 hour ago, riderr3 said:

The map will contain secret exit to Fear, it is a GEC decision. That's only what I know.

Huh. Curious why they removed it from E4M2 then. I mean, there's no real reason I can think of that'd prevent that, and if we're starting with the PC versions as a base, it's not like it won't be there.

 

But then again, I'm betting E4M2 got hella vertically compressed, too. I know @Hyde mentioned some technique of using dummy sectors to get around the 256 height limit before textures stretch, but he never elaborated on how that works or how to do it.

 

Has anyone else figured it out?

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×