⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 p_floor.c

📁 制作游戏 魔法师传奇 源代码设计 MOFASHICHUANQI 经典老游戏
💻 C
📖 第 1 页 / 共 2 页
字号:
	}	StairQueue[QueueTail].sector = sec;	StairQueue[QueueTail].type = type;	StairQueue[QueueTail].height = height;	QueueTail = (QueueTail+1)%STAIR_QUEUE_SIZE;}//==========================================================================//// DequeueStairSector////==========================================================================static sector_t *DequeueStairSector(int *type, int *height){	sector_t *sec;	if(QueueHead == QueueTail)	{ // queue is empty		return NULL;	}	*type = StairQueue[QueueHead].type;	*height = StairQueue[QueueHead].height;	sec = StairQueue[QueueHead].sector;	QueueHead = (QueueHead+1)%STAIR_QUEUE_SIZE;	return sec;}//==========================================================================//// ProcessStairSector////==========================================================================static void ProcessStairSector(sector_t *sec, int type, int height, 	stairs_e stairsType, int delay, int resetDelay){	int             i;	sector_t        *tsec;	floormove_t     *floor;	//	// new floor thinker	//	height += StepDelta;	floor = Z_Malloc(sizeof(*floor), PU_LEVSPEC, 0);	memset(floor, 0, sizeof(*floor));	P_AddThinker(&floor->thinker);	sec->specialdata = floor;	floor->thinker.function = T_MoveFloor;	floor->type = FLEV_RAISEBUILDSTEP;	floor->direction = Direction;	floor->sector = sec;	floor->floordestheight = height;	switch(stairsType)	{		case STAIRS_NORMAL:			floor->speed = Speed;			if(delay)			{				floor->delayTotal = delay;				floor->stairsDelayHeight = sec->floorheight+StepDelta;				floor->stairsDelayHeightDelta = StepDelta;			}			floor->resetDelay = resetDelay;			floor->resetDelayCount = resetDelay;			floor->resetHeight = sec->floorheight;			break;		case STAIRS_SYNC:			floor->speed = FixedMul(Speed, FixedDiv(height-StartHeight,				StepDelta));			floor->resetDelay = delay; //arg4			floor->resetDelayCount = delay;			floor->resetHeight = sec->floorheight;			break;/*		case STAIRS_PHASED:			floor->floordestheight = sec->floorheight+StepDelta;			floor->speed = Speed;			floor->delayCount = StartDelay;			StartDelay += StartDelayDelta;			floor->textureChange = TextureChange;			floor->resetDelayCount = StartDelay;			break;*/		default:			break;	}	SN_StartSequence((mobj_t *)&sec->soundorg, SEQ_PLATFORM+sec->seqType);	//	// Find next sector to raise	// Find nearby sector with sector special equal to type	//	for (i = 0; i < sec->linecount; i++)	{		if(!((sec->lines[i])->flags&ML_TWOSIDED))		{			continue;		}		tsec = (sec->lines[i])->frontsector;		if(tsec->special == type+STAIR_SECTOR_TYPE && !tsec->specialdata			&& tsec->floorpic == Texture && tsec->validcount != validcount)		{			QueueStairSector(tsec, type^1, height);			tsec->validcount = validcount;			//tsec->special = 0;		}		tsec = (sec->lines[i])->backsector;		if(tsec->special == type+STAIR_SECTOR_TYPE && !tsec->specialdata			&& tsec->floorpic == Texture && tsec->validcount != validcount)		{			QueueStairSector(tsec, type^1, height);			tsec->validcount = validcount;			//tsec->special = 0;		}	}}//==================================================================////      BUILD A STAIRCASE!//// Direction is either positive or negative, denoting build stairs//      up or down.//==================================================================int EV_BuildStairs(line_t *line, byte *args, int direction, 	stairs_e stairsType){	int secnum;	int height;	int	delay;	int resetDelay;	sector_t        *sec;	sector_t *qSec;	int type;	// Set global stairs variables	TextureChange = 0;	Direction = direction;	StepDelta = Direction*(args[2]*FRACUNIT);	Speed = args[1]*(FRACUNIT/8);	resetDelay = args[4];	delay = args[3];	if(stairsType == STAIRS_PHASED)	{		StartDelayDelta = args[3];		StartDelay = StartDelayDelta;		resetDelay = StartDelayDelta;		delay = 0;		TextureChange = args[4];	}	secnum = -1;	validcount++; 	while ((secnum = P_FindSectorFromTag(args[0], secnum)) >= 0)	{		sec = &sectors[secnum];		Texture = sec->floorpic;		StartHeight = sec->floorheight;		// ALREADY MOVING?  IF SO, KEEP GOING...		if (sec->specialdata)			continue;		QueueStairSector(sec, 0, sec->floorheight);		sec->special = 0;	}	while((qSec = DequeueStairSector(&type, &height)) != NULL)	{		ProcessStairSector(qSec, type, height, stairsType, delay, resetDelay);	}	return(1);}//=========================================================================//// T_BuildPillar////=========================================================================void T_BuildPillar(pillar_t *pillar){	result_e        res1;	result_e res2;	// First, raise the floor	res1 = T_MovePlane(pillar->sector, pillar->floorSpeed, pillar->floordest,		pillar->crush, 0, pillar->direction); // floorOrCeiling, direction	// Then, lower the ceiling	res2 = T_MovePlane(pillar->sector, pillar->ceilingSpeed,		 pillar->ceilingdest, pillar->crush, 1, -pillar->direction);	if (res1 == RES_PASTDEST && res2 == RES_PASTDEST)	{		pillar->sector->specialdata = NULL;		SN_StopSequence((mobj_t *)&pillar->sector->soundorg);		P_TagFinished(pillar->sector->tag);		P_RemoveThinker(&pillar->thinker);	}}//=========================================================================//// EV_BuildPillar////=========================================================================int EV_BuildPillar(line_t *line, byte *args, boolean crush){	int secnum;	sector_t *sec;	pillar_t *pillar;	int newHeight;	int rtn;	rtn = 0;	secnum = -1;	while((secnum = P_FindSectorFromTag(args[0], secnum)) >= 0)	{		sec = &sectors[secnum];		if(sec->specialdata)			continue; // already moving		if(sec->floorheight == sec->ceilingheight)		{ // pillar is already closed			continue;		}		rtn = 1;		if(!args[2])		{			newHeight = sec->floorheight+				((sec->ceilingheight-sec->floorheight)/2);		}		else		{			newHeight = sec->floorheight+(args[2]<<FRACBITS);		}		pillar = Z_Malloc(sizeof(*pillar), PU_LEVSPEC, 0);		sec->specialdata = pillar;		P_AddThinker(&pillar->thinker);		pillar->thinker.function = T_BuildPillar;		pillar->sector = sec;		if(!args[2])		{			pillar->ceilingSpeed = pillar->floorSpeed = args[1]*(FRACUNIT/8);		}		else if(newHeight-sec->floorheight > sec->ceilingheight-newHeight)		{			pillar->floorSpeed = args[1]*(FRACUNIT/8);			pillar->ceilingSpeed = FixedMul(sec->ceilingheight-newHeight,				FixedDiv(pillar->floorSpeed, newHeight-sec->floorheight));		}		else		{			pillar->ceilingSpeed = args[1]*(FRACUNIT/8);			pillar->floorSpeed = FixedMul(newHeight-sec->floorheight,				FixedDiv(pillar->ceilingSpeed, sec->ceilingheight-newHeight));		}		pillar->floordest = newHeight;		pillar->ceilingdest = newHeight;		pillar->direction = 1;		pillar->crush = crush*args[3];		SN_StartSequence((mobj_t *)&pillar->sector->soundorg, 			SEQ_PLATFORM+pillar->sector->seqType);	}	return rtn;}//=========================================================================//// EV_OpenPillar////=========================================================================int EV_OpenPillar(line_t *line, byte *args){	int secnum;	sector_t *sec;	pillar_t *pillar;	int rtn;	rtn = 0;	secnum = -1;	while((secnum = P_FindSectorFromTag(args[0], secnum)) >= 0)	{		sec = &sectors[secnum];		if(sec->specialdata)			continue; // already moving		if(sec->floorheight != sec->ceilingheight)		{ // pillar isn't closed			continue;		}		rtn = 1;		pillar = Z_Malloc(sizeof(*pillar), PU_LEVSPEC, 0);		sec->specialdata = pillar;		P_AddThinker(&pillar->thinker);		pillar->thinker.function = T_BuildPillar;		pillar->sector = sec;		if(!args[2])		{			pillar->floordest = P_FindLowestFloorSurrounding(sec);		}		else		{			pillar->floordest = sec->floorheight-(args[2]<<FRACBITS);		}		if(!args[3])		{			pillar->ceilingdest = P_FindHighestCeilingSurrounding(sec);		}		else		{			pillar->ceilingdest = sec->ceilingheight+(args[3]<<FRACBITS);		}		if(sec->floorheight-pillar->floordest >= pillar->ceilingdest-			sec->ceilingheight)		{			pillar->floorSpeed = args[1]*(FRACUNIT/8);			pillar->ceilingSpeed = FixedMul(sec->ceilingheight-				pillar->ceilingdest, FixedDiv(pillar->floorSpeed,				pillar->floordest-sec->floorheight));		}		else		{			pillar->ceilingSpeed = args[1]*(FRACUNIT/8);			pillar->floorSpeed = FixedMul(pillar->floordest-sec->floorheight,				FixedDiv(pillar->ceilingSpeed, sec->ceilingheight-				pillar->ceilingdest));		}		pillar->direction = -1; // open the pillar		SN_StartSequence((mobj_t *)&pillar->sector->soundorg, 			SEQ_PLATFORM+pillar->sector->seqType);	}	return rtn;}//=========================================================================//// EV_FloorCrushStop////=========================================================================int EV_FloorCrushStop(line_t *line, byte *args){	thinker_t *think;	floormove_t *floor;	boolean rtn;	rtn = 0;	for(think = thinkercap.next; think != &thinkercap; think = think->next)	{		if(think->function != T_MoveFloor)		{			continue;		}		floor = (floormove_t *)think;		if(floor->type != FLEV_RAISEFLOORCRUSH)		{			continue;		}		// Completely remove the crushing floor		SN_StopSequence((mobj_t *)&floor->sector->soundorg);		floor->sector->specialdata = NULL;		P_TagFinished(floor->sector->tag);		P_RemoveThinker(&floor->thinker);		rtn = 1;	}		return rtn;}//==========================================================================//// T_FloorWaggle////==========================================================================#define WGLSTATE_EXPAND 1#define WGLSTATE_STABLE 2#define WGLSTATE_REDUCE 3void T_FloorWaggle(floorWaggle_t *waggle){	switch(waggle->state)	{		case WGLSTATE_EXPAND:			if((waggle->scale += waggle->scaleDelta)				>= waggle->targetScale)			{				waggle->scale = waggle->targetScale;				waggle->state = WGLSTATE_STABLE;			}			break;		case WGLSTATE_REDUCE:			if((waggle->scale -= waggle->scaleDelta) <= 0)			{ // Remove				waggle->sector->floorheight = waggle->originalHeight;				P_ChangeSector(waggle->sector, true);				waggle->sector->specialdata = NULL;				P_TagFinished(waggle->sector->tag);				P_RemoveThinker(&waggle->thinker);				return;			}			break;		case WGLSTATE_STABLE:			if(waggle->ticker != -1)			{				if(!--waggle->ticker)				{					waggle->state = WGLSTATE_REDUCE;				}			}			break;	}	waggle->accumulator += waggle->accDelta;	waggle->sector->floorheight = waggle->originalHeight		+FixedMul(FloatBobOffsets[(waggle->accumulator>>FRACBITS)&63],		waggle->scale);	P_ChangeSector(waggle->sector, true);}//==========================================================================//// EV_StartFloorWaggle////==========================================================================boolean EV_StartFloorWaggle(int tag, int height, int speed, int offset,	int timer){	int sectorIndex;	sector_t *sector;	floorWaggle_t *waggle;	boolean retCode;	retCode = false;	sectorIndex = -1;	while((sectorIndex = P_FindSectorFromTag(tag, sectorIndex)) >= 0)	{		sector = &sectors[sectorIndex];		if(sector->specialdata)		{ // Already busy with another thinker			continue;		}		retCode = true;		waggle = Z_Malloc(sizeof(*waggle), PU_LEVSPEC, 0);		sector->specialdata = waggle;		waggle->thinker.function = T_FloorWaggle;		waggle->sector = sector;		waggle->originalHeight = sector->floorheight;		waggle->accumulator = offset*FRACUNIT;		waggle->accDelta = speed<<10;		waggle->scale = 0;		waggle->targetScale = height<<10;		waggle->scaleDelta = waggle->targetScale			/(35+((3*35)*height)/255);		waggle->ticker = timer ? timer*35 : -1;		waggle->state = WGLSTATE_EXPAND;		P_AddThinker(&waggle->thinker);	}	return retCode;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -