Esempio n. 1
0
void ObjectLayer::CreateWeaponDefault(Unit* unit)
{
    Weapon::DefInfo definfo;
    definfo.m_ImageName = PATH_IMAGE_MISSILE_A;
    definfo.m_CurHp = definfo.m_MaxHp = 0;
    definfo.m_Damage = 25;
    definfo.m_MoveSpeed = 400.0f;

    Weapon::WeaponInfo weaponInfo;
    weaponInfo.m_IconImage = PATH_IMAGE_ICON1;
    weaponInfo.m_Sound = PATH_SOUND_MISSILE_A;
    weaponInfo.m_AttackType = Weapon::AT_MISSILE;
    weaponInfo.m_Count = 800;
    weaponInfo.m_Size = 1.0f;
    weaponInfo.m_Damage = definfo.m_Damage;
    weaponInfo.m_Speed = definfo.m_MoveSpeed;
    weaponInfo.m_DefInfo = definfo;

    CreateWeapon(weaponInfo, unit->GetOwner(), unit);

    weaponInfo.m_IconImage = PATH_IMAGE_ICON2;
    weaponInfo.m_DefInfo.m_ImageName = PATH_IMAGE_LASIER_A;
    weaponInfo.m_DefInfo.m_CurHp = weaponInfo.m_DefInfo.m_MaxHp = 30;
    weaponInfo.m_AttackType = Weapon::AT_LASIER;
    weaponInfo.m_Sound = PATH_SOUND_LASIER_A;
    weaponInfo.m_Count = 80;
    weaponInfo.m_Size = 0.2f;
    weaponInfo.m_Damage = 15;
    weaponInfo.m_Speed = 500.0f;

    CreateWeapon(weaponInfo, unit->GetOwner(), unit);

    weaponInfo.m_IconImage = PATH_IMAGE_ICON3;
    weaponInfo.m_DefInfo.m_ImageName = PATH_IMAGE_LASIER_B;
    weaponInfo.m_DefInfo.m_CurHp = weaponInfo.m_DefInfo.m_MaxHp = 50;
    weaponInfo.m_AttackType = Weapon::AT_LASIER;
    weaponInfo.m_Sound = PATH_SOUND_LASIER_B;
    weaponInfo.m_Count = 240;
    weaponInfo.m_Size = 1.5f;
    weaponInfo.m_Damage = 45;
    weaponInfo.m_Speed = 200.0f;

    CreateWeapon(weaponInfo, unit->GetOwner(), unit);

    weaponInfo.m_IconImage = PATH_IMAGE_ICON4;
    weaponInfo.m_DefInfo.m_ImageName = PATH_IMAGE_MISSILE_B;
    weaponInfo.m_DefInfo.m_CurHp = weaponInfo.m_DefInfo.m_MaxHp = 100;
    weaponInfo.m_AttackType = Weapon::AT_MISSILE;
    weaponInfo.m_Sound = PATH_SOUND_MISSILE_B;
    weaponInfo.m_Count = 40;
    weaponInfo.m_Size = 0.3f;
    weaponInfo.m_Damage = 80;
    weaponInfo.m_Speed = 250.0f;

    CreateWeapon(weaponInfo, unit->GetOwner(), unit);
}
Esempio n. 2
0
void Turret::InitialUpdate( )
{
	if( !CreateWeapon( ))
		return;

	// Set the base model diminsions...

	LTVector vDims;
	HMODELANIM hAnimBase = INVALID_MODEL_ANIM;
	g_pModelLT->GetCurAnim( m_hObject, MAIN_TRACKER, hAnimBase );
	g_pModelLT->GetModelAnimUserDims (m_hObject, hAnimBase, &vDims);
	g_pPhysicsLT->SetObjectDims( m_hObject, &vDims, 0 );

	if( g_pWeaponDB->GetBool( m_hTurret, WDB_TURRET_bHideBase ))
		g_pLTServer->SetObjectShadowLOD( m_hObject, eEngineLOD_Never );

	// Make sure object starts on floor if the flag is set...
	if( m_bMoveToFloor )
	{
		MoveObjectToFloor( m_hObject );
	}

	// Do not remove the turret on death since the deactivation of the turret will be delayed...
	// The turret will be removed after the delay...
	m_Damage.m_DestructibleModelFlags = m_Damage.m_DestructibleModelFlags & ~CDestructibleModel::kDestructibleModelFlag_RemoveOnDeath;
	m_swtDestroyedDeactivationDelay.SetEngineTimer( SimulationTimer::Instance( ));

	CreateSpecialFX( false );

	SetNextUpdate( UPDATE_NEXT_FRAME );
}
Esempio n. 3
0
void GunMount::InitialUpdate( )
{
	g_pCommonLT->SetObjectFlags( m_hObject, OFT_Flags, FLAG_FORCECLIENTUPDATE | FLAG_FULLPOSITIONRES, ( FLAG_FORCECLIENTUPDATE | FLAG_FULLPOSITIONRES ));

	CreateWeapon( );

	SetVisible( m_bVisible );

	SetNextUpdate( UPDATE_NEXT_FRAME );
}
Esempio n. 4
0
VOID CCharactor::LoadKindChar( INT nKind )
{
	switch (nKind)
	{
	case 0:			// Papa
		Load( L"Data/CharData/APPA_1.csav" );
		CreateWeapon( CWeapon::SPANNER );
		break;
	case 1:			// Mama
		Load( L"Data/CharData/MOM_1.csav" );
		CreateWeapon( CWeapon::FRYPEN );
		break;
	case 2:			// Son
		Load( L"Data/CharData/ADDLE_1.csav" );
		CreateWeapon( CWeapon::GUITAR );
		break;
	case 3:			// Dau
		Load( L"Data/CharData/DDAL_1.csav" );
		CreateWeapon( CWeapon::MAGICSTICK );
		break;
	}
}
// Load the weapons database file, creating all of the weapons from it.
BOOL CHSWeaponDBArray::LoadFromFile(char *lpstrPath)
{
	FILE   *fp;
#ifdef PENNMUSH
	char    tbuf[BUFFER_LEN];
#endif
#ifdef TM3
	char    tbuf[LBUF_SIZE];
#endif
	UINT	idx;
	char	*ptr;

	sprintf(tbuf, "LOADING: %s", lpstrPath);
	hs_log(tbuf);

	fp = fopen(lpstrPath, "r");
	if (!fp)
	{
		sprintf(tbuf, "ERROR: Couldn't open %s for reading.",
			lpstrPath);
		hs_log(tbuf);
		return FALSE;
	}

	// Ok, start loading lines from the file.
	idx = 0;
#ifdef PENNMUSH
	while (fgets(tbuf, BUFFER_LEN-1, fp))
#endif
#ifdef TM3
	while (fgets(tbuf, LBUF_SIZE-1, fp))
#endif
	{
		// Chop the newline
		if ((ptr = strchr(tbuf, '\n')) != NULL)
			*ptr = '\0';
		if ((ptr = strchr(tbuf, '\r')) != NULL)
			*ptr = '\0';

		// Check for the end of the file.
		if (!strcasecmp(tbuf, "*END*"))
			break;

		// Pass the string to the CreateWeapon() function to create
		// the weapon for us.
		if (!(m_weapons[idx] = CreateWeapon(tbuf)))
		{
			sprintf(tbuf, 
				"ERROR: Invalid weapon specification at line %d.\n",
				idx);
			hs_log(tbuf); 
		}
		idx++;
	}
	fclose(fp);

	m_weapons[idx] = NULL;
	m_num_weapons = idx;

	sprintf(tbuf, "LOADING: %s - %d weapons loaded (done)",
		  lpstrPath, m_num_weapons);
	hs_log(tbuf);

	return TRUE;
}
//need to differentiate between ships and projectiles
void CEntitiesFactory::AddComponents(CEntity * const entity, const SEntityParams * params) {
	if(params->GetType() == EET_SHIP) {
		/* JSON COMPONENTS */
		const rapidjson::Value &ship = m_doc[static_cast<const SShipParams *>
			(params)->GetShipName().c_str()];
		const rapidjson::Value &parameters = ship.FindMember("parameters")->value;

		//ship params
		int16 linearSpeed = static_cast<int16>(parameters["linearSpeed"].GetInt());
		int16 angularSpeed = static_cast<int16>(parameters["angularSpeed"].GetInt());
		uint16 energy = static_cast<uint16>(parameters["energy"].GetInt());
		float energyChargeRate = static_cast<float>(parameters["energyChargeRate"].GetFloat());
		int16 hitpoints = static_cast<int16>(parameters["hitpoints"].GetInt());
		
		CCompShipParams * shipParamsComp = new CCompShipParams(entity, linearSpeed, angularSpeed,
			energy, energyChargeRate, hitpoints);
		entity->AddComponent(shipParamsComp);

		//components
		const rapidjson::Value &components = ship.FindMember("components")->value;

		for (rapidjson::Value::ConstMemberIterator itr = components.MemberBegin();
		itr != components.MemberEnd(); ++itr) {
			if (!strcmp(itr->name.GetString(), "ai")
			&& static_cast<const SShipParams *>(params)->IsAI()) {
				CComponent * comp = CreateAI(entity, itr->value["name"].GetString());
				entity->AddComponent(comp);
				//entity already has CCompShipParams, so set it's isAI to true
				SSetAIMsg setAIMsg(true);
				entity->ReceiveMessage(setAIMsg);
			} else if(!strcmp(itr->name.GetString(), "primaryWeapon")) {
				CComponent * comp = CreateWeapon(entity, 0, itr);
				entity->AddComponent(comp);
			} else if(!strcmp(itr->name.GetString(), "secondaryWeapon")) {
				CComponent * comp = CreateWeapon(entity, 1, itr);
				entity->AddComponent(comp);
			} else {
				CComponent * newComp = CreateComponent(entity, itr);
				if (newComp != nullptr) {
					entity->AddComponent(newComp);
				}
			}
		}
	} else if(params->GetType() == EET_PROJECTILE) {
		const SProjectileParams * projParams = static_cast<const SProjectileParams *>(params);

		CCompTransform * transformComp = new CCompTransform(entity, 0, 0, 0);
		entity->AddComponent(transformComp);

		Sprite * sprt = new Sprite(projParams->GetImage());
		CCompRender * renderComp = new CCompRender(entity, sprt);

		entity->AddComponent(renderComp);
		SGetLinSpeedMsg getLinSpeedMsg;
		entity->ReceiveMessage(getLinSpeedMsg);
		SGetAngSpeedMsg getAngSpeedMsg;
		entity->ReceiveMessage(getAngSpeedMsg);

		CCompProjectileMove * projMoveComp = new CCompProjectileMove(entity,
			getLinSpeedMsg.GetLinSpeed(), getAngSpeedMsg.GetAngSpeed());
		entity->AddComponent(projMoveComp);

		CCompProjParams * projParamsComp = new CCompProjParams(entity, projParams->GetDamage());
		entity->AddComponent(projParamsComp);

		SSetRotMsg setRotMsg(projParams->GetRot());
		entity->ReceiveMessage(setRotMsg);
		SSetPosMsg setPosMsg(projParams->GetX(), projParams->GetY());
		entity->ReceiveMessage(setPosMsg);
	} else if (params->GetType() == EET_EXPLOSION) {
		const SExplosionParams * explParams = static_cast<const SExplosionParams *>(params);

		const rapidjson::Value &explosion = m_doc[static_cast<const SExplosionParams *>
			(params)->GetExplName().c_str()];

		//ship params
		Image * img = ResourceManager::Instance().LoadImage(explosion["image"].GetString(), 4, 4);
		img->SetMidHandle();
		float lifeTime = static_cast<float>(explosion["lifetime"].GetFloat());
		int16 fps = static_cast<int16>(explosion["fps"].GetInt());

		Sprite * sprt = new Sprite(img);
		sprt->SetFrameRange(0, 15);
		CCompRender * renderComp = new CCompRender(entity, sprt);
		entity->AddComponent(renderComp);

		entity->AddComponent(new CCompTransform(entity,
			explParams->GetX(), explParams->GetY(), explParams->GetRot()));

		entity->AddComponent(new CCompExplParams(entity, fps, lifeTime));

		SSetRotMsg setRotMsg(explParams->GetRot());
		entity->ReceiveMessage(setRotMsg);
		SSetPosMsg setPosMsg(explParams->GetX(), explParams->GetY());
		entity->ReceiveMessage(setPosMsg);
		SSetFPSMsg setFPSMsg(fps);
		entity->ReceiveMessage(setFPSMsg);
	} else if (params->GetType() == EET_DECOY) {
		const SDecoyParams * decoyParams = static_cast<const SDecoyParams *>(params);

		Sprite * sprt = new Sprite(decoyParams->GetImg());
		CCompRender * compRender = new CCompRender(entity, sprt);
		entity->AddComponent(compRender);

		CCompTransform * transfComp = new CCompTransform(entity, decoyParams->GetX(),
			decoyParams->GetY(), decoyParams->GetRot());
		entity->AddComponent(transfComp);

		CCompDecoyParams * decoyComp = new CCompDecoyParams(entity,	decoyParams->GetLifeTime(),
			decoyParams->GetDamage(), decoyParams->GetAttractFactor());
		entity->AddComponent(decoyComp);

		CCompTractorDecoy * tractorDecoyComp = new CCompTractorDecoy(entity,
			decoyParams->GetLifeTime());
		entity->AddComponent(tractorDecoyComp);

		SSetRotMsg setRotMsg(decoyParams->GetRot());
		entity->ReceiveMessage(setRotMsg);
		SSetPosMsg setPosMsg(decoyParams->GetX(), decoyParams->GetY());
		entity->ReceiveMessage(setPosMsg);
	} else if (params->GetType() == EET_BOT) {
		const SBotParams * botParams = static_cast<const SBotParams *>(params);

		Sprite * sprt = new Sprite(botParams->GetImg());
		CCompRender * compRender = new CCompRender(entity, sprt);
		entity->AddComponent(compRender);
		SSetFPSMsg setFpsMsg(20);
		compRender->ReceiveMessage(setFpsMsg);

		CCompTransform * transfComp = new CCompTransform(entity, botParams->GetX(),
			botParams->GetY(), 0.f);
		entity->AddComponent(transfComp);

		CCompBotParams * botParamsComp = new CCompBotParams(entity,
			botParams->GetLifeTime(), botParams->GetDamage(), botParams->GetSpeed());
		entity->AddComponent(botParamsComp);

		CCompAIBot * botAIComp = new CCompAIBot(entity, botParams->GetLifeTime());
		entity->AddComponent(botAIComp);

		SSetRotMsg setRotMsg(0.f);
		entity->ReceiveMessage(setRotMsg);
		SSetPosMsg setPosMsg(botParams->GetX(), botParams->GetY());
		entity->ReceiveMessage(setPosMsg);
	}
	CCompCollision * colComp = new CCompCollision(entity);
	entity->AddComponent(colComp);
}
Esempio n. 7
0
AItem* AWeapon::Copy()
{
	return CreateWeapon(GetWorld(), GetItemOwner(), settings);
}
Esempio n. 8
0
void CreateOmegaBlobs (short nFiringSeg, CFixVector *vMuzzle, CFixVector *vTargetPos, CObject *parentObjP, CObject *targetObjP)
{
	short			nLastSeg, nLastCreatedObj = -1;
	CFixVector	vGoal;
	fix			xGoalDist;
	int			nOmegaBlobs;
	fix			xOmegaBlobDist;
	CFixVector	vOmegaDelta;
	CFixVector	vBlobPos, vPerturb;
	fix			xPerturbArray [MAX_OMEGA_BLOBS];
	int			i;

if (IsMultiGame)
	DeleteOldOmegaBlobs (parentObjP);
omegaLightnings.Create (vTargetPos, parentObjP, targetObjP);
vGoal = *vTargetPos - *vMuzzle;
xGoalDist = CFixVector::Normalize (vGoal);
if (xGoalDist < MIN_OMEGA_BLOBS * MIN_OMEGA_DIST) {
	xOmegaBlobDist = MIN_OMEGA_DIST;
	nOmegaBlobs = xGoalDist / xOmegaBlobDist;
	if (nOmegaBlobs == 0)
		nOmegaBlobs = 1;
	}
else {
	xOmegaBlobDist = DESIRED_OMEGA_DIST;
	nOmegaBlobs = xGoalDist / xOmegaBlobDist;
	if (nOmegaBlobs > MAX_OMEGA_BLOBS) {
		nOmegaBlobs = MAX_OMEGA_BLOBS;
		xOmegaBlobDist = xGoalDist / nOmegaBlobs;
		}
	else if (nOmegaBlobs < MIN_OMEGA_BLOBS) {
		nOmegaBlobs = MIN_OMEGA_BLOBS;
		xOmegaBlobDist = xGoalDist / nOmegaBlobs;
		}
	}
vOmegaDelta = vGoal;
vOmegaDelta *= xOmegaBlobDist;
//	Now, create all the blobs
vBlobPos = *vMuzzle;
nLastSeg = nFiringSeg;

//	If nearby, don't perturb vector.  If not nearby, start halfway out.
if (xGoalDist < MIN_OMEGA_DIST * 4) {
	for (i = 0; i < nOmegaBlobs; i++)
		xPerturbArray [i] = 0;
	}
else {
	vBlobPos += vOmegaDelta * (I2X (1) / 2);	//	Put first blob half way out.
	for (i = 0; i < nOmegaBlobs / 2; i++) {
		xPerturbArray [i] = I2X (i) + I2X (1) / 4;
		xPerturbArray [nOmegaBlobs - 1 - i] = I2X (i);
		}
	}

//	Create Random perturbation vector, but favor _not_ going up in CPlayerData's reference.
vPerturb = CFixVector::Random ();
vPerturb += parentObjP->info.position.mOrient.UVec () * (-I2X (1) / 2);
for (i = 0; i < nOmegaBlobs; i++) {
	CFixVector	vTempPos;
	short			nBlobObj, nSegment;

	//	This will put the last blob right at the destination CObject, causing damage.
	if (i == nOmegaBlobs - 1)
		vBlobPos += vOmegaDelta * (I2X (15) / 32);	//	Move last blob another (almost) half section
	//	Every so often, re-perturb blobs
	if (i % 4 == 3) {
		CFixVector	vTemp;

		vTemp = CFixVector::Random ();
		vPerturb += vTemp * (I2X (1) / 4);
		}
	vTempPos = vBlobPos + vPerturb * xPerturbArray[i];
	nSegment = FindSegByPos (vTempPos, nLastSeg, 1, 0);
	if (nSegment != -1) {
		CObject		*objP;

		nLastSeg = nSegment;
		nBlobObj = CreateWeapon (OMEGA_ID, -1, nSegment, vTempPos, 0, RT_WEAPON_VCLIP);
		if (nBlobObj == -1)
			break;
		nLastCreatedObj = nBlobObj;
		objP = OBJECTS + nBlobObj;
		objP->info.xLifeLeft = ONE_FRAME_TIME;
		objP->mType.physInfo.velocity = vGoal;
		//	Only make the last one move fast, else multiple blobs might collide with target.
		objP->mType.physInfo.velocity *= (I2X (4));
		objP->info.xSize = gameData.weapons.info [objP->info.nId].blob_size;
		objP->info.xShields = FixMul (OMEGA_DAMAGE_SCALE*gameData.time.xFrame, WI_strength (objP->info.nId,gameStates.app.nDifficultyLevel));
		objP->cType.laserInfo.parent.nType = parentObjP->info.nType;
		objP->cType.laserInfo.parent.nSignature = parentObjP->info.nSignature;
		objP->cType.laserInfo.parent.nObject = OBJ_IDX (parentObjP);
		objP->info.movementType = MT_NONE;	//	Only last one moves, that will get bashed below.
		}
	vBlobPos += vOmegaDelta;
	}

	//	Make last one move faster, but it's already moving at speed = I2X (4).
if (nLastCreatedObj != -1) {
	OBJECTS [nLastCreatedObj].mType.physInfo.velocity *=
		gameData.weapons.info [OMEGA_ID].speed [gameStates.app.nDifficultyLevel]/4;
	OBJECTS [nLastCreatedObj].info.movementType = MT_PHYSICS;
	}
}