static void CheckExp(long i) { if((Thrown[i].flags & ATO_FIERY) && !(Thrown[i].flags & ATO_UNDERWATER)) { const Vec3f & pos = Thrown[i].position; ARX_BOOMS_Add(pos); LaunchFireballBoom(pos, 10); DoSphericDamage(Sphere(pos, 50.f), 4.f * 2, DAMAGE_AREA, DAMAGE_TYPE_FIRE | DAMAGE_TYPE_MAGICAL, PlayerEntityHandle); ARX_SOUND_PlaySFX(SND_SPELL_FIRE_HIT, &pos); ARX_NPC_SpawnAudibleSound(pos, entities.player()); LightHandle id = GetFreeDynLight(); if(lightHandleIsValid(id) && framedelay > 0) { EERIE_LIGHT * light = lightHandleGet(id); light->intensity = 3.9f; light->fallstart = 400.f; light->fallend = 440.f; light->rgb = Color3f(1.f, .8f, .6f) - randomColor3f() * Color3f(.2f, .2f, .2f); light->pos = pos; light->ex_flaresize = 40.f; light->duration = 1500; } } }
void RuneOfGuardingSpell::Update(float timeDelta) { if(m_pSpellFx) { m_pSpellFx->Update(timeDelta); m_pSpellFx->Render(); CRuneOfGuarding * pCRG=(CRuneOfGuarding *)m_pSpellFx; if (pCRG) { Sphere sphere; sphere.origin = pCRG->eSrc; sphere.radius=std::max(m_level*15.f,50.f); if (CheckAnythingInSphere(sphere,m_caster,CAS_NO_SAME_GROUP | CAS_NO_BACKGROUND_COL | CAS_NO_ITEM_COL| CAS_NO_FIX_COL | CAS_NO_DEAD_COL)) { ARX_BOOMS_Add(pCRG->eSrc); LaunchFireballBoom(&pCRG->eSrc,(float)m_level); DoSphericDamage(pCRG->eSrc, 4.f * m_level, 30.f * m_level, DAMAGE_AREA, DAMAGE_TYPE_FIRE | DAMAGE_TYPE_MAGICAL, m_caster); m_duration=0; ARX_SOUND_PlaySFX(SND_SPELL_RUNE_OF_GUARDING_END, &sphere.origin); } } } }
void RuneOfGuardingSpell::Update(float timeDelta) { ulCurrentTime += timeDelta; if(lightHandleIsValid(m_light)) { EERIE_LIGHT * light = lightHandleGet(m_light); float fa = 1.0f - rnd() * 0.15f; light->intensity = 0.7f + 2.3f * fa; light->fallend = 350.f; light->fallstart = 150.f; light->rgb = Color3f(1.0f, 0.2f, 0.2f); light->time_creation = (unsigned long)(arxtime); light->duration = 200; } Vec3f pos = m_pos + Vec3f(0.f, -20.f, 0.f); RenderMaterial mat; mat.setDepthTest(true); mat.setBlendType(RenderMaterial::Additive); Anglef stiteangle; Color3f stitecolor; float stiteangleb = float(ulCurrentTime) * 0.01f; stiteangle.setYaw(0); stiteangle.setRoll(0); stiteangle.setPitch(stiteangleb * 0.1f); stitecolor = Color3f(0.4f, 0.4f, 0.6f); float scale = std::sin(ulCurrentTime * 0.015f); Vec3f stitescale = Vec3f(1.f, -0.1f, 1.f); Draw3DObject(slight, stiteangle, pos, stitescale, stitecolor, mat); stiteangle.setPitch(stiteangleb); stitecolor = Color3f(0.6f, 0.f, 0.f); stitescale = Vec3f(2.f) * (1.f + 0.01f * scale); Draw3DObject(ssol, stiteangle, pos, stitescale, stitecolor, mat); stitecolor = Color3f(0.6f, 0.3f, 0.45f); stitescale = Vec3f(1.8f) * (1.f + 0.02f * scale); Draw3DObject(srune, stiteangle, pos, stitescale, stitecolor, mat); for(int n = 0; n < 4; n++) { PARTICLE_DEF * pd = createParticle(); if(!pd) { break; } pd->ov = pos + (Vec3f(40.f, 0.f, 40.f) * Vec3f(frand2(), 0.f, frand2())); pd->move = Vec3f(0.8f, -4.f, 0.8f) * Vec3f(frand2(), rnd(), frand2()); pd->scale = Vec3f(-0.1f); pd->tolive = Random::get(2600, 3200); pd->tc = tex_p2; pd->siz = 0.3f; pd->rgb = Color3f(.4f, .4f, .6f); } Sphere sphere = Sphere(m_pos, std::max(m_level * 15.f, 50.f)); if(CheckAnythingInSphere(sphere, m_caster, CAS_NO_SAME_GROUP | CAS_NO_BACKGROUND_COL | CAS_NO_ITEM_COL| CAS_NO_FIX_COL | CAS_NO_DEAD_COL)) { ARX_BOOMS_Add(m_pos); LaunchFireballBoom(m_pos, (float)m_level); DoSphericDamage(Sphere(m_pos, 30.f * m_level), 4.f * m_level, DAMAGE_AREA, DAMAGE_TYPE_FIRE | DAMAGE_TYPE_MAGICAL, m_caster); ARX_SOUND_PlaySFX(SND_SPELL_RUNE_OF_GUARDING_END, &m_pos); m_duration = 0; } }
void RuneOfGuardingSpell::Update() { EERIE_LIGHT * light = lightHandleGet(m_light); if(light) { float fa = Random::getf(0.85f, 1.0f); light->intensity = 0.7f + 2.3f * fa; light->fallend = 350.f; light->fallstart = 150.f; light->rgb = Color3f(1.0f, 0.2f, 0.2f); light->creationTime = g_gameTime.now(); light->duration = GameDurationMs(200); } Vec3f pos = m_pos + Vec3f(0.f, -20.f, 0.f); RenderMaterial mat; mat.setDepthTest(true); mat.setBlendType(RenderMaterial::Additive); Anglef stiteangle; Color3f stitecolor; float stiteangleb = m_elapsed / GameDurationMs(100); stiteangle.setPitch(0); stiteangle.setRoll(0); stiteangle.setYaw(stiteangleb * 0.1f); stitecolor = Color3f(0.4f, 0.4f, 0.6f); float scale = std::sin(m_elapsed / GameDurationMsf(66.6666666f)); Vec3f stitescale = Vec3f(1.f, -0.1f, 1.f); Draw3DObject(slight, stiteangle, pos, stitescale, stitecolor, mat); stiteangle.setYaw(stiteangleb); stitecolor = Color3f(0.6f, 0.f, 0.f); stitescale = Vec3f(2.f) * (1.f + 0.01f * scale); Draw3DObject(ssol, stiteangle, pos, stitescale, stitecolor, mat); stitecolor = Color3f(0.6f, 0.3f, 0.45f); stitescale = Vec3f(1.8f) * (1.f + 0.02f * scale); Draw3DObject(srune, stiteangle, pos, stitescale, stitecolor, mat); for(int n = 0; n < 4; n++) { PARTICLE_DEF * pd = createParticle(); if(!pd) { break; } pd->ov = pos + arx::randomOffsetXZ(40.f); pd->move = arx::linearRand(Vec3f(-0.8f, -4.f, -0.8f), Vec3f(0.8f, 0.f, 0.8f)); pd->scale = Vec3f(-0.1f); pd->tolive = Random::getu(2600, 3200); pd->tc = tex_p2; pd->siz = 0.3f; pd->rgb = Color3f(.4f, .4f, .6f); } Sphere sphere = Sphere(m_pos, std::max(m_level * 15.f, 50.f)); if(CheckAnythingInSphere(sphere, m_caster, CAS_NO_SAME_GROUP | CAS_NO_BACKGROUND_COL | CAS_NO_ITEM_COL | CAS_NO_FIX_COL | CAS_NO_DEAD_COL)) { spawnFireHitParticle(m_pos, 0); PolyBoomAddScorch(m_pos); LaunchFireballBoom(m_pos, m_level); DoSphericDamage(Sphere(m_pos, 30.f * m_level), 4.f * m_level, DAMAGE_AREA, DAMAGE_TYPE_FIRE | DAMAGE_TYPE_MAGICAL, m_caster); ARX_SOUND_PlaySFX(g_snd.SPELL_RUNE_OF_GUARDING_END, &m_pos); requestEnd(); } }