void CMultiMagicMissile::Create(Vec3f aePos, float afAlpha, float afBeta) { long lMax = 0; for(size_t i = 0; i < pTab.size(); i++) { Anglef angles(afAlpha, afBeta, 0.f); if(i > 0) { angles.setYaw(angles.getYaw() + frand2() * 4.0f); angles.setPitch(angles.getPitch() + frand2() * 6.0f); } pTab[i]->Create(aePos, angles); float fTime = ulDuration + frand2() * 1000.0f; long lTime = checked_range_cast<long>(fTime); lTime = std::max(1000L, lTime); lMax = std::max(lMax, lTime); CMagicMissile * pMM = (CMagicMissile *)pTab[i]; pMM->SetDuration(lTime); if(m_mrCheat) { pMM->SetColor(Color3f(0.9f, 0.2f, 0.5f)); } else { pMM->SetColor(Color3f(0.9f + rnd() * 0.1f, 0.9f + rnd() * 0.1f, 0.7f + rnd() * 0.3f)); } pTab[i]->lLightId = GetFreeDynLight(); if(lightHandleIsValid(pTab[i]->lLightId)) { EERIE_LIGHT * el = lightHandleGet(pTab[i]->lLightId); el->intensity = 0.7f + 2.3f; el->fallend = 190.f; el->fallstart = 80.f; if(m_mrCheat) { el->rgb.r = 1; el->rgb.g = 0.3f; el->rgb.b = 0.8f; } else { el->rgb.r = 0; el->rgb.g = 0; el->rgb.b = 1; } el->pos = pMM->eSrc; el->duration = 300; } } SetDuration(lMax + 1000); }
//----------------------------------------------------------------------------- void CMultiMagicMissile::Create(EERIE_3D aePos, EERIE_3D angles) { long lMax = 0; if (pTab) { float afAlpha = angles.a; float afBeta = angles.b; spells[spellinstance].hand_group = GetActionPointIdx(inter.iobj[spells[spellinstance].caster]->obj, "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; EERIE_3D vector; vector.x = -EEsin(DEG2RAD(afBeta)) * EEcos(DEG2RAD(afAlpha)) * 60.f; vector.y = EEsin(DEG2RAD(afAlpha)) * 60.f; vector.z = EEcos(DEG2RAD(afBeta)) * EEcos(DEG2RAD(afAlpha)) * 60.f; if (spells[spellinstance].hand_group != -1) { aePos.x = spells[spellinstance].hand_pos.x + vector.x; aePos.y = spells[spellinstance].hand_pos.y + vector.y; aePos.z = spells[spellinstance].hand_pos.z + vector.z; } else { aePos.x = player.pos.x - EEsin(DEG2RAD(afBeta)) + vector.x; aePos.y = player.pos.y + vector.y; //; aePos.z = player.pos.z + EEcos(DEG2RAD(afBeta)) + vector.z; } } else { afAlpha = 0; afBeta = inter.iobj[spells[spellinstance].caster]->angle.b; EERIE_3D vector; vector.x = -EEsin(DEG2RAD(afBeta)) * EEcos(DEG2RAD(afAlpha)) * 60; vector.y = EEsin(DEG2RAD(afAlpha)) * 60; vector.z = EEcos(DEG2RAD(afBeta)) * EEcos(DEG2RAD(afAlpha)) * 60; if (spells[spellinstance].hand_group != -1) { aePos.x = spells[spellinstance].hand_pos.x + vector.x; aePos.y = spells[spellinstance].hand_pos.y + vector.y; aePos.z = spells[spellinstance].hand_pos.z + vector.z; } else { aePos.x = inter.iobj[spells[spellinstance].caster]->pos.x + vector.x; aePos.y = inter.iobj[spells[spellinstance].caster]->pos.y + vector.y; aePos.z = inter.iobj[spells[spellinstance].caster]->pos.z + vector.z; } INTERACTIVE_OBJ * io = inter.iobj[spells[spellinstance].caster]; if (ValidIONum(io->targetinfo)) { EERIE_3D * p1 = &spells[spellinstance].caster_pos; EERIE_3D * p2 = &inter.iobj[io->targetinfo]->pos; afAlpha = -(RAD2DEG(GetAngle(p1->y, p1->z, p2->y, p2->z + TRUEDistance2D(p2->x, p2->z, p1->x, p1->z)))); //alpha entre orgn et dest; } else if (ValidIONum(spells[spellinstance].target)) { EERIE_3D * p1 = &spells[spellinstance].caster_pos; EERIE_3D * p2 = &inter.iobj[spells[spellinstance].target]->pos; afAlpha = -(RAD2DEG(GetAngle(p1->y, p1->z, p2->y, p2->z + TRUEDistance2D(p2->x, p2->z, p1->x, p1->z)))); //alpha entre orgn et dest; } } for (UINT i = 0 ; i < uiNumber ; i++) { if (pTab[i]) { EERIE_3D angles; angles.a = afAlpha; angles.b = afBeta; angles.g = 0; if (i > 0) { angles.a += frand2() * 4.0f; angles.b += frand2() * 6.0f; } pTab[i]->Create(aePos, angles); float fTime = ulDuration + frand2() * 1000.0f; ARX_CHECK_LONG(fTime); long lTime = ARX_CLEAN_WARN_CAST_LONG(fTime); lTime = max(1000, lTime); lMax = max(lMax, lTime); CMagicMissile * pMM = (CMagicMissile *)pTab[i]; pMM->SetDuration(lTime); if ((spells[spellinstance].caster == 0) && (cur_mr == 3)) { pMM->SetColor(0.9f, 0.2f, 0.5f); pMM->SetColor1(0.9f, 0.2f, 0.5f); } else { pMM->SetColor(0.9f + rnd() * 0.1f, 0.9f + rnd() * 0.1f, 0.7f + rnd() * 0.3f); pMM->SetColor1(0.9f + rnd() * 0.1f, 0.9f + rnd() * 0.1f, 0.7f + rnd() * 0.3f); } pTab[i]->lLightId = GetFreeDynLight(); if (pTab[i]->lLightId != -1) { EERIE_LIGHT * el = &DynLight[pTab[i]->lLightId]; el->exist = 1; el->intensity = 0.7f + 2.3f; el->fallend = 190.f; el->fallstart = 80.f; if ((spells[spellinstance].caster == 0) && (cur_mr == 3)) { el->rgb.r = 1; el->rgb.g = 0.3f; el->rgb.b = 0.8f; } else { el->rgb.r = 0; el->rgb.g = 0; el->rgb.b = 1; } el->pos.x = pMM->eSrc.x; el->pos.y = pMM->eSrc.y; el->pos.z = pMM->eSrc.z; el->duration = 300; } } } } SetDuration(lMax + 1000); }
void CMultiMagicMissile::Create() { long lMax = 0; if(pTab) { spells[spellinstance].hand_group = GetActionPointIdx(entities[spells[spellinstance].caster]->obj, "primary_attach"); if(spells[spellinstance].hand_group != -1) { Entity * caster = entities[spells[spellinstance].caster]; long group = spells[spellinstance].hand_group; spells[spellinstance].hand_pos = caster->obj->vertexlist3[group].v; } Vec3f aePos; float afAlpha, afBeta; if(spells[spellinstance].caster == 0) { // player afBeta = player.angle.getPitch(); afAlpha = player.angle.getYaw(); Vec3f vector; vector.x = -EEsin(radians(afBeta)) * EEcos(radians(afAlpha)) * 60.f; vector.y = EEsin(radians(afAlpha)) * 60.f; vector.z = EEcos(radians(afBeta)) * EEcos(radians(afAlpha)) * 60.f; if(spells[spellinstance].hand_group != -1) { aePos = spells[spellinstance].hand_pos + vector; } else { aePos.x = player.pos.x - EEsin(radians(afBeta)) + vector.x; aePos.y = player.pos.y + vector.y; //; aePos.z = player.pos.z + EEcos(radians(afBeta)) + vector.z; } } else { afAlpha = 0; afBeta = entities[spells[spellinstance].caster]->angle.getPitch(); Vec3f vector; vector.x = -EEsin(radians(afBeta)) * EEcos(radians(afAlpha)) * 60; vector.y = EEsin(radians(afAlpha)) * 60; vector.z = EEcos(radians(afBeta)) * EEcos(radians(afAlpha)) * 60; if(spells[spellinstance].hand_group != -1) { aePos = spells[spellinstance].hand_pos + vector; } else { aePos = entities[spells[spellinstance].caster]->pos + vector; } Entity * io = entities[spells[spellinstance].caster]; if(ValidIONum(io->targetinfo)) { Vec3f * p1 = &spells[spellinstance].caster_pos; Vec3f * p2 = &entities[io->targetinfo]->pos; afAlpha = -(degrees(getAngle(p1->y, p1->z, p2->y, p2->z + glm::distance(Vec2f(p2->x, p2->z), Vec2f(p1->x, p1->z))))); //alpha entre orgn et dest; } else if (ValidIONum(spells[spellinstance].target)) { Vec3f * p1 = &spells[spellinstance].caster_pos; Vec3f * p2 = &entities[spells[spellinstance].target]->pos; afAlpha = -(degrees(getAngle(p1->y, p1->z, p2->y, p2->z + glm::distance(Vec2f(p2->x, p2->z), Vec2f(p1->x, p1->z))))); //alpha entre orgn et dest; } } for(unsigned int i = 0; i < uiNumber; i++) { if(pTab[i]) { Anglef angles(afAlpha, afBeta, 0.f); if(i > 0) { angles.setYaw(angles.getYaw() + frand2() * 4.0f); angles.setPitch(angles.getPitch() + frand2() * 6.0f); } pTab[i]->Create(aePos, angles); float fTime = ulDuration + frand2() * 1000.0f; long lTime = checked_range_cast<long>(fTime); lTime = std::max(1000L, lTime); lMax = std::max(lMax, lTime); CMagicMissile * pMM = (CMagicMissile *)pTab[i]; pMM->SetDuration(lTime); if(spells[spellinstance].caster == 0 && cur_mr == 3) { pMM->SetColor(Color3f(0.9f, 0.2f, 0.5f)); } else { pMM->SetColor(Color3f(0.9f + rnd() * 0.1f, 0.9f + rnd() * 0.1f, 0.7f + rnd() * 0.3f)); } pTab[i]->lLightId = GetFreeDynLight(); if(pTab[i]->lLightId != -1) { EERIE_LIGHT * el = &DynLight[pTab[i]->lLightId]; el->exist = 1; el->intensity = 0.7f + 2.3f; el->fallend = 190.f; el->fallstart = 80.f; if(spells[spellinstance].caster == 0 && cur_mr == 3) { el->rgb.r = 1; el->rgb.g = 0.3f; el->rgb.b = 0.8f; } else { el->rgb.r = 0; el->rgb.g = 0; el->rgb.b = 1; } el->pos = pMM->eSrc; el->duration = 300; } } } } SetDuration(lMax + 1000); }