If you appreciate the work done within the wiki, please consider supporting The Cutting Room Floor on Patreon. Thanks for all your support!

Fighting Force 64/Uncompiled Source Code

From The Cutting Room Floor
Jump to navigation Jump to search

This is a sub-page of Fighting Force 64.

The European version of the game contains three large fragments of C code. These can be viewed at the ROM addresses listed below.


(Source: Shygoo)

0x356000:

++) make_exp_frag_ang(OD_SMFRAG1+(rand()&3),m->x,(-(rand()&0x7f) )<<16,m->z+( (-0x100+(rand()&0x1ff) )<<16),ang);


		ang^=0x400;


for(i=0;i<4;i++)make_exp_frag_ang(OD_SMFRAG1+(rand()&3),
m->x,
(-(rand()&0x7f) )<<16,m->z+( (-0x100+(rand()&0x1ff) )<<16),ang);



		create_item_ang(OD_12MGATE3,m->x,m->y- (0x5c      <<16),m->z-((0x60+0xc0)<<16) ,0 );

		create_item_ang(OD_12MGATE2,m->x,m->y- (0x5c      <<16),m->z- (0x60      <<16) ,0 );

		create_item_ang(OD_12MGATE2,m->x,m->y- (0x5c      <<16),m->z+ (0x60      <<16) ,0 );

		create_item_ang(OD_12MGATE4,m->x,m->y- (0x5c      <<16),m->z+((0x60+0xc0)<<16) ,0 );


		create_item_ang(OD_12MGATE3,m->x,m->y-((0x5c+0xb8)<<16),m->z-((0x60+0xc0)<<16) ,0 );

		create_item_ang(OD_12MGATE2,m->x,m->y-((0x5c+0xb8)<<16),m->z- (0x60      <<16) ,0 );

		create_item_ang(OD_12MGATE2,m->x,m->y-((0x5c+0xb8)<<16),m->z+ (0x60      <<16) ,0 );

		create_item_ang(OD_12MGATE4,m->x,m->y-((0x5c+0xb8)<<16),m->z+((0x60+0xc0)<<16) ,0 );

	}

	return(2);			
//1);
}

int brk_handler_drink_machine(BRKOBJ *brk,MOB *m,int *dp,ANIM *manptr)

{
	int		i,t;

	int		x,y,z;

	int		x2,z2,y2;

static int sodacnt=0;

	MOB		*mp;

//static short soda_xa[4]={0xc000+0x300,0xc000-0xf00,0xc000+0x1500,0xc000-0x1e00};
static short soda_xa[4]={0xc000+0x300,0xc000-0x00,0xc000+0x1500,0xc000+0x700};
	int	xa;

	if(manptr) xa=manptr->xa;
	else xa=0;

	t=m->type;

	if(t==OD_DRKMCH2D) return(2);
	if(t==OD_DRKF2EX2) return(2);

	m->cnt=16;

	//create_hitspr(OD_HIT,dp[X],dp[Y],dp[Z]);

	for(i=0;i<8;i++) make_spark_fx(dp[X],dp[Y],dp[Z],xa);

	if(dp[3])	play_sfx(SMP_MP_FH	,192,0x1800);
	else		play_sfx(SMP_HAWK_P1,255,0x1800);

	play_sfx(SMP_21SUSP,96,0x1800);

	player_rumble	(manptr,RFX_CHUG);

	if(--brk->hp<0) {

		play_sfx(SMP_CAR_DAM2,160,0x1a00 + (rand() & 0x1ff));

		m->type++;
		brk->hp+=2;

		if(t==OD_DRNKFNTN) brk->hp+=4-2;

		if(t==OD_INFOCNTR) {

			if	(manptr)	manptr->ndestruct++;

			m->type=OD_DRKMCH2D;

			for(i=0;i<2;i++) {

				make_exp_frag_ang(OD_SMFRAG1+(rand()&3),m->x,-0x40<<16,m->z,0x3000>>5);
				make_exp_frag_ang(OD_SMFRAG1+(rand()&3),m->x,-0x40<<16,m->z,0x5000>>5);
			}

			dual_rumble	(RFX_EXP);

			i=create_weapon(OD_INFOSCRN,m->x,-0x70<<16,m->z,0xc000-0x1000+(rand()&0x1fff) );
			mp=&items[i];
			mp->spd=64+(rand()&15);
			mp->ysp=96+(rand()&15);
			m->aux=0x300+(rand()&0x3ff);
			mp->flg=1;								// No-detect flag.

//			i=create_weapon(OD_IRONBAR1,m->x,-0x50<<16,m->z);
//			mp=&items[i];
//			mp->spd=48;
//			mp->ysp=96;
//			mp->xa=0xc000-0x1000+(rand()&0x1fff);
//			mp->flg=1;								// No-detect flag.
		}

		t=m->type;

		x=m->x;
		y=0;
		z=m->z;

		if(t==OD_DRKMCH2D) {

			if	(manptr)	manptr->ndestruct++;

			m->cnt=16;

			m->cnt=0;

			m->aux=30*8;

			for(i=0;i<2;i++) {

				make_exp_frag_ang(OD_SMFRAG1+(rand()&3),m->x,-0x40<<16,m->z,0x3000>>5);
				make_exp_frag_ang(OD_SMFRAG1+(rand()&3),m->x,-0x40<<16,m->z,0x5000>>5);
			}

			for(i=0;i<32;i++) {

				x2=(-0x40+(rand()&0x7f) ) <<16;
				z2=(-0x40+(rand()&0x7f) ) <<16;
				y2= -0x40+(rand()&0x7f);

				create_dust(OD_DUST,x+x2,(-0xa0-y2)<<16,z+z2 ,0,0,0);
			}

			i=create_weapon(OD_IRONBAR1,m->x,-0x50<<16,m->z, 0xc000-0x1000+(rand()&0x1fff) );
			mp=&items[i];
			mp->spd=70+(rand()&15);
			mp->ysp=96+(rand()&15);
			mp->flg=1;									// No-detect flag.

		} else if(t==OD_DRKF2EX2) {

			if	(manptr)	manptr->ndestruct++;

			m->cnt=0;
			m->aux=30*8;

			for(i=0;i<2;i++) {

				make_exp_frag_ang(OD_SMFRAG1+(rand()&3),m->x,-0x40<<16,m->z,0x3000>>5);
				make_exp_frag_ang(OD_SMFRAG1+(rand()&3),m->x,-0x40<<16,m->z,0x5000>>5);
			}

			for(i=0;i<32;i++) {

				x2=(-0x40+(rand()&0x7f) ) <<16;
				z2=(-0x40+(rand()&0x7f) ) <<16;
				y2= -0x40+(rand()&0x7f);

				create_dust(OD_DUST,x+x2,(-0xa0-y2)<<16,z+z2 ,0,0,0);
			}

			i=create_weapon(OD_IRONBAR1,m->x,-0x50<<16,m->z, 0xc000-0x1000+(rand()&0x1fff) );
			mp=&items[i];
			mp->spd=70+(rand()&15);
			mp->ysp=96+(rand()&15);
			mp->flg=1;									// No-detect flag.

		} el-(0x40<<15),z-(0x20<<15),0x00);
		make_glass2_frag(x			 ,y-(0x40<<15),z-(0x20<<15),0x00);
		make_glass2_frag(x+(0x30<<15),y-(0x40<<15),z-(0x20<<15),0x00);

		make_glass2_frag(x-(0x30<<15),y			  ,z-(0x20<<15),0x00);
		make_glass2_frag(x			 ,y			  ,z-(0x20<<15),0x00);
		make_glass2_frag(x+(0x30<<15),y			  ,z-(0x20<<15),0x00);

		make_glass2_frag(x-(0x30<<15),y+(0x40<<15),z-(0x20<<15),0x00);
		make_glass2_frag(x			 ,y+(0x40<<15),z-(0x20<<15),0x00);
		make_glass2_frag(x+(0x30<<15),y+(0x40<<15),z-(0x20<<15),0x00);
	}

	return(1);
}

int brk_handler_gate11(BRKOBJ *brk,MOB *m,int *dp,ANIM *manptr)
{
	MOB	*n;
	int	i,x,z;

	spcbrk[1]=brk;		// Need this for later, to reset det-box!!

	m->cnt=8;			// shakes the gate.

	play_sfx(SMP_HIT_MSHT, 0xff, 0x1800);

	player_rumble	(manptr,RFX_CHUG);

	if(sublev!=1) {

		brk->hp=4;
		create_hitspr(OD_BLOCK,dp[X],dp[Y],dp[Z]);
		return(1);
	}

	if(brk->hp<0) {

		brk->dtype=BRK_NULL;
		m->type=OD_STG1GTE2;

		x=m->x;
		z=m->z;

		play_sfx(SMP_EXPLO1,255,0x1800);
		create_fx(OD_EXP1,x,dp[Y],z);
		create_fx(OD_BLAST1,m->x,0,m->z);
		shaker=16;
		eflash=8;			//16;

		i=create_item(OD_STG1GTE3,x,0,z);
		n=&items[i];
		n->spd=0x1c0+(rand()&0x3f);
		n->xa=0xc00;

		i=create_item(OD_STG1GTE4,x,0,z);
		n=&items[i];
		n->spd=0x200+(rand()&0x3f);
		n->xa=-0xc00;

		baddie_pause = 0;

		return(1);
	}

	//create_hitspr(OD_HIT,dp[X],dp[Y],dp[Z]);

	if(brk->hp>=3) m->type=OD_STG1GATE;
	else if(brk->hp>=2) m->type=OD_STG1GTE5;
	else if(brk->hp>=1) m->type=OD_STG1GTE6;
	else m->type=OD_STG1GTE7;

	if(--brk->hp<0) {

		brk->hp=0;

		brk->dtype=BRK_NULL;

		if	(manptr)	manptr->ndestruct++;

		m->type=OD_STG1GTE7f;
		m->cnt=0;
		m->aux=0;

		baddie_pause = 0;
	}

	return(1);
}

int brk_handler_gate12(BRKOBJ *brk,MOB *m,int *dp,ANIM *manptr)
{
	int	i;
	int	x,y,z;
	int	ang;

	m->cnt=8;			// shakes the gate.

	if(sublev!=1) {

		brk->hp=4;
		//create_hitspr(OD_BLOCK,dp[X],-32<<16,dp[Z]);
		return(1);
	}

	//create_hitspr(OD_HIT,dp[X],-32<<16,dp[Z]);

	play_sfx(SMP_HIT_MSHT,255,0x1800);
	play_sfx(SMP_21SUSP,160,0x1800);

	player_rumble	(manptr,RFX_CHUG);

	if(--brk->hp<0) {

		brk->hp=0;

		brk->dtype=BRK_NULL;

		x=m->x;
		y=m->y;
		z=m->z;

		m->type=OD_NULL;

		m->cnt=0;
		m->aux=0;

		if	(manptr)	manptr->ndestruct++;

		play_sfx(SMP_MET_SHUT,255,0x1800);
		play_sfx(SMP_EXPLO1,96,0x1800);
		shaker=8;
		eflash=4;

		dual_rumble	(RFX_SHUDDER);

		ang=0x000>>5;

		for(i=0;i<8;i++) make_exp_frag_ang(OD_SMFRAG1+(rand()&3),x+( (-0x100+(rand()&0x1ff) )<<16),(-(rand()&0x7f) )<<16,z,ang);

		ang^=0x400;

		for(i=0;i<4;i++) make_exp_frag_ang(OD_SMFRAG1+(rand()&3),x+( (-0x100+(rand()&0x1ff) )<<16),(-(rand()&0x7f) )<<16,z,ang);


		create_item_ang(OD_12GATE6,x-((0x64+0xc8)<<16),- (0x5c      <<16),z ,0 );
		create_item_ang(OD_12GATE6,x- (0x64      <<16),- (0x5c      <<16),z ,0 );
		create_item_ang(OD_12GATE6,x+ (0x64      <<16),- (0x5c      <<16),z ,0 );
		create_item_ang(OD_12GATE6,x+((0x64+0xc8)<<16),- (0x5c      <<16),z ,0 );

		create_item_ang(OD_12GATE5,x-((0x64+0xc8)<<16),-((0x5c+0xb8)<<16),z ,0 );
		create_item_ang(OD_12GATE5,x- (0x64      <<16),-((0x5c+0xb8)<<16),z ,0 );
		create_item_ang(OD_12GATE5,x+ (0x64      <<16),-((0x5c+0xb8)<<16),z ,0 );
		create_item_ang(OD_12GATE5,x+((0x64+0xc8)<<16),-((0x5c+0xb8)<<16),z ,0 );
	}

	return(1);
}

int brk_handler_mgate12(BRKOBJ *brk,MOB *m,int *dp,ANIM *manptr)
{
	int	i;
	int	ang;

	m->cnt=8;			// shakes the gate.

	//create_hitspr(OD_HIT,dp[X],dp[Y],dp[Z]);

	play_sfx(SMP_HIT_MSHT,255,0x1800);
	play_sfx(SMP_21SUSP,160,0x1800);

	player_rumble	(manptr,RFX_CHUG);

	if(--brk->hp<0) {

		brk->hp=0;

		brk->dtype=BRK_NULL;

		m->type=OD_12MGATE1d;
		m->cnt=0;
		m->aux=0;

		if	(manptr)	manptr->ndestruct++;

		play_sfx(SMP_MET_SHUT,255,0x1800);
		play_sfx(SMP_EXPLO1,96,0x1800);
		shaker=8;
		eflash=4;

		dual_rumble	(RFX_SHUDDER);

		ang=0x4000>>5;
		if(m->x<0) ang^=0x400;

		for(i=0;i<8;iXP;
		if(t==OD_61TANK3)	m->type=OD_11JEEPEXP;

		if(t==OD_BLAKHAWK) return(2);

		m->ysp=-128;
		m->cnt=1;

//		m->spd-=m->spd>>2;

		if	(manptr)	manptr->ndestruct++;

		play_sfx(SMP_EXPLO1,255,0x1800);
		create_fx(OD_EXP1,m->x,dp[Y],m->z);
		create_fx(OD_BLAST1,m->x,0,m->z);

		for(i=0;i<16;i++) make_exp_frag_ang(OD_WRECK1+(rand()&3),m->x,m->y,m->z,m->xa>>5);

		shaker=16;
		eflash=8;

		return(2);
	}

	//create_hitspr(OD_BLOCK,dp[X],dp[Y],dp[Z]);

	for(i=0;i<8;i++) make_spark_fx(dp[X],dp[Y],dp[Z],xa);

	if(dp[3])	play_sfx(SMP_MP_FH	,192,0x1800);
	else		play_sfx(SMP_HAWK_P1,255,0x1800);

	return(2);
}

int brk_handler_11van(BRKOBJ *brk,MOB *m,int *dp,ANIM *manptr)
{
	int	i,t;
	int	x,y,z,ang;
	int	rockx,rockz;
	int	dq[4];
	int	xa;

	if(manptr) xa=manptr->xa;
	else xa=0;

	player_rumble	(manptr,RFX_CHUG);

	if(brk->hp<0) {

		if	(manptr)	manptr->ndestruct++;

		brk->dtype=BRK_SOLID;

		m->type=OD_VAN2EXP;
		m->ysp=-128;
		m->cnt=1;

		m++;
		m->type=OD_SCORCH;

		stop_sfx(m->sfx);
		play_sfx(SMP_EXPLO1,255,0x1800);
		create_fx(OD_EXP1,m->x,dp[Y],m->z);
		create_fx(OD_BLAST1,m->x,0,m->z);

		for(i=0;i<16;i++) make_exp_frag(OD_WRECK1+(rand()&3),m->x,m->y,m->z);

		shaker=16;
		eflash=8;			//16;

		return(2);
	}

	//create_hitspr(OD_HIT,dp[X],dp[Y],dp[Z]);

	for(i=0;i<8;i++) make_spark_fx(dp[X],dp[Y],dp[Z],xa);

	t=m->type;

	if(dp[3])	play_sfx(SMP_MP_FH	,192,0x1800);
	else		play_sfx(SMP_HAWK_P1,255,0x1800);

/*
	rockx=0x300;
	rockz=0x600;

	if(gaside==0) m->aux= rockx;
	if(gaside==1) m->cnt= rockz;
	if(gaside==2) m->aux=-rockx;
	if(gaside==3) m->cnt=-rockz;
*/

	if(t==OD_VAN1BOD3) {

		gaside=4;
		brk->hp=1;

	}

	rockx=0x300/2;
	rockz=0x600/2;

	if(t==OD_VAN1BOD2) {

		rockx=0x300;
		rockz=0x600;
	}

	if(gaside==0) m->aux= rockx;
	if(gaside==1) m->cnt= rockz;
	if(gaside==2) m->aux=-rockx;
	if(gaside==3) m->cnt=-rockz;

	if(--brk->hp<0) {

		if(m->type==OD_VAN1BOD) 		m->type=OD_VAN1BOD2;
		else if(m->type==OD_VAN2BODb)	m->type=OD_VAN1BOD2;
		else 							m->type=OD_VAN1BOD3;

		brk->hp+=4;

		ang=m->xa;

		if(m->type==OD_VAN1BOD2) {

			play_sfx(SMP_CAR_DAM2,255,0x1800);

			x=m->x;
			y=0;
			z=m->z;

			slPushMatrix();
			slUnitMatrix(CURRENT);
			slRotX(0x8000);
			slRotY(ang);

			for(i=0;i<24;i++) {

				t=(rand()&0x1ff)-0x100;
				t+=(t>>2);

				slCalcPoint( (-0xa0-(rand()&0x1f))<<16, 0, t<<16,dp);
				create_dust(OD_DUST2,x+dp[X],(-0x90-(rand()&127))<<16,z+dp[Z] ,rand()&3,0,0);

				t=(rand()&0x1ff)-0x100;

				slCalcPoint( ( 0xa0+(rand()&0x1f))<<16, 0, t<<16,dp);
				create_dust(OD_DUST2,x+dp[X],(-0x90-(rand()&127))<<16,z+dp[Z] ,rand()&3,0,0);
			}

			slPopMatrix();
		}

		if(m->type==OD_VAN1BOD3) {

			if	(manptr)	manptr->ndestruct++;

			play_sfx(SMP_CAR_DAM3,255,0x1800);

			m++;
			m->type=OD_NULL;	//SCORCH;

			x=m->x;
			y=0;
			z=m->z;

			slPushMatrix();
			slUnitMatrix(CURRENT);
			slRotX(0x8000);
			slRotY(ang);

			ang-=0x4000;

			slCalcPoint( 0xac<<16,0, 0x120<<16,dq);
			i=create_item_ang(OD_VAN1WHLf,x+dq[X],0,z+dq[Z],ang);
			items[i].ya=0x4000;

			slCalcPoint( 0xac<<16,0,-0x110<<16,dq);
			i=create_item_ang(OD_VAN1WHLf,x+dq[X],0,z+dq[Z],ang);
			items[i].ya=0x4000;

			ang+=0x8000;

			slCalcPoint(-0xac<<16,0, 0x120<<16,dq);
			i=create_item_ang(OD_VAN1WHLf,x+dq[X],0,z+dq[Z],ang);
			items[i].ya=0x4000;

			slCalcPoint(-0xac<<16,0,-0x110<<16,dq);
			i=create_item_ang(OD_VAN1WHLf,x+dq[X],0,z+dq[Z],ang);
			items[i].ya=0x4000;

			slPopMatrix();
		}
	}

	return(2);
}

int brk_handler_firebox(BRKOBJ *brk,MOB *m,int *dp,ANIM *manptr)
{
	int	i;
	int	x,y,z;

	//create_hitspr(OD_HIT,dp[X],dp[Y],dp[Z]);

	player_rumble	(manptr,RFX_CHUG);

	if(--brk->hp<0) {

		if	(manptr)	manptr->ndestruct++;

		play_sfx(SMP_CAR_DAM1, 255, 0x1800);

		x=m->x;
		y=m->y;
		z=m->z;

		m->type++;
		i=create_weapon(OD_FIREAXE,x,y,z,0);
		m=&items[i];
		m->spd=64;
		m->ysp=0;

		make_glass2_frag(x-(0x30<<15),y	if(level==LEVEL_11) {

				if(m->type==OD_PCARBOD3) wtype = OD_BAZOOKA;
				else					 wtype = OD_SHOTGUN1;

				slCalcPoint(0,0,0x100<<16,dq);
				i = create_weapon(wtype, x+dq[X], -0x50<<16, z+dq[Z] ,ang - 0x4000);

				mp = &items[i];
				mp->spd = 70;
				mp->ysp = 96;
				mp->flg = 1;						// No-detect flag.

			} else if(level==LEVEL_33) {

				if(m->z < 0) wtype = OD_PISTOL6;
				else		 wtype = OD_SHOTGUN1;

				slCalcPoint(0,0,0x100<<16,dq);
				i = create_weapon(wtype, x+dq[X], -0x50<<16, z+dq[Z] ,ang - 0x4000);

				mp = &items[i];
				mp->spd = 70;
				mp->ysp = 96;
				mp->flg = 1;						// No-detect flag.
			}

			m++;
			m->type=OD_NULL;

			slPopMatrix();
		}
	}

	return(2);
}

int brk_handler_merc(BRKOBJ *brk,MOB *m,int *dp,ANIM *manptr)
{
	int	i,t;
	int	x,y,z,ang;
	int	rockx,rockz;
	int	dq[4];
	int	xa;

	player_rumble	(manptr,RFX_CHUG);

	if(manptr) xa=manptr->xa;
	else xa=0;

/*
	if(brk->hp<0) {

		if(m->sfx!=0) {

			stop_sfx(m->sfx-1);
			m->sfx=0;
		}

		brk->dtype=BRK_SOLID;

		m->type=OD_CAR1EXP1+1;	//(rand()&1);
		m->ysp=-128;
		m->cnt=1;

		m++;
		m->type=OD_SCORCH;

		x=m->x;
		y=m->y;
		z=m->z;

		manptr->ndestruct++;

		play_sfx(SMP_EXPLO1,255,0x1800);
		create_fx(OD_EXP1,x,dp[Y],z);
		create_fx(OD_BLAST1,x,0,z);

		for(i=0;i<16;i++) make_exp_frag(OD_WRECK1+(rand()&3),m->x,m->y,m->z);

		shaker=16;
		eflash=8;			//16;

		return(2);
	}
*/

	//create_hitspr(OD_HIT,dp[X],dp[Y],dp[Z]);

	for(i=0;i<8;i++) make_spark_fx(dp[X],dp[Y],dp[Z],xa);

	t=m->type;

	if(dp[3])	play_sfx(SMP_MP_FH	,192,0x1800);
	else		play_sfx(SMP_HAWK_P1,255,0x1800);

	if(t==OD_MERCBOD3) {

		gaside=4;
		brk->hp=1;

	}

	rockx=0x300/2;
	rockz=0x600/2;

	if(t==OD_MERCBOD2) {

		rockx=0x300;
		rockz=0x600;
	}

	if(gaside==0) m->aux= rockx;
	if(gaside==1) m->cnt= rockz;
	if(gaside==2) m->aux=-rockx;
	if(gaside==3) m->cnt=-rockz;

	if(--brk->hp<0) {

		if (temp_samples[0] != 0) stop_sfx(temp_samples[0] - 1), temp_samples[0] = 0;

		m->type++;
		brk->hp+=4;

		ang=m->xa;

		if(m->type==OD_MERCBOD2) {

			play_sfx(SMP_CAR_DAM2,255,0x1800);

			x=m->x;
			y=0;
			z=m->z;

			slPushMatrix();
			slUnitMatrix(CURRENT);
			slRotX(0x8000);
			slRotY(ang);

			for(i=0;i<24;i++) {

				t=rand()&0xff;
				t+=(t>>3);

				slCalcPoint( (-0x90+t)<<16, 0, (-0xfc-0x40+(rand()&0x7f))<<16,dp);
				create_dust(OD_DUST,x+dp[X],-0xa0<<16,z+dp[Z] ,0,0,0);
			}

			for(i=0;i<16;i++) {

				t=rand()&0xff;
				t+=(t>>3);

				slCalcPoint( (-0x90+t)<<16, 0, ( 0xd8+(rand()&0x7f))<<16,dp);
				create_dust(OD_DUST,x+dp[X],-0xa0<<16,z+dp[Z] ,0,0,0);
			}

			slPopMatrix();
		}

		if(m->type==OD_MERCBOD3) {

			if	(manptr)	manptr->ndestruct++;

			play_sfx(SMP_CAR_DAM3,255,0x1800);

			m++;
			m->type=OD_NULL;

			x=m->x;
			y=0;
			z=m->z;

			slPushMatrix();
			slUnitMatrix(CURRENT);
			slRotX(0x8000);
			slRotY(ang);

			ang-=0x4000;

			slCalcPoint( 0x90<<16,0, 0xe8<<16,dq);
			i=create_item_ang(OD_MERCWHLf,x+dq[X],0,z+dq[Z],ang);
			items[i].ya=0x4000;

			slCalcPoint( 0x90<<16,0,-0xec<<16,dq);
			i=create_item_ang(OD_MERCWHLf,x+dq[X],0,z+dq[Z],ang);
			items[i].ya=0x4000;

			ang+=0x8000;

			slCalcPoint(-0x90<<16,0, 0xe8<<16,dq);
			i=create_item_ang(OD_MERCWHLf,x+dq[X],0,z+dq[Z],ang);
			items[i].ya=0x4000;

			slCalcPoint(-0x90<<16,0,-0xec<<16,dq);
			i=create_item_ang(OD_MERCWHLf,x+dq[X],0,z+dq[Z],ang);
			items[i].ya=0x4000;

			slPopMatrix();
		}
	}

	return(2);
}

int brk_handler_traffic(BRKOBJ *brk,MOB *m,int *dp,ANIM *manptr)
{
	int		i,t;
	int		xa;

	if(manptr) xa=manptr->xa;
	else xa=0;

	t=m->type;

	if(brk->hp<0) {

		brk->dtype=BRK_SOLID;

		if(t==OD_11PICKUP)	m->type=OD_11PICEXP;
		if(t==OD_11JEEP)	m->type=OD_11JEEPEXP;
		if(t==OD_11BUS)		m->type=OD_11BUSEXP;
		if(t==OD_11CARRED)	m->type=OD_11CAREXP;
		if(t==OD_11CARBLUE)	m->type=OD_11CAREXP;
		if(t==OD_11POLICAR)	m->type=OD_11CAREXP;
		if(t==OD_11TAXI) 	m->type=OD_11CAREe==OD_61A10a) {

				i = create_weapon(OD_BGUN1, -312<<19, -0xf0<<16, -488<<19 ,0x4000);
				mp = &items[i];
				mp->spd = 64;
				mp->ysp = 64;
				mp->flg = 1;

				m++;

				m->type = OD_NULL;
			}

			if(type==OD_61ARMYTRCK && trmob==m && m->aux) {

				m->aux = 0;
				baddie_pause = 0;
			}

		}
	}

	return(1);
}

int brk_handler_forklift(BRKOBJ *brk,MOB *m,int *dp,ANIM *manptr)
{
	int	i;
	int	xa;

	if(manptr) xa=manptr->xa;
	else xa=0;

	//create_hitspr(OD_HIT,dp[X],dp[Y],dp[Z]);

	if(--brk->hp<0) {

		if	(manptr)	manptr->ndestruct++;

		brk->dtype=BRK_NULL;
		m->type=OD_NULL;

		play_sfx(SMP_EXPLO1,255,0x1800);
		create_fx(OD_EXP_M,m->x,-0x20<<16,m->z);
		shaker=16;
		eflash=4;

		for(i=0;i<8;i++) make_exp_frag(OD_WRECK1+(rand()&3),m->x,m->y,m->z);

		baddie_pause = 0;
	}

	for(i=0;i<8;i++) make_spark_fx(dp[X],dp[Y],dp[Z],xa);

	if(dp[3])	play_sfx(SMP_MP_FH	,192,0x1800);
	else		play_sfx(SMP_HAWK_P1,255,0x1800);

	return(2);
}

int brk_handler_car(BRKOBJ *brk,MOB *m,int *dp,ANIM *manptr)
{
	int	i,t;
	int	x,y,z,ang;
	int	rockx,rockz;
	int	wtype;
	int	dq[4];
	int	xa;
	MOB	*mp;

	player_rumble	(manptr,RFX_CHUG);

	if(manptr) xa=manptr->xa;
	else xa=0;

	if(brk->hp<0) {

		if(m->sfx!=0) {

			stop_sfx(m->sfx-1);
			m->sfx=0;
		}

		brk->dtype=BRK_SOLID;

		m->type=OD_CAR1EXP1+1;	//(rand()&1);
		m->ysp=-128;
		m->cnt=1;

		m++;
		m->type=OD_SCORCH;

		x=m->x;
		y=m->y;
		z=m->z;

		if	(manptr)	manptr->ndestruct++;

		play_sfx(SMP_EXPLO1,255,0x1800);
		create_fx(OD_EXP1,x,dp[Y],z);
		create_fx(OD_BLAST1,x,0,z);

		for(i=0;i<16;i++) make_exp_frag(OD_WRECK1+(rand()&3),m->x,m->y,m->z);

		shaker=16;
		eflash=8;			//16;

		return(2);
	}

	//create_hitspr(OD_HIT,dp[X],dp[Y],dp[Z]);

	for(i=0;i<8;i++) make_spark_fx(dp[X],dp[Y],dp[Z],xa);

	t=m->type;

	if(dp[3])	play_sfx(SMP_MP_FH	,192,0x1800);
	else		play_sfx(SMP_HAWK_P1,255,0x1800);

	if(t==OD_CAR1BOD3 OR t==OD_PCARBOD3) {

		gaside=4;
		brk->hp=1;

	} else {

		if(level==LEVEL_11 OR level==LEVEL_31) {

			if(m->sfx==0)
				m->sfx=1+play_sfx(SMP_L_CARAL,255,0x1800);		// do alarm for 10 secs.
			m->ysp=10*30;
		}
	}

	rockx=0x300/2;
	rockz=0x600/2;

	if(t==OD_CAR1BOD2 OR t==OD_PCARBOD2) {

		rockx=0x300;
		rockz=0x600;
	}

	if(gaside==0) m->aux= rockx;
	if(gaside==1) m->cnt= rockz;
	if(gaside==2) m->aux=-rockx;
	if(gaside==3) m->cnt=-rockz;

	if(--brk->hp<0) {

		m->type++;
		brk->hp+=4;

		ang=m->xa;

		if(m->type==OD_CAR1BOD2 OR m->type==OD_PCARBOD2) {

			play_sfx(SMP_CAR_DAM2,255,0x1800);

			x=m->x;
			y=0;
			z=m->z;

			slPushMatrix();
			slUnitMatrix(CURRENT);
			slRotX(0x8000);
			slRotY(ang);

			for(i=0;i<24;i++) {

				t=rand()&0xff;
				t+=(t>>3);

				slCalcPoint( (-0x90+t)<<16, 0, (-0xfc-0x40+(rand()&0x7f))<<16,dp);
				create_dust(OD_DUST,x+dp[X],-0xa0<<16,z+dp[Z] ,0,0,0);
			}

			for(i=0;i<16;i++) {

				t=rand()&0xff;
				t+=(t>>3);

				slCalcPoint( (-0x90+t)<<16, 0, ( 0xd8+(rand()&0x7f))<<16,dp);
				create_dust(OD_DUST,x+dp[X],-0xa0<<16,z+dp[Z] ,0,0,0);
			}

			slPopMatrix();
		}

		if(m->type==OD_CAR1BOD3 OR m->type==OD_PCARBOD3) {

			if	(manptr)	manptr->ndestruct++;

			play_sfx(SMP_CAR_DAM3,255,0x1800);

			x=m->x;
			y=0;
			z=m->z;

			slPushMatrix();
			slUnitMatrix(CURRENT);
			slRotX(0x8000);
			slRotY(ang);

			slCalcPoint( 0,0,-0x108<<16,dq);
			i=create_item_ang(OD_CAR1ENG2,x+dq[X],0,z+dq[Z],ang);

			ang-=0x4000;

			slCalcPoint( 0x90<<16,0, 0xd8<<16,dq);
			i=create_item_ang(OD_CAR1WHLf,x+dq[X],0,z+dq[Z],ang);
			items[i].ya=0x4000;

			slCalcPoint( 0x90<<16,0,-0xfc<<16,dq);
			i=create_item_ang(OD_CAR1WHLf,x+dq[X],0,z+dq[Z],ang);
			items[i].ya=0x4000;

			ang+=0x8000;

			slCalcPoint(-0x90<<16,0, 0xd8<<16,dq);
			i=create_item_ang(OD_CAR1WHLf,x+dq[X],0,z+dq[Z],ang);
			items[i].ya=0x4000;

			slCalcPoint(-0x90<<16,0,-0xfc<<16,dq);
			i=create_item_ang(OD_CAR1WHLf,x+dq[X],0,z+dq[Z],ang);
			items[i].ya=0x4000;


		 type==OD_63PIPE2 OR type==OD_63PIPE3 OR type==OD_63PIPE4 OR type==OD_71PIPE1) {

			brk->dtype=BRK_SOLID;

			if	(manptr)	manptr->ndestruct++;

			play_sfx(SMP_EXPLO1,192,0x1800);

			y=-0x80-0x20;
			if(type==OD_63PIPE3 OR type==OD_63PIPE4 OR type==OD_71PIPE1) y = -0x100-0x20;

			create_fx(OD_EXP_S,m->x,y<<16,m->z);

			if(m->x > 0) ang = 0x200;
			else		 ang = 0x600;
			for(i=0;i<8;i++) make_exp_frag_ang(OD_WRECK1+(rand()&3),m->x,y<<15,m->z,ang);

			shaker=8;
			eflash=4;
		}

	}

	return(1);
}

int brk_handler_explode(BRKOBJ *brk,MOB *m,int *dp,ANIM *manptr)
{
	int	i;
	int	x,y,z;
	int	type;
	int	xa;
	int	exptyp;
	int	va;
	MOB	*mp;

	if(manptr) xa=manptr->xa;
	else xa=0;

	type = m->type;

	x = m->x;
	y = m->y;
	z = m->z;

	player_rumble	(manptr,RFX_CHUG);

	//create_hitspr(OD_HIT,dp[X],dp[Y],dp[Z]);

	play_sfx(SMP_CAR_LAND,0xff,0x1800);

	for(i=0;i<8;i++) make_spark_fx(dp[X],dp[Y],dp[Z],xa);

	if(--brk->hp<0)
	{
		brk->dtype=BRK_NULL;
		m->type=OD_NULL;

		if	(manptr)	manptr->ndestruct++;

		play_sfx(SMP_EXPLO1,255,0x1800);
		create_fx(OD_EXP_M ,x ,-0x20<<16 ,z);
		shaker=16;
		eflash=4;

		dual_rumble	(RFX_EXP);

		exptyp = 0;

		if	(brk->xtflags & 8)
		{
			if	(rand() & 1)	va = OD_GRENADE;
			else				va = OD_DYNAMITE;

			i=create_weapon(va,x,-0x50<<16,z, 0x4000-0x1000+(rand()&0x1fff) );
			mp=&items[i];
			mp->spd=50+(rand()&15);
			mp->ysp=60+(rand()&15);
			mp->flg=1;

			mp->cnt = 3*30;
		}
		else
		{
			if	( (difflevel == 0 && brk->xtflags & 1) ||
				  (difflevel == 1 && brk->xtflags & 2) ||
				  (difflevel == 2 && brk->xtflags & 4)
				)
			{


				if(type == OD_CRATEhealth	)
				{
					create_weapon(OD_PUPhealth+(rand()%3)	,x ,0 ,z ,0);
					exptyp = 1;
				}

				if(type == OD_CRATEpistol	)
				{
					create_weapon(OD_PISTOL2		,x ,0 ,z ,0);
					exptyp = 1;
				}

				if(type == OD_CRATEshotgun	)
				{
					create_weapon(OD_SHOTGUN1		,x ,0 ,z ,0);
					exptyp = 1;
				}

				if(type == OD_CRATEgrenade	)
				{
					create_weapon(OD_GRENADE		,x ,0 ,z ,0);
					exptyp = 1;
				}

				if(type == OD_CRATEdynamite	)
				{
					create_weapon(OD_DYNAMITE		,x ,0 ,z ,0);
					exptyp = 1;
				}

				if(type == OD_CRATEflare		)
				{
					create_weapon(OD_FLAREGUN		,x ,0 ,z ,0);
					exptyp = 1;
				}

				if	(type == OD_33BARRIER1)
				{
					exptyp = 1;
				}

				if	(exptyp)
				{
					for(i=0;i<8;i++) make_exp_frag_blacksmoke (OD_SMFRAG1+(rand()&3), x, y, z);
				}
				else
				{
					for(i=0;i<8;i++) make_exp_frag(OD_WRECK1+(rand()&3), x, y, z);
				}
			}
		}
	}
	else
	{
			m->cnt=16;
	}

	return(1);
}

int brk_handler_damaged(BRKOBJ *brk,MOB *m,int *dp,ANIM *manptr)
{
	int	i,j;
	int	type;
	int	ang;
	MOB	*mp;
	int	xa;

	if(manptr) xa=manptr->xa;
	else xa=0;

	//create_hitspr(OD_HIT,dp[X],dp[Y],dp[Z]);

	for(i=0;i<8;i++) make_spark_fx(dp[X],dp[Y],dp[Z],xa);

	play_sfx(SMP_CAR_LAND,0xff,0x1800);

	m->cnt=16;

	if(--brk->hp<0) {

		type=m->type;

		m->type++;

		if(type==OD_63PILDESK1 OR type==OD_63PILDESK2 OR type==OD_63PILDESK3 OR type==OD_63PILOTCHR) {

			brk->hp = 4;

			play_sfx(SMP_CAR_DAM2,255,0x1800);

		} else {

			brk->dtype=BRK_SOLID;

			if	(manptr)	manptr->ndestruct++;

			play_sfx(SMP_EXPLO1,255,0x1800);
			create_fx(OD_EXP_M,m->x,-0x40<<16,m->z);
			shaker=16;
			eflash=4;

			for(i=0;i<8;i++) make_exp_frag(OD_WRECK1+(rand()&3),m->x,m->y,m->z);

			m->cnt=0;

			m->aux=30*8;

			if(type==OD_31HDOGSTND) {

				for(j=0; j < 4; j++) {

					i=create_weapon(OD_PUPhotdog, m->x, -0x80<<16, m->z, rand() << 1);
					mp=&items[i];
					mp->spd=50+(rand()&15);
					mp->ysp=60+(rand()&15);
					mp->flg=1;									// No-detect flag.
				}
			}

			if(type==OD_64GUNSTND1 OR type==OD_64GUNSTND2) {

				if(m->x > 0) ang = -0x4000;
				else		 ang =  0x4000;

				i = create_weapon(OD_FLAREGUN, m->x, -0x100<<16, m->z ,ang);

				mp = &items[i];
				mp->spd = 32;
				mp->flg = 1;
			}

			if(typrand()&0x1fff);
			}

			m->type=OD_NULL;
			return;
		}
	}
}

//****************************************************************************
//char err1[40], err2[40], err3[40];

void damage_player_sub(int hitter, int struck, int damage)
{
	ANIM *phitter;
	ANIM *pstruck = ply + struck;
	int hm, dm;

	if(struck < 0 OR struck >= MAXCHARS) return;

	if (damage > 0)
	{
		phitter = ply + hitter;

		if ((hitter < FIRSTBAD) && (struck >= FIRSTBAD))
		{
			hm = 256 + ((1 - difflevel) << 7);
			hm = (phitter->intelligence[phitter->intelligence_level].hit_mul * hm) >> 8;
		}
		else if ((hitter >= FIRSTBAD) && (struck < FIRSTBAD))
		{
			hm = 256 - ((1 - difflevel) << 7);
			hm = (phitter->intelligence[phitter->intelligence_level].hit_mul * hm) >> 8;
		}
		else
		{
			hm = phitter->intelligence[phitter->intelligence_level].hit_mul;
		}
		if (hm < 1) hm = 1;

		damage = (damage * hm) >> 8;
	}
	else
	{
		damage = -damage;
		phitter = 0;
	}

	dm = pstruck->intelligence[pstruck->intelligence_level].damage_mul;

	damage = (damage * dm) >> 8;
	if(damage < 1) damage = 1;

	if(phitter) phitter->manhit = struck;

	pstruck->phitter = hitter;
	pstruck->damage += damage;

	if ((gametype == 2) OR (struck >= FIRSTBAD) OR !(cheattype & CHEAT_INVULNERABLE))
	{
		pstruck->health -= damage;
		if (pstruck->health < 0) pstruck->health=0;
	}

	if (pstruck->plygrab != -1)
	{
		ply[(int)pstruck->plygrab].grabbed = -1;
		pstruck->plygrab = -1;
	}
}

void anim_damage_player(int hitter, int struck, int anum)
{
	int damage;
	int n;

	if ((hitter < 0) OR (hitter > MAXCHARS) OR (struck < 0) OR (struck > MAXCHARS))
	{
		return;
	}

	damage = animflag[anum];

	n = ply[hitter].modnum;

	if	  	(n == OD_HAWK		) damage = animflag_hw[anum];
	else if	(n == OD_MACE		) damage = animflag_mc[anum];
	else if	(n == OD_SMASHER	) damage = animflag_sm[anum];
	else if	(n == OD_ALANA		) damage = animflag_al[anum];

	damage >>= 8;

	damage_player_sub(hitter, struck, damage);
}

void object_damage_player(int hitter, int struck, int object)
{
	int damage=0;

	if	(hitter < 0)	return;

	if(object == OD_MISSILE1 OR object == OD_FLARE OR object == OD_BLAST2)
	{
		damage = 64;
	}
	else if ((object == OD_31CAFESEAT) ||
			(object == OD_31CAFSEAT1) ||
			(object == OD_31CAFSEAT2) ||
			(object == OD_31CAFSEAT3) ||
			(object == OD_71DSKCHAIR))
	{

		damage = 32;
	}
	else if ((object < OD_WEAPSTART) OR (object > OD_WEAPEND) OR (hitter < 0) OR (hitter > MAXCHARS) OR (struck < 0) OR (struck > MAXCHARS))
	{
		return;
	}
	else
	{
		damage = weapon_type[object - OD_WEAPSTART] >> 16;
	}

	if(damage < 0) damage = 0;

	damage_player_sub(hitter, struck, damage);
}

//****************************************************************************

int brk_handler_null(BRKOBJ *brk,MOB *m,int *dp,ANIM *manptr)
{
	return(0);
}

int brk_handler_break(BRKOBJ *brk,MOB *m,int *dp,ANIM *manptr)
{
	int	i,y,ang;
	int	type;
	int	xa;

	if(manptr) xa=manptr->xa;
	else xa=0;

	type=m->type;

	m->cnt=16;

	//create_hitspr(OD_HIT,dp[X],dp[Y],dp[Z]);

	play_sfx(SMP_21SUSP,160,0x1800);

	player_rumble	(manptr,RFX_CHUG);

//	for(i=0;i<8;i++) make_spark_fx(dp[X],dp[Y],dp[Z],xa);

	if(--brk->hp<0) {

		m->type++;

		if(type==OD_41ELECKART OR type==OD_41TRAILER1) {

			brk->dtype=BRK_SOLID;

			if	(manptr)	manptr->ndestruct++;

			play_sfx(SMP_EXPLO1,255,0x1800);
			create_fx(OD_EXP_M,m->x,-0x40<<16,m->z);
			shaker=16;
			eflash=4;
			for(i=0;i<8;i++) make_exp_frag(OD_WRECK1+(rand()&3),m->x,-0x40<<16,m->z);
		}

		if(type==OD_41TURNSTLE OR type==OD_41TURNSTLE2) {

			m->type=OD_41TURNSTLEx;

			if	(manptr)	manptr->ndestruct++;

			play_sfx(SMP_EXPLO1,192,0x1800);
			create_fx(OD_EXP_S,m->x,-0x80<<16,m->z);
			shaker=8;
			eflash=4;

			manptr->px += 4 << 19;							// FRIG!!

			brk->x1 = brk->x2 = (m->x >> 16) + (4 << 3);
			brk->z1 = brk->z2 =  m->z >> 16;
			is_breakable(brk,OD_41TURNSTLEx);
			nbrk--;
		}

		if(type==OD_63PIPE1 OR

0x361003:

		if (baddie_pause) {

			if ((sublev == 1) && pz_gt(0xe680 << 16)) baddie_pause = 0, sublev = 2;
		}

	} else if (level == LEVEL_33A) {

		if(baddie_pause && sublev==1 && pz_gt(240 << 19) ) {

			sublev = 2;
			baddie_pause = 0;
			spcbrk[2]->dtype = BRK_SOLID;
		}

	} else if(level==LEVEL_41 OR level==LEVEL_42)
	{
		if	(level == LEVEL_42)
		{
			spcbrk[2]->dtype = BRK_SOLID;
		}

		if(baddie_pause)
		{
			if((sublev == 0) && pz_gt(0x0000 << 16))
			{
				if	(level == LEVEL_41)
				{
					spcbrk[2]->dtype = BRK_SOLID;
					baddie_pause = 0, sublev++;
				}


			}
		}

		set_41train_door();

	} else if(level==LEVEL_51) {

		levels_logic_51();

	} else if(level==LEVEL_63) {

		set_door_63();
	}
	else if (level == LEVEL_66)
	{
		if (baddie_pause)
		{
			if (px_lt(570 << 19)) baddie_pause = 0, spcbrk[2]->dtype = BRK_SOLID;
		}
	}
}

//****************************************************************************

void handle_items()
{
	int		i;
	int		type;
	MOB		*m;

	m=(MOB*)&items;

	for(i=0;i<NITEMS;i++,m++) {

		if((type=m->type)==-1) continue;

		if(hand_items_jmp[type]==0) handle_movables(m);
		else (*hand_items_jmp[type])(m);
	}
}

//****************************************************************************

void handle_fxsprs()
{
	int		i;
	int		type;
	MOB		*m;

	m=(MOB*)&fxspr;

	for(i=0;i<NFXSPR;i++,m++) {

		if((type=m->type)==-1) continue;

		if(hand_fxspr_jmp[type]!=0) (*hand_fxspr_jmp[type])(m);
	}
}

//****************************************************************************

extern	MTXTR_LINK	*obj_free_tx_link;

extern	int	scaletimer;

void output_items()
{
	int		i,j;
	int		type;
	MOB		*m;
	char	used[NITEMS];

	if	( (can_pick[0] == -1) && (can_pick[1] == -1) )
	{
		scaletimer = 0;
	}
	else
	{
		scaletimer ++;
	}

	set_memory(used,0,NITEMS);

	for(i=0;i<MAXCHARS;i++) {

		j=ply[i].lweap;
		if(j!=-1) used[j]=1;

		j=ply[i].rweap;
		if(j!=-1) used[j]=1;
	}

	slUnitMatrix	(0);

	m=(MOB*)&items;

	for(i=0;i<NITEMS;i++,m++) {

		if((type=m->type)==-1) continue;

		if(used[i]) continue;

		if	(type != 0x69)		// ???
		{
			j = 2;
		}

		if(outp_items_jmp[type]!=0)
		{
			(*outp_items_jmp[type])(m);
		}
		else
		{
			output_other_items(m);
		}
	}
}

//****************************************************************************

void output_fxsprs()
{
	int		i;
	int		type;
	MOB		*m;

	m=(MOB*)&fxspr;

	for(i=0;i<NFXSPR;i++,m++) {

		if((type=m->type)==-1) continue;

		//if	(type == OD_SMOKE1 || type == OD_SMOKE2) continue;

		if(outp_fxspr_jmp[type]!=0) (*outp_fxspr_jmp[type])(m);
		else output_fxsprite(m);
	}
}

//****************************************************************************

void damage_mob(int i,MOB *w)
{
	BRKOBJ	*brk=&brktab[i];
	MOB		*m;
	int		dp[4];
	int		type;

	m=brk->mp;

	type=w->type;

	if(type==OD_VAN2BODa) return;
	if(type==OD_BIKE) return;

	if( (type>=OD_PISTOL2 && type<=OD_PISTOL6) OR type==OD_SHOTGUN1) {

	} else {

		brk->hp=-1;
	}

	dp[X]=w->x;
	dp[Y]=w->y;
	dp[Z]=w->z;

	(*brkhandler[brk->dtype])(brk,m,dp,0);
}

//****************************************************************************

void knock_down_object(int pnum,int det)
{
	int		i;
	int		x,z;
	int		dp[4];
	MOB		*m,*mp;

	set_detect_point(pnum,det,dp);


//	make_hit_fx2(dp[X],dp[Y],dp[Z],0);		// Detection frig.


	x=dp[X]>>16;
	z=dp[Z]>>16;

	for(i=0,m=&mobs[0];i<nmobs;i++,m++) {

		if(m->type!=OD_WALLTV1 && m->type!=OD_WALLTV2) continue;

		if(get_dist(x,z,m->x>>16,m->z>>16) < 0xc0) {

			if(m->type==OD_WALLTV1 OR m->type==OD_WALLTV2) {

				play_sfx(SMP_21SUSP,255,0x1800);
//				play_sfx(SMP_EXPLO1,128,0x1800);
				create_fx(OD_EXP_S,m->x,m->y,m->z);
				shaker=8;

				dual_rumble	(RFX_EXP);

				i=create_weapon(OD_INFOSCRN,m->x,m->y,m->z,0);
				mp=&items[i];
				mp->spd=64;
				mp->ysp=32;

				if(m->type==OD_WALLTV1)	m->xa=0xc000;
				else					m->xa=0x8000;

				mp->xa+=-0x1000+(

0x3BB000:

                                                   ift_mode=0;
							}
						}

					} else {

						level_ended=1;
						spcbrk[0]->dtype=BRK_NULL;
					}

				}
			}

			if(lift_pos>0) {

//				baddie_pause=1;

				if(lift_spd<0x40) lift_spd++;
			}

		} else {

			if(lift_pos>0x800) if(lift_spd>1) lift_spd--;

		}

		lift_pos+=lift_spd;

		play_freq(temp_samples[0], 0x1400 + (lift_spd << 2));

		if(lift_pos>=0x1000) {

			lift_pos-=0x1000;
			lift_floor++;
		}

#ifndef SAT_VER
		j=( ( ( (lift_pos*0x600)/0x1000) -0x600*2) -0x210 ) <<15;
		for(i=0;i<4;i++,j+=0x600<<15) {

			mobs[wall_mob+i].y=j;
			mobs[wall_mob+i+4].y=j;
		}
#endif
		set_door_13();

	} else if(level==LEVEL_14) {

		if(sublev==1 && pz_gt(32<<16)) {

			play_sfx(SMP_EXPLO1,255,0x1800);
			play_sfx(SMP_L_ALARM1,255,0x1800);

			sublev=2;
			alarm_flag=1;
			alarm_cnt=0;

			create_fx(OD_EXP_M	,-96<<19,-0x180<<16	,120<<19);
			create_fx(OD_EXP_M	,-96<<19,-0x100<<16	,120<<19);
			create_fx(OD_EXP_M	,-96<<19,-0x080<<16	,120<<19);
			create_fx(OD_BLAST1	,-96<<19, 0			,120<<19);

			create_fx(OD_EXP_M	, 96<<19,-0x180<<16	,120<<19);
			create_fx(OD_EXP_M	, 96<<19,-0x100<<16	,120<<19);
			create_fx(OD_EXP_M	, 96<<19,-0x080<<16	,120<<19);
			create_fx(OD_BLAST1	, 96<<19, 0			,120<<19);

			shaker=16;
			eflash=4;

			dual_rumble	(RFX_SHUDDER);

			play_sfx(SMP_EXPLO1,192,0x1300);

			for(i=0;i<16;i++) make_exp_frag_ang(OD_WRECK1+(rand()&3),-96<<19,-(rand()&255)<<16,120<<19, 0x600);
			for(i=0;i<16;i++) make_exp_frag_ang(OD_WRECK1+(rand()&3), 96<<19,-(rand()&255)<<16,120<<19, 0x200);

			play_sfx(SMP_EXPLO1,128,0x0e00);

			baddie_pause=0;
		}


		set_alarm_14();
		set_door_14();

	}
	else if(level==LEVEL_15)
	{
		level_logic_15();

	}
	else if(level==LEVEL_21)
	{
		do_21_ambientsound();
	}
	else if(level==LEVEL_22)
	{
		set_traffic_lights();

		if(game_del > 30*2 && sublev && (game_del&7)==0 ) {

			for(j=0,k=0,m=&mobs[0];j<nmobs;j++,m++) {

				if(m->type==OD_22POLCEBAR OR m->type==OD_22POLCBAR2) {

					dual_rumble	(RFX_EXP);

					play_sfx(SMP_EXPLO1,255,0x1800);
					shaker=16;
					eflash=4;
					for(i=0;i<4;i++) make_exp_frag(OD_WRECK1+(rand()&3), m->x, 0, m->z);
					m->type=OD_NULL;
					if(++k > 4) break;
				}
			}
		}

	} else if(level==LEVEL_31)
	{
		if (level_ended == 1)
		{
			if (door2_pos == 0x30)	spcbrk[0]->dtype = BRK_NULL;
			else					door2_pos += 2;
		}

		if (baddie_pause == 1)
		{
			if (sublev == 0)
			{
				if (door_pos)
				{
					if (++door_pos == 32)
					{
						spcbrk[1]->dtype = BRK_NULL;
						sublev = 1;
					}

				} else if ( pz_gt ( (-475<<19)+(LEV31_ZMOD<<16) ) )
				{
					spcbrk[2]->dtype = BRK_SOLID;
					door_pos = 1;
					play_sfx(SMP_EDMOVE, 0xc0, 0x1600);
				}

			} else if (sublev == 1)
			{
				if (   pz_gt( (0xf628<<16)+(LEV31_ZMOD<<16) )   )
				{
					spcbrk[1]->dtype = BRK_SOLID;
					door_pos = 0;
					baddie_pause = 0;
					sublev = 2;
				}

			} else if (sublev == 2)
			{
				if (door_pos)
				{
					if (++door_pos == 32)
					{
						spcbrk[5]->dtype = BRK_NULL;
						sublev = 3;
					}

				} else if (px_lt( (0x780 << 16) ))
				{
					spcbrk[6]->dtype = BRK_SOLID;
					play_sfx(SMP_EDMOVE, 0xc0, 0x1600);
					door_pos = 1;
				}

			} else if (sublev == 3)
			{
				if (px_lt(0x420 << 16))
				{
					spcbrk[5]->dtype = BRK_SOLID;
					door_pos = 0;
					baddie_pause = 0;
					sublev = 4;
				}

			} else if (sublev == 4)
			{
				if (door_pos)
				{
					if (++door_pos == 32)
					{
						spcbrk[3]->dtype = BRK_NULL;
						sublev = 5;
					}

				} else if (px_lt(-390 << 19))
				{
					spcbrk[4]->dtype = BRK_SOLID;
					play_sfx(SMP_EDMOVE, 0xc0, 0x1600);
					temp_samples[0] = play_sfx(SMP_L_MERC, 0x70, 0x1800) + 1;
					door_pos = 1;
				}

			} else if (sublev == 5)
			{
				if (px_lt(-465 << 19))
				{
					spcbrk[3]->dtype = BRK_SOLID;
					door_pos = 0;
					baddie_pause = 0;
					sublev = 6;
				}
			}
		}

	} else if (level == LEVEL_33) {�	{
		if (baddie_pause) spcbrk[7]->dtype = BRK_NULL;
		if (pz_gt(0x07c1 << 16)) sublev++, baddie_pause = 0, spcbrk[4]->dtype = BRK_SOLID;
	}

	flag1=flag2=-2;

	for(i=0;i<MAXCHARS;i++) {

		if(ply[i].health>0) {

			j=ply[i].pz>>16;

//			if( (j>-0x1380 && j<-0x0f80) OR (j>0x0780 && j<0x0b80) ) flag1=2;
//			if( (j>-0x0600 && j<-0x0200) ) flag2=2;

			if( (j>-0x12ff && j<-0x0f80) OR (j>0x07c1 && j<0x0b80) ) flag1=2;
			if( (j>-0x059f && j<-0x0200) ) flag2=2;

//			if( (j>(-0x12ff-0x80) && j<(-0x0f80+0x80) ) OR (j>(0x07c1-0x80) && j<(0x0b80+0x80) ) ) flag1=2;
//			if( (j>(-0x059f-0x80) && j<(-0x0200+0x80) ) ) flag2=2;
		}
	}

	if(door_pos==0	  && flag1>0) sfx_flag=2;
	if(door_pos==0x40 && flag1<0) sfx_flag=2;

	door_pos+=flag1;
	if(door_pos<0) 		door_pos=0;
	if(door_pos>0x40)	door_pos=0x40;

	if(door2_pos==0	   && flag2>0) sfx_flag=1;
	if(door2_pos==0x40 && flag2<0) sfx_flag=1;

	door2_pos+=flag2;
	if(door2_pos<0) 	door2_pos=0;
	if(door2_pos>0x40)	door2_pos=0x40;

	if(sfx_flag) play_sfx(SMP_EDMOVE,255,0x1700);

	set_door_51();

	if(door_pos==0x40)  i = BRK_NULL;
	else				i = BRK_SOLID;

	spcbrk[8]->dtype = spcbrk[10]->dtype = i;

	if(door2_pos==0x40)  i = BRK_NULL;
	else				i = BRK_SOLID;

	spcbrk[9]->dtype = i;
}

void level_logic_15(void)
{
	int		i,j;

	if(game_del==30*7) {

		snd_wind = play_sfx(SMP_L_WIND,128,0x1800);

		shaker=16;
		eflash=4;
		play_sfx(SMP_EXPLO1,255,0x1800);
		play_sfx(SMP_WINDOW1,255,0x1900);

		dual_rumble	(RFX_EXP);

		mobs[0].type++;

		for(i=-168;i>=-168*5;i-=168*2) {

			create_item_ang(OD_15WINPANE1+(rand()&3),-80<<19, i<<16, 441<<19, 0);
			create_item_ang(OD_15WINPANE1+(rand()&3),-48<<19, i<<16, 441<<19, 0);
			create_item_ang(OD_15WINPANE1+(rand()&3),-16<<19, i<<16, 441<<19, 0);
			create_item_ang(OD_15WINPANE1+(rand()&3), 16<<19, i<<16, 441<<19, 0);
			create_item_ang(OD_15WINPANE1+(rand()&3), 48<<19, i<<16, 441<<19, 0);
			create_item_ang(OD_15WINPANE1+(rand()&3), 80<<19, i<<16, 441<<19, 0);
		}

		for(i=0;i<96;i++) {

			j=-96+(rand()&127)+(rand()&63);

			make_gldot_fx( j<<19 ,( -(rand()&511)-(rand()&255) )<<16 ,441<<19 , (j)&0x7ff );
		}

		for(i=0;i<16;i++) {

			create_item(OD_15PAPER1+(rand()%3),(-16+(rand()&31))<<19, -0x80<<16, (384+(rand()&15))<<19);
		}

		for(i=0;i<16;i++) {

			j=-96+(rand()&127)+(rand()&63);
			create_item(OD_15PAPER1+(rand()%3),j<<19,-(rand()&511)<<16, 256<<19);
		}
	}

	if(game_del>30*7) {

		if((rand()&31)==0) {

			create_item(OD_15PAPER1+(rand()%3),(-96+(rand()&127)+(rand()&63))<<19,-(rand()&511)<<16, 256<<19);
			play_sfx(SMP_PAPER1+(rand()&1),255,0x1700+(rand()&0x1ff) );
		}
	}
}

void levels_logic()
{
	int		i,j,k;
	MOB		*m;

	if(gen_time > 0) gen_time--;

	if(level==LEVEL_11) {

		set_11van2_door();

	} else if(level==LEVEL_12) {

		set_door_12();
//		update_monitor();

	} else if(level==LEVEL_13) {

#if DEBUG==1
//	if((game_del&63)==0) make_fallglas_fx(0,-0x240<<16,0);
#endif

		if((lift_floor&1)==0) {

			if(lift_pos==0) {

				if(lift_mode==0) {

					lift_spd=0;
					baddie_pause=1;

					if (door_pos == 0) play_sfx(SMP_EDMOVE, 0xff, 0x1700), play_sfx(SMP_LIFTBONG, 0xff, 0x1800);

					if(lift_floor&2) {

						door_pos++;

						if(door_pos==32) {

							baddie_pause=0;
							lift_mode=1;
						}

					} else if(game_del>30*2) {

						door_pos++;

						if(door_pos==32) {

							baddie_pause=0;
							lift_mode=1;
						}
					}

				} else if(lift_mode==1) {

					baddie_pause=0;
					if(baddies_left>0) lift_mode++;

				} else if(lift_mode==2 && game_del>30*2) {

					if (door_pos == 30) play_sfx(SMP_EDMOVE, 0xff, 0x1700);

					for(i=0;i<MAXCHARS;i++) {

						if(is_active(i)) continue;
						if(ply[i].pz > 64<<19) break;
					}

					if(elevator_flag==1) {

						if (i == MAXCHARS)
						{
							if (door_pos > 0) door_pos--;
						}

						if(baddie_pause==1) {

							if(door_pos>0) door_pos--;
							if(door_pos==0) {

								lift_pos++;