void CMultiPoisonProjectile::Create(Vec3f srcPos, float afBeta) { long lMax = 0; for(size_t i = 0; i < m_projectiles.size(); i++) { CPoisonProjectile * projectile = m_projectiles[i]; projectile->Create(srcPos, afBeta + frand2() * 10.0f); long lTime = ulDuration + Random::get(0, 5000); projectile->SetDuration(lTime); lMax = std::max(lMax, lTime); projectile->lLightId = GetFreeDynLight(); if(lightHandleIsValid(projectile->lLightId)) { EERIE_LIGHT * light = lightHandleGet(projectile->lLightId); light->intensity = 2.3f; light->fallend = 250.f; light->fallstart = 150.f; light->rgb = Color3f::green; light->pos = projectile->eSrc; light->time_creation = (unsigned long)(arxtime); light->duration = 200; } } SetDuration(lMax + 1000); }
void CMultiPoisonProjectile::Update(float timeDelta) { for(size_t i = 0; i < m_projectiles.size(); i++) { CPoisonProjectile * projectile = m_projectiles[i]; projectile->Update(timeDelta); } }
void PoisonProjectileSpell::Update(float timeDelta) { for(size_t i = 0; i < m_projectiles.size(); i++) { CPoisonProjectile * projectile = m_projectiles[i]; projectile->Update(timeDelta); } for(size_t i = 0; i < m_projectiles.size(); i++) { CPoisonProjectile * projectile = m_projectiles[i]; projectile->Render(); if(lightHandleIsValid(projectile->lLightId)) { EERIE_LIGHT * light = lightHandleGet(projectile->lLightId); light->intensity = 2.3f * projectile->lightIntensityFactor; light->fallend = 250.f; light->fallstart = 150.f; light->rgb = Color3f::green; light->pos = projectile->eCurPos; light->time_creation = (unsigned long)(arxtime); light->duration = 200; } AddPoisonFog(projectile->eCurPos, m_level + 7); if(m_timcreation + 1600 < (unsigned long)(arxtime)) { DamageParameters damage; damage.pos = projectile->eCurPos; damage.radius = 120.f; float v = 4.f + m_level * ( 1.0f / 10 ) * 6.f ; damage.damages = v * ( 1.0f / 1000 ) * framedelay; damage.area = DAMAGE_FULL; damage.duration = static_cast<long>(framedelay); damage.source = m_caster; damage.flags = 0; damage.type = DAMAGE_TYPE_MAGICAL | DAMAGE_TYPE_POISON; DamageCreate(damage); } } }
void PoisonProjectileSpell::Update() { for(size_t i = 0; i < m_projectiles.size(); i++) { CPoisonProjectile * projectile = m_projectiles[i]; projectile->Update(g_gameTime.lastFrameDuration()); } for(size_t i = 0; i < m_projectiles.size(); i++) { CPoisonProjectile * projectile = m_projectiles[i]; projectile->Render(); EERIE_LIGHT * light = lightHandleGet(projectile->lLightId); if(light) { light->intensity = 2.3f * projectile->lightIntensityFactor; light->fallend = 250.f; light->fallstart = 150.f; light->rgb = Color3f::green; light->pos = projectile->eCurPos; light->creationTime = g_gameTime.now(); light->duration = GameDurationMs(200); } AddPoisonFog(projectile->eCurPos, m_level + 7); if(m_elapsed > GameDurationMs(1600)) { DamageParameters damage; damage.pos = projectile->eCurPos; damage.radius = 120.f; damage.damages = (4.f + m_level * 0.6f) * 0.001f * g_framedelay; damage.area = DAMAGE_FULL; damage.duration = g_gameTime.lastFrameDuration(); damage.source = m_caster; damage.flags = 0; damage.type = DAMAGE_TYPE_MAGICAL | DAMAGE_TYPE_POISON; DamageCreate(damage); } } }
//----------------------------------------------------------------------------- void CMultiPoisonProjectile::Create(EERIE_3D _eSrc, float _afBeta = 0) { float afAlpha = 0.f; float afBeta = 0.f; spells[spellinstance].hand_group = inter.iobj[spells[spellinstance].caster]->obj->fastaccess.primary_attach; if (spells[spellinstance].hand_group != -1) { spells[spellinstance].hand_pos.x = inter.iobj[spells[spellinstance].caster]->obj->vertexlist3[spells[spellinstance].hand_group].v.x; spells[spellinstance].hand_pos.y = inter.iobj[spells[spellinstance].caster]->obj->vertexlist3[spells[spellinstance].hand_group].v.y; spells[spellinstance].hand_pos.z = inter.iobj[spells[spellinstance].caster]->obj->vertexlist3[spells[spellinstance].hand_group].v.z; } if (spells[spellinstance].caster == 0) // player { afBeta = player.angle.b; afAlpha = player.angle.a; if (spells[spellinstance].hand_group != -1) { _eSrc.x = spells[spellinstance].hand_pos.x - EEsin(DEG2RAD(afBeta)) * 90; _eSrc.y = spells[spellinstance].hand_pos.y; _eSrc.z = spells[spellinstance].hand_pos.z + EEcos(DEG2RAD(afBeta)) * 90; } else { _eSrc.x = player.pos.x - EEsin(DEG2RAD(afBeta)) * 90; _eSrc.y = player.pos.y; _eSrc.z = player.pos.z + EEcos(DEG2RAD(afBeta)) * 90; } } else { afBeta = inter.iobj[spells[spellinstance].caster]->angle.b; if (spells[spellinstance].hand_group != -1) { _eSrc.x = spells[spellinstance].hand_pos.x - EEsin(DEG2RAD(afBeta)) * 90; _eSrc.y = spells[spellinstance].hand_pos.y; _eSrc.z = spells[spellinstance].hand_pos.z + EEcos(DEG2RAD(afBeta)) * 90; } else { _eSrc.x = inter.iobj[spells[spellinstance].caster]->pos.x - EEsin(DEG2RAD(afBeta)) * 90; _eSrc.y = inter.iobj[spells[spellinstance].caster]->pos.y; _eSrc.z = inter.iobj[spells[spellinstance].caster]->pos.z + EEcos(DEG2RAD(afBeta)) * 90; } } long lMax = 0; for (UINT i = 0 ; i < uiNumber ; i++) { pTab[i]->Create(_eSrc, afBeta + frand2() * 10.0f); long lTime = ulDuration + (long) rnd() * 5000; pTab[i]->SetDuration(lTime); lMax = max(lMax, lTime); CPoisonProjectile * pPP = (CPoisonProjectile *) pTab[i]; pPP->SetColor(0.5f + rnd() * 0.5f, 0.5f + rnd() * 0.5f, 0.5f + rnd() * 0.5f); pPP->SetColor1(0.5f + rnd() * 0.5f, 0.5f + rnd() * 0.5f, 0.5f + rnd() * 0.5f); pPP->SetColor(0, 1, 0); pPP->SetColor1(0.3f, 0.8f, 0); pPP->lLightId = GetFreeDynLight(); if (pPP->lLightId != -1) { long id = pPP->lLightId; DynLight[id].exist = 1; DynLight[id].intensity = 2.3f; DynLight[id].fallend = 250.f; DynLight[id].fallstart = 150.f; DynLight[id].rgb.r = 0; DynLight[id].rgb.g = 1; DynLight[id].rgb.b = 0; DynLight[id].pos.x = pPP->eSrc.x; DynLight[id].pos.y = pPP->eSrc.y; DynLight[id].pos.z = pPP->eSrc.z; DynLight[id].time_creation = ARXTimeUL(); DynLight[id].duration = 200; } pTab[i]->spellinstance = this->spellinstance; } SetDuration(lMax + 1000); }
void PoisonProjectileSpell::Launch() { ARX_SOUND_PlaySFX(SND_SPELL_POISON_PROJECTILE_LAUNCH, &m_caster_pos); Vec3f srcPos = Vec3f_ZERO; float afBeta = 0.f; Entity * caster = entities[m_caster]; m_hand_group = caster->obj->fastaccess.primary_attach; if(m_hand_group != -1) { long group = m_hand_group; m_hand_pos = caster->obj->vertexlist3[group].v; } if(m_caster == PlayerEntityHandle) { afBeta = player.angle.getPitch(); if(m_hand_group != -1) { srcPos = m_hand_pos; } else { srcPos = player.pos; } } else { afBeta = entities[m_caster]->angle.getPitch(); if(m_hand_group != -1) { srcPos = m_hand_pos; } else { srcPos = entities[m_caster]->pos; } } srcPos += angleToVectorXZ(afBeta) * 90.f; long level = std::max(long(m_level), 1l); size_t uiNumber = std::min(5L, level); for(size_t i = 0; i < uiNumber; i++) { CPoisonProjectile * projectile = new CPoisonProjectile(); m_projectiles.push_back(projectile); } m_duration = 8000ul; long lMax = 0; for(size_t i = 0; i < m_projectiles.size(); i++) { CPoisonProjectile * projectile = m_projectiles[i]; projectile->Create(srcPos, afBeta + frand2() * 10.0f); long lTime = m_duration + Random::get(0, 5000); projectile->SetDuration(lTime); lMax = std::max(lMax, lTime); projectile->lLightId = GetFreeDynLight(); if(lightHandleIsValid(projectile->lLightId)) { EERIE_LIGHT * light = lightHandleGet(projectile->lLightId); light->intensity = 2.3f; light->fallend = 250.f; light->fallstart = 150.f; light->rgb = Color3f::green; light->pos = projectile->eSrc; light->time_creation = (unsigned long)(arxtime); light->duration = 200; } } m_duration = lMax + 1000; }
void PoisonProjectileSpell::Launch() { ARX_SOUND_PlaySFX(g_snd.SPELL_POISON_PROJECTILE_LAUNCH, &m_caster_pos); Vec3f srcPos(0.f); float afBeta = 0.f; Entity * caster = entities[m_caster]; m_hand_group = caster->obj->fastaccess.primary_attach; if(m_hand_group != ActionPoint()) { ActionPoint group = m_hand_group; m_hand_pos = actionPointPosition(caster->obj, group); } if(m_caster == EntityHandle_Player) { afBeta = player.angle.getYaw(); if(m_hand_group != ActionPoint()) { srcPos = m_hand_pos; } else { srcPos = player.pos; } } else { afBeta = entities[m_caster]->angle.getYaw(); if(m_hand_group != ActionPoint()) { srcPos = m_hand_pos; } else { srcPos = entities[m_caster]->pos; } } srcPos += angleToVectorXZ(afBeta) * 90.f; size_t uiNumber = glm::clamp(static_cast<unsigned int>(m_level), 1u, 5u); for(size_t i = 0; i < uiNumber; i++) { CPoisonProjectile * projectile = new CPoisonProjectile(); m_projectiles.push_back(projectile); } m_duration = GameDurationMs(8000); m_hasDuration = true; GameDuration lMax = 0; for(size_t i = 0; i < m_projectiles.size(); i++) { CPoisonProjectile * projectile = m_projectiles[i]; projectile->Create(srcPos, afBeta + Random::getf(-10.f, 10.f)); GameDuration lTime = m_duration + GameDurationMs(Random::getu(0, 5000)); projectile->SetDuration(lTime); lMax = std::max(lMax, lTime); EERIE_LIGHT * light = dynLightCreate(projectile->lLightId); if(light) { light->intensity = 2.3f; light->fallend = 250.f; light->fallstart = 150.f; light->rgb = Color3f::green; light->pos = projectile->eSrc; light->creationTime = g_gameTime.now(); light->duration = GameDurationMs(200); } } m_duration = lMax + GameDurationMs(1000); }