void NegateMagicSpell::Update() { LaunchAntiMagicField(); if(m_target == EntityHandle_Player) { m_pos = player.basePosition(); } else { Entity * target = entities.get(m_target); if(target) { m_pos = target->pos; } } Vec3f stitepos = m_pos - Vec3f(0.f, 10.f, 0.f); RenderMaterial mat; mat.setLayer(RenderMaterial::Decal); mat.setDepthTest(true); mat.setTexture(tex_sol); mat.setBlendType(RenderMaterial::Additive); for(int i = 0; i < 360; i++) { float t = Random::getf(); if(t < 0.04f) { PARTICLE_DEF * pd = createParticle(); if(!pd) { break; } pd->ov = stitepos + arx::randomOffsetXZ(150.f); pd->move = Vec3f(0.f, Random::getf(-3.f, 0.f), 0.f); pd->siz = 0.3f; pd->tolive = Random::getu(2000, 4000); pd->tc = tex_p2; pd->m_flags = FADE_IN_AND_OUT | ROTATING | DISSIPATING | SUBSTRACT; pd->m_rotation = 0.0000001f; } } float rot = timeWaveSaw(g_gameTime.now(), GameDurationMs(18000)) * 360.f; Anglef stiteangle(0.f, -rot, 0.f); float scalediff = timeWaveSin(g_gameTime.now(), GameDurationMsf(1570.79632f)); { Color3f stitecolor = Color3f::gray(.4f); Vec3f stitescale = Vec3f(3.f + 0.5f * scalediff); Draw3DObject(ssol, stiteangle, stitepos, stitescale, stitecolor, mat); } { Color3f stitecolor = Color3f(.5f, 0.f, .5f); Vec3f stitescale = Vec3f(3.1f + 0.2f * scalediff); Draw3DObject(ssol, stiteangle, stitepos, stitescale, stitecolor, mat); } }
void ConfuseSpell::Update() { Entity * target = entities.get(m_target); if(!target) { return; } Vec3f pos = target->pos; if(m_target != EntityHandle_Player) { pos.y += target->physics.cyl.height - 30.f; } ObjVertHandle idx = target->obj->fastaccess.head_group_origin; if(idx != ObjVertHandle()) { pos = target->obj->vertexWorldPositions[idx.handleData()].v; pos.y -= 50.f; } eCurPos = pos; RenderMaterial mat; mat.setDepthTest(false); mat.setBlendType(RenderMaterial::Additive); mat.setTexture(tex_trail); float rot = timeWaveSaw(g_gameTime.now(), GameDurationMs(3142)) * 360.f; Anglef stiteangle = Anglef(0.f, -rot, 0.f); { AnimationDuration delta = toAnimationDuration(g_gameTime.lastFrameDuration()); EERIEDrawAnimQuatUpdate(spapi, animlayer, stiteangle, eCurPos, delta, NULL, false); EERIEDrawAnimQuatRender(spapi, eCurPos, NULL, 0.f); } for(int i = 0; i < 6; i++) { PARTICLE_DEF * pd = createParticle(); if(!pd) { break; } Vec2f p = arx::diskRand(15.f); pd->ov = eCurPos + Vec3f(p.x, 0.f, p.y); pd->move = Vec3f(0.f, Random::getf(1.f, 4.f), 0.f); pd->siz = 0.25f; pd->tolive = Random::getu(2300, 3300); pd->tc = tex_p1; pd->m_flags = PARTICLE_GOLDRAIN | FADE_IN_AND_OUT | ROTATING | DISSIPATING; pd->m_rotation = 0.0000001f; Color3f baseColor = Color3f(0.4f, 0.2f, 0.4f); Color3f randomFactor = Color3f(0.4f, 0.6f, 0.4f); Color3f c = baseColor + randomColor3f() * randomFactor; while(glm::abs(c.r - c.g) > 0.3f && glm::abs(c.g - c.b) > 0.3f) { c = baseColor + randomColor3f() * randomFactor; } pd->rgb = c * Color3f(0.8f, 0.8f, 0.8f); } EERIE_LIGHT * light = dynLightCreate(m_light); if(light) { light->intensity = 1.3f; light->fallstart = 180.f; light->fallend = 420.f; light->rgb = Color3f(0.3f, 0.3f, 0.5f) + Color3f(0.2f, 0.f, 0.2f) * randomColor3f(); light->pos = eCurPos; light->duration = GameDurationMs(200); light->extras = 0; } }