void MassLightningStrikeSpell::Launch() { spells.endByType(SPELL_MASS_LIGHTNING_STRIKE); m_duration = 5000; // TODO probably never read m_soundEffectPlayed = false; float beta; if(m_caster == PlayerEntityHandle) { m_pos = player.pos + Vec3f(0.f, 150.f, 0.f); beta = player.angle.getPitch(); } else { Entity * io = entities[m_caster]; m_pos = io->pos + Vec3f(0.f, -20.f, 0.f); beta = io->angle.getPitch(); } m_pos += angleToVectorXZ(beta) * 500.f; long minDuration = long(500 * m_level); long maxDuration = 0; int number = glm::clamp(int(m_level), 1, 10); float ft = 360.0f / (float)number; for(int i = 0; i < number; i++) { Vec3f target = m_pos + angleToVectorXZ(i * ft) * 500.0f; long duration = minDuration + Random::get(0, 5000); maxDuration = std::max(maxDuration, duration); CLightning * lightning = new CLightning(); lightning->m_isMassLightning = true; lightning->m_fDamage = 2; lightning->Create(m_pos, target); lightning->SetDuration(duration); pTab.push_back(lightning); } m_duration = maxDuration + 1000; m_light = GetFreeDynLight(); if(lightHandleIsValid(m_light)) { EERIE_LIGHT * light = lightHandleGet(m_light); light->intensity = 1.8f; light->fallend = 850.f; light->fallstart = 500.f; light->rgb = Color3f::red; // Color3f(1.f, 0.75f, 0.75f); light->pos = m_pos; } ARX_SOUND_PlaySFX(SND_SPELL_LIGHTNING_START); m_snd_loop = ARX_SOUND_PlaySFX(SND_SPELL_LIGHTNING_LOOP, &m_pos, 1.f, ARX_SOUND_PLAY_LOOPED); // Draws White Flash on Screen GRenderer->SetBlendFunc(BlendOne, BlendOne); GRenderer->SetRenderState(Renderer::AlphaBlending, true); EERIEDrawBitmap(Rectf(g_size), 0.00009f, NULL, Color::white); GRenderer->SetRenderState(Renderer::AlphaBlending, false); }
void CMassLightning::Update(float timeDelta) { for(int i = 0; i < number; i++) { CLightning * lightning = pTab[i]; lightning->m_caster = m_caster; lightning->m_level = m_level; lightning->Update(timeDelta); } }
void MassLightningStrikeSpell::Update(float timeDelta) { for(size_t i = 0; i < pTab.size(); i++) { CLightning * lightning = pTab[i]; lightning->m_caster = m_caster; lightning->m_level = m_level; lightning->Update(timeDelta); } for(size_t i = 0; i < pTab.size(); i++) { pTab[i]->Render(); } Vec3f position; position = m_pos + randomVec(-250.f, 250.f); ARX_SOUND_RefreshPosition(m_snd_loop, position); ARX_SOUND_RefreshVolume(m_snd_loop, 1.f); ARX_SOUND_RefreshPitch(m_snd_loop, Random::getf(0.8f, 1.2f)); if(Random::getf() > 0.62f) { position = m_pos + randomVec(-250.f, 250.f); ARX_SOUND_PlaySFX(SND_SPELL_SPARK, &position, Random::getf(0.8f, 1.2f)); } if(Random::getf() > 0.82f) { position = m_pos + randomVec(-250.f, 250.f); ARX_SOUND_PlaySFX(SND_SPELL_ELECTRIC, &position, Random::getf(0.8f, 1.2f)); } if(0 > (long(m_duration) - 1800) && !m_soundEffectPlayed) { m_soundEffectPlayed = true; ARX_SOUND_PlaySFX(SND_SPELL_ELECTRIC, NULL, Random::getf(0.8f, 1.2f)); } if(lightHandleIsValid(m_light)) { EERIE_LIGHT * light = lightHandleGet(m_light); light->intensity = Random::getf(1.3f, 2.3f); } }
void CMassLightning::Create(Vec3f aePos) { long lMax = 0; float ft = 360.0f / (float)number; for(int i = 0; i < number; i++) { CLightning * lightning = pTab[i]; Vec3f eTarget = aePos; eTarget += angleToVectorXZ(i * ft) * 500.0f; lightning->Create(aePos, eTarget); long lTime = ulDuration + Random::get(0, 5000); lightning->SetDuration(lTime); lMax = std::max(lMax, lTime); lightning->SetColor1(1.f, 0.75f, 0.75f); // middle lightning->SetColor2(0.3f, 0.f, 0.f); // extremities } SetDuration(lMax + 1000); }