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); }
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 ); }
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 ); }
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 ¶meters = 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); }
AItem* AWeapon::Copy() { return CreateWeapon(GetWorld(), GetItemOwner(), settings); }
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; } }