Example #1
0
//returns true if ready to be removed
PRIVATE bool _fxSmokeUpdate(fxSmoke *mainDat, fxSmoke_par *theSmoke)
{
	double t = TimeGetTime(&theSmoke->delayTimer)/TimeGetDelay(&theSmoke->delayTimer);

	//moving
	if(!theSmoke->bFading)
	{
		if(t <= 1)
		{
			theSmoke->loc[eX] = theSmoke->sLoc[eX] + t*(theSmoke->eLoc[eX]-theSmoke->sLoc[eX]);
			theSmoke->loc[eY] = theSmoke->sLoc[eY] + t*(theSmoke->eLoc[eY]-theSmoke->sLoc[eY]);
			theSmoke->loc[eZ] = theSmoke->sLoc[eZ] + t*(theSmoke->eLoc[eZ]-theSmoke->sLoc[eZ]);

			theSmoke->clr[eA] = t;
		}
		else
		{
			//initialize fading
			theSmoke->bFading = true;

			TimeInit(&theSmoke->delayTimer, mainDat->fadeDelay);
			TimeReset(&theSmoke->delayTimer);
		}
	}
	//fading
	else
	{
		if(t <= 1)
			theSmoke->clr[eA] = 1.0f - t;
		else //we are done
			return true;
	}

	return false;
}
RETCODE StatusInvulnerable::Update()
{
	RETCODE ret = RETCODE_SUCCESS;

	Creature *pCre = (Creature *)IDPageQuery(m_owner);

	if(pCre)
	{
		hOBJ obj = pCre->GetOBJ(); assert(obj);

		double t = TimeGetTime(&m_fadeDelay)/TimeGetDelay(&m_fadeDelay);

		if(t >= 1)
		{
			t = 1;
			TimeReset(&m_fadeDelay);

			m_bFading = !m_bFading;
		}

		OBJSetAlpha(obj, m_bFading ? 1-t : t);

		//invulnerable over?
		if(TimeElapse(&m_invulDelay))
		{
			OBJSetAlpha(obj, 1);
			
			ret = RETCODE_STATUS_DONE;
		}
	}
	else
		ret = RETCODE_STATUS_DONE;

	return ret;
}
Example #3
0
void watchNotAus(void)		//Notaus wenn Taste gedrückt oder Fernsteueung ausgefallen
{
	if((PIND & (1<<IxNotAus)) || ((RemoteSignalTest(RemoteStatus) & (1<<Fail))) || ((RemoteValue[5] < 140) && (RemoteValue[2] > 240)))
	{
		PORTB &= ~(1<<Qx_GenEin);					//Fremderregung am Generator ausschalten
		PORTB &= ~(1<<Qx_MLP_GenOK);				//Generatorlampe ausschalten
		OCR1AL = 0x00;								//Traktion ausschalten links
		OCR1BL = 0x00;								//Traktion ausschalten rechts
		
		while((PIND & (1<<IxNotAus)) || ((RemoteSignalTest(RemoteStatus) & (1<<Fail))) || ((RemoteValue[5] < 140) && (RemoteValue[2] > 235)))	//Wenn und Solange Notaus betätigt oder Fernst aus
		{
			PORTD |= (1<<Qx_MLP_Stoer);				//Störlampe einschalten
			PORTD &= ~(1<<Qx_BenzMotEin);			//Benzinmotor ausschalten
			startRemoteIn();
		}
	
		while(!(PINB & (1<<IxEntpan)))				//Wenn NotAus normalisiert warten bis Enpannen gedrückt
		{
			if(TimeCheck(halfsnd) >= 0b00000001)	//Störlampe blinken lassen mit ca. 1Hz
			{
				TimeReset(halfsnd);
				PORTD ^= (1<<Qx_MLP_Stoer);
			}
		}
	
		PORTD &= ~(1<<Qx_MLP_Stoer);				//Störlampe ausschalten falls noch brennt
		
		if(operatingstates & (1<<warmstart))		//Wenn der Motor schonmal gelaufen
		{
			engineStart();							//Motorstart einleiten
		}											//Beim Kaltstart wird die Prozedur von Main-Loop aufgerufen
	}
}
Example #4
0
void engineStart(void)
{
	stopFahrmot();								//Fahrmotoren abschalten
	PORTD |= (1<<Qx_BenzMotEin);				//Zündung freigeben
	
	while(!(PINB & (1<<IxGenStart)))			//Warten bis Motor läuft
	{	
		watchNotAus();							//Schauen ob Notaus anliegt
		
		if(TimeCheck(halfsnd) >= 0b00000001)	//Generatorlampe blinken lassen mit ca. 1Hz
		{
			TimeReset(halfsnd);					//Halbsekundenverzögerung auf Null setzen
			PORTB ^= (1<<Qx_MLP_GenOK);
		}
	}
	
	PORTB |= (1<<Qx_GenEin);					//Fremderregung am Generator einschalten
	PORTB |= (1<<Qx_MLP_GenOK);					//Generatorlampe dauernd einschalten
	TimeReset(fullsnd);							//Sekundenverzögerung Null setzen
	
	while(!(TimeCheck(fullsnd) >= 0b00000010))	//1 Sekunde warten
	{
		watchNotAus();							//Währenddessen NotAus kontrollieren
	}
	
	//Ab hier geändert dass ständig erregung... 11.01.2014
	//Normalisieren: Auskommentiertes rausnehmen, nächste if bedingnung wegnehmen und lampe immer löschen lassen!!! 
	/*while(!(PINB & (1<<IxLadekon)))				//Wenn Generator bis dahin nicht angesprungen weiter warten
	{
		watchNotAus();							//Währenddessen NotAus kontrollieren
	}
	
	*/PORTB &= ~(1<<Qx_GenEin);					//Fremderregung am Generator ausschalten
	if(!(PINB & (1<<IxLadekon)))
	{
		PORTB &= ~(1<<Qx_MLP_GenOK);				//Generatorlampe dauernd ausschalten
	}
	
}
Example #5
0
void lamptest(void)
{
	TimeReset(doublesnd);							//Zweisekundenverzögerung Null setzen
	
	while(!(TimeCheck(doublesnd) >= 0b00000100))
	{
		PORTB |= (1<<Qx_MLP_GenOK);					//Generatorlampe einschalten
		PORTD |= (1<<Qx_MLP_Stoer);					//Störungslampe einschalten
	}
	
	PORTB &= ~(1<<Qx_MLP_GenOK);					//Generatorlampe ausschalten
	PORTD &= ~(1<<Qx_MLP_Stoer);					//Störungslampe ausschalten
}
RETCODE StatusTeleport::Update()
{
	RETCODE ret = RETCODE_SUCCESS;

	Creature *pCre = (Creature *)IDPageQuery(m_owner);

	if(m_bGO)
	{
		if(pCre)
		{
			hOBJ obj = pCre->GetOBJ(); assert(obj);

			double t = TimeGetTime(&m_delay)/TimeGetDelay(&m_delay);

			if(t >= 1)
			{
				t = 1;
				TimeReset(&m_delay);
			}

			OBJSetAlpha(obj, m_bFading ? 1-t : t);

			//are we done?
			if(t == 1 && !m_bFading)
				ret = RETCODE_STATUS_DONE;
			else if(t == 1 && m_bFading)
			{
				m_bFading = false;

				//set to new location
				pCre->SetLoc(m_dest);

				D3DXVECTOR3 zeroVel(0,0,0);
				pCre->SetVel(zeroVel);

				pCre->CREPlaySound(38);
			}
		}
		else
			ret = RETCODE_STATUS_DONE;
	}

	return ret;
}
PROTECTED RETCODE fxLightningYFunc(hPARFX thisPARFX, DWORD message, LPARAM dumbParam, WPARAM otherParam)
{
	fxLightningY *thisData = (fxLightningY *)thisPARFX->data;

	switch(message)
	{
	case PARFXM_UPDATE:
		{
			double t = TimeGetTime(&thisData->onTimer)/TimeGetDelay(&thisData->onTimer);

			if(t > 1){ t = 1; TimeReset(&thisData->onTimer); }

			//update alpha
			if(thisData->clr[eA] < 1
				&& dumbParam != PARFX_UPDATE_DEAD)
			{
				thisData->clr[eA] = t;

				if(thisData->clr[eA] == 1)
				{
					TimeReset(&thisData->onTimer);
				}
			}
			else if(thisData->clr[eA] > 0
				&& dumbParam == PARFX_UPDATE_DEAD)
			{
				thisData->clr[eA] = 1.0f - t;

				if(thisData->clr[eA] == 0)
				{
					TimeReset(&thisData->onTimer);
				}
			}

			/////////////////////////////////////////////////////////////////
			//update nodes
			float trans[eMaxPt] = {0};

			hOBJ obj = PARFXGetOBJ(thisPARFX);

			if(obj)
			{
				PARFXGetOBJLoc(thisPARFX, obj, trans);
			}

			for(int i = 0; i < thisData->numNodes; i++)
			{
				t = TimeGetTime(&thisData->Nodes[i].timeMove)/TimeGetDelay(&thisData->Nodes[i].timeMove);

				if(t > 1) t = 1;

				thisData->Nodes[i].curLoc[eX] = thisData->Nodes[i].sLoc[eX] + t*(thisData->Nodes[i].eLoc[eX] - thisData->Nodes[i].sLoc[eX]);
				thisData->Nodes[i].curLoc[eZ] = thisData->Nodes[i].sLoc[eZ] + t*(thisData->Nodes[i].eLoc[eZ] - thisData->Nodes[i].sLoc[eZ]);

				if(t == 1)
				{
					TimeReset(&thisData->Nodes[i].timeMove);

					//our new start
					memcpy(thisData->Nodes[i].sLoc, thisData->Nodes[i].curLoc, sizeof(thisData->Nodes[i].sLoc));

					//our new end
					thisData->Nodes[i].eLoc[eX] = _GFXMathRand(thisData->min[eX], thisData->max[eX]) + trans[eX];
					thisData->Nodes[i].eLoc[eY] = thisData->min[eY] + ((float)i/(float)thisData->numNodes)*(thisData->max[eY] - thisData->min[eY]) + trans[eY];
					thisData->Nodes[i].eLoc[eZ] = _GFXMathRand(thisData->min[eZ], thisData->max[eZ]) + trans[eZ];
				}
			}

			if(thisData->clr[eA] == 0 && dumbParam == PARFX_UPDATE_DEAD)
			{
				return RETCODE_BREAK;
			}
		}
		break;

	case PARFXM_DISPLAY:
		if(FrustrumCheckBox(
					thisData->min[eX], thisData->min[eY], thisData->min[eZ],
					thisData->max[eX], thisData->max[eY], thisData->max[eZ]))
		{
			float t = 0, max=thisData->maxParticle;

			D3DXVECTOR3 ptOut, pt0, pt1, pt2, pt3;

			float particleCount=0;
			int prevInd=0, ind=0, nextInd=1, next2Ind=2;

			do
			{
				memcpy((float*)pt0, thisData->Nodes[prevInd].curLoc, sizeof(thisData->Nodes[prevInd].curLoc));
				memcpy((float*)pt1, thisData->Nodes[ind].curLoc, sizeof(thisData->Nodes[ind].curLoc));
				memcpy((float*)pt2, thisData->Nodes[nextInd].curLoc, sizeof(thisData->Nodes[nextInd].curLoc));
				memcpy((float*)pt3, thisData->Nodes[next2Ind].curLoc, sizeof(thisData->Nodes[next2Ind].curLoc));

				//cat-mull-rom curve magic
				D3DXVec3CatmullRom(&ptOut, &pt0, &pt1, &pt2, &pt3, t);

				//draw the darn thing
				TextureBltBillboard(thisData->lightningTxt, (float*)ptOut, thisData->scale, thisData->clr);

				particleCount++;

				t = particleCount/max;

				if(t > 1)
				{
					ind++;
					particleCount = 0;
					t = 0;
				}

				prevInd  = ind - 1; if(prevInd  < 0) prevInd = 0;
				nextInd  = ind + 1; if(nextInd  >= thisData->numNodes) nextInd  = thisData->numNodes-1;
				next2Ind = ind + 2; if(next2Ind >= thisData->numNodes) next2Ind = thisData->numNodes-1;

			} while(ind < thisData->numNodes);
		}
		break;

	case PARFXM_CREATE:
		{
			fxLightningY_init *initDat = (fxLightningY_init *)dumbParam;

			fxLightningY *newData = (fxLightningY *)GFX_MALLOC(sizeof(fxLightningY));

			if(!newData)
				return RETCODE_FAILURE;

			newData->lightningTxt = initDat->lightningTxt; TextureAddRef(newData->lightningTxt);

			newData->clr[eR] = initDat->r/255.0f;
			newData->clr[eG] = initDat->g/255.0f;
			newData->clr[eB] = initDat->b/255.0f;
			newData->clr[eA] = 0;

			newData->scale = initDat->scale;

			memcpy(newData->min, initDat->min, sizeof(newData->min));
			memcpy(newData->max, initDat->max, sizeof(newData->max));

			newData->maxParticle = 20;//initDat->maxParticle;

			TimeInit(&newData->onTimer, initDat->delayOn);
			TimeReset(&newData->onTimer);

			newData->delayMove = initDat->delayMove;

			newData->numNodes = initDat->maxPoint;

			newData->Nodes = (lightningNode *)GFX_MALLOC(sizeof(lightningNode)*newData->numNodes);

			if(!newData->Nodes)
				return RETCODE_FAILURE;

			////////////////////////////////////////////////////////////////
			//initialize the nodes
			float trans[eMaxPt] = {0};

			hOBJ obj = PARFXGetOBJ(thisPARFX);

			if(obj)
			{
				PARFXGetOBJLoc(thisPARFX, obj, trans);
			}

			for(int i = 0; i < newData->numNodes; i++)
			{
				newData->Nodes[i].sLoc[eX] = _GFXMathRand(newData->min[eX], newData->max[eX]) + trans[eX];
				newData->Nodes[i].sLoc[eY] = newData->min[eY] + ((float)i/(float)newData->numNodes)*(newData->max[eY] - newData->min[eY]) + trans[eY];
				newData->Nodes[i].sLoc[eZ] = _GFXMathRand(newData->min[eZ], newData->max[eZ]) + trans[eZ];

				memcpy(newData->Nodes[i].curLoc, newData->Nodes[i].sLoc, sizeof(newData->Nodes[i].curLoc));

				newData->Nodes[i].eLoc[eX] = _GFXMathRand(newData->min[eX], newData->max[eX]) + trans[eX];
				newData->Nodes[i].eLoc[eY] = newData->min[eY] + ((float)i/(float)newData->numNodes)*(newData->max[eY] - newData->min[eY]) + trans[eY];
				newData->Nodes[i].eLoc[eZ] = _GFXMathRand(newData->min[eZ], newData->max[eZ]) + trans[eZ];

				TimeInit(&newData->Nodes[i].timeMove, newData->delayMove);
			}

			thisPARFX->data = newData;
		}
		break;

	case PARFXM_DESTROY:
		{
			if(thisData)
			{
				if(thisData->Nodes)
					GFX_FREE(thisData->Nodes);

				if(thisData->lightningTxt)
					TextureDestroy(&thisData->lightningTxt);
			}
		}
		break;
	}

	return RETCODE_SUCCESS;
}
int MTButton3D::Callback(unsigned int msg, unsigned int wParam, int lParam)
{
	switch(msg)
	{
	case MENU_ITM_MSG_UPDATE:
		{
			bool bDone = false;
			D3DXVECTOR3 curLoc; OBJGetLoc(m_btnOBJ, (float*)curLoc);

			switch(wParam)
			{
			case MITM_UPDATE_NORMAL:
				break;

			case MITM_UPDATE_ENTERING:
				{
					float alpha;
					double t = TimeGetTime(&m_delay)/TimeGetDelay(&m_delay);

					if(t >= 1)
					{
						t = 1;

						bDone = true;
					}

					D3DXVec3Lerp(&curLoc, &m_startLoc, &m_endLoc, t);
					
					alpha = m_startAlpha + t*(m_endAlpha - m_startAlpha);

					OBJTranslate(m_btnOBJ, (float*)curLoc, false);
					OBJSetAlpha(m_btnOBJ, alpha);
				}
				break;

			case MITM_UPDATE_EXITING:
				{
					float alpha;
					double t = TimeGetTime(&m_delay)/TimeGetDelay(&m_delay);

					if(t >= 1)
					{
						t = 1;

						bDone = true;
					}

					D3DXVec3Lerp(&curLoc, &m_endLoc, &m_startLoc, t);
					
					alpha = m_endAlpha + t*(m_startAlpha - m_endAlpha);

					OBJTranslate(m_btnOBJ, (float*)curLoc, false);
					OBJSetAlpha(m_btnOBJ, alpha);
				}
				break;
			}

			OBJUpdateFrame(m_btnOBJ);

			if(bDone)
				return RETCODE_BREAK;
		}
		break;

	case MENU_ITM_MSG_DRAW:
		OBJDisplay(m_btnOBJ);
		break;

	case MENU_ITM_MSG_SELECT:
		if(wParam)
		{
			OBJSetState(m_btnOBJ, BUTTON3D_ANIM_SELECT);
		}
		else
		{
			OBJSetState(m_btnOBJ, BUTTON3D_ANIM_UNSELECT);
		}
		break;

	case MENU_ITM_MSG_ACTIVATE:
		break;

	case MENU_ITM_MSG_STATECHANGE:
		TimeReset(&m_delay);
		break;
	}

	return RETCODE_SUCCESS;
}
Example #9
0
/////////////////////////////////////
// Name:	
// Purpose:	
// Output:	
// Return:	
/////////////////////////////////////
PUBLIC RETCODE OBJUpdateFrame(hOBJ obj)
{
	//create the world matrix
	_GFXCreateWrld(&obj->wrldMtx);

	if(!TESTFLAGS(obj->status, OBJ_PAUSE))
	{
		if(obj->states)
		{
			//there can either be keyframes or joints,
			//we cannot have both!

			//if there are key frames...
			if(TESTFLAGS(obj->theMdl->status, MDL_FRAME))
			{
				double time = TimeGetTime(&obj->ticker)*obj->animeScale;

				if(obj->states[obj->curState].delay > 0)
					time /= obj->states[obj->curState].delay;
				else
					time = 0;

				//time *= obj->animeScale;

				//advance to next frame if we reach 1
				while(time >= 1)
				{
					TimeReset(&obj->ticker);

					obj->prevFrame = obj->curFrame;
					obj->curFrame++;

					if(obj->curFrame > obj->states[obj->curState].endFrame)
					{
						if(TESTFLAGS(obj->status, OBJ_PAUSE_ON_END))
						{ OBJPause(obj, true); obj->curFrame = obj->states[obj->curState].endFrame; }
						else
							obj->curFrame = obj->states[obj->curState].startFrame;
					}

					time -= 1;
				}

				MeshInterpolate(&obj->theMdl->frames[obj->prevFrame].frameMesh, 
					&obj->theMdl->frames[obj->curFrame].frameMesh, 
					time, obj->curMesh);
			}
			//otherwise, if there are joints...
			else if(TESTFLAGS(obj->theMdl->status, MDL_JOINT))
			{
				double time = TimeGetTime(&obj->ticker)*obj->animeScale;

				if(obj->states[obj->curState].delay > 0)
					time /= obj->states[obj->curState].delay;
				else
					time = 0;

				//time *= obj->animeScale;

				//advance to next frame if we reach 1
				while(time >= 1)
				{
					TimeReset(&obj->ticker);

					obj->prevFrame = obj->curFrame;
					obj->curFrame++;

					if(obj->curFrame > obj->states[obj->curState].endFrame)
					{
						if(TESTFLAGS(obj->status, OBJ_PAUSE_ON_END))
						{ 
							SETFLAG(obj->status, OBJ_PAUSE); 
							obj->curFrame = obj->states[obj->curState].endFrame;
							time=0;
							break;
						}
						else
						{
							obj->curFrame = obj->states[obj->curState].startFrame;
						}
					}

					time -= 1;
				}

				//interpolate joint
				if(TESTFLAGS(obj->status, OBJ_CHILD))
				{
					hOBJ parent = OBJQuery(&obj->parentKey);

					JointInterpolate(obj->joints,
									obj->theMdl->joints,
									obj->theMdl->numJoints, time,
									obj->theMdl->numFrames, obj->prevFrame, obj->curFrame,
									parent ? parent->joints : 0, obj->parentJointInd);
				}
				else
				{
					JointInterpolate(obj->joints,
									obj->theMdl->joints,
									obj->theMdl->numJoints, time,
									obj->theMdl->numFrames, obj->prevFrame, obj->curFrame);
				}

				//MeshTranslateVtxJoint(obj->curMesh, obj->joints);
			}
		}

		//go through the children and update them...
		for(LISTPTR::iterator i = obj->objNode->begin(); i != obj->objNode->end(); ++i)
			OBJUpdateFrame((hOBJ)(*i));
	}

	return RETCODE_SUCCESS;
}
Example #10
0
int Geyser::Callback(unsigned int msg, unsigned int wParam, int lParam)
{
	switch(msg)
	{
	case ENTITYMSG_UPDATE:
		{
			EntityCommon *pEntity;

			D3DXVECTOR3 v;
			float spd = m_upSpd.MoveUpdate(g_timeElapse);

			for(list<Id>::iterator i = m_entities.begin(); i != m_entities.end(); i++)
			{
				pEntity = (EntityCommon*)IDPageQuery(*i);

				if(pEntity)
				{
					v = pEntity->GetVel();
					v.y = spd;
					pEntity->SetVel(v);
				}
			}

			m_entities.clear();

			if(!m_bAlwaysActive)
			{
				if(m_bInActive)
				{
					if(TimeElapse(&m_deactiveDelay))
					{
						m_bInActive = false;
						TimeReset(&m_activeDelay);

						if(m_particle)
							PARFXActivate(m_particle, true);
					}
				}
				else
				{
					if(TimeElapse(&m_activeDelay))
					{
						m_bInActive = true;
						TimeReset(&m_deactiveDelay);

						if(m_particle)
							PARFXActivate(m_particle, false);
					}
				}
			}
		}
		break;

	case ENTITYMSG_ENTITYCOLLIDE:
		{
			if(!m_bInActive)
			{
				EntityCommon *pEntity = (EntityCommon *)wParam;

				//check to see if already in list
				bool bAdd = true;

				for(list<Id>::iterator i = m_entities.begin(); i != m_entities.end(); i++)
				{
					if(GAME_IDISEQUAL(*i, pEntity->GetID()))
					{
						bAdd = false;
						break;
					}
				}

				if(bAdd)
					m_entities.push_back(pEntity->GetID());
			}
		}
		break;

	case ENTITYMSG_ALLOWGRAVITY:
		//simply don't allow gravity
		return 0;
	}

	return RETCODE_SUCCESS;
}