void FlyingEyeSpell::End() { ARX_SOUND_PlaySFX(SND_MAGIC_FIZZLE, &entities[m_caster]->pos); static TextureContainer * tc4=TextureContainer::Load("graph/particles/smoke"); ARX_SOUND_PlaySFX(SND_SPELL_EYEBALL_OUT); eyeball.exist = -100; for(long n = 0; n < 12; n++) { PARTICLE_DEF * pd = createParticle(); if(!pd) { break; } pd->ov = eyeball.pos + randomVec(-5.f, 5.f); pd->move = randomVec(-2.f, 2.f); pd->siz = 28.f; pd->tolive = Random::get(2000, 6000); pd->scale = Vec3f(12.f); pd->tc = tc4; pd->special = FADE_IN_AND_OUT | ROTATING | MODULATE_ROTATION | DISSIPATING; pd->fparam = 0.0000001f; pd->rgb = Color3f(0.7f, 0.7f, 1.f); } config.input.mouseLookToggle = bOldLookToggle; lightHandleDestroy(special[2]); lightHandleDestroy(special[1]); }
void FlyingEyeSpell::End() { Entity * caster = entities.get(m_caster); if(caster) { ARX_SOUND_PlaySFX(g_snd.MAGIC_FIZZLE, &caster->pos); } static TextureContainer * tc4 = TextureContainer::Load("graph/particles/smoke"); ARX_SOUND_PlaySFX(g_snd.SPELL_EYEBALL_OUT); eyeball.exist = -100; for(long n = 0; n < 12; n++) { PARTICLE_DEF * pd = createParticle(); if(!pd) { break; } pd->ov = eyeball.pos + arx::randomVec(-5.f, 5.f); pd->move = arx::randomVec(-2.f, 2.f); pd->siz = 28.f; pd->tolive = Random::getu(2000, 6000); pd->scale = Vec3f(12.f); pd->tc = tc4; pd->m_flags = FADE_IN_AND_OUT | ROTATING | DISSIPATING; pd->m_rotation = 0.0000001f; pd->rgb = Color3f(0.7f, 0.7f, 1.f); } config.input.mouseLookToggle = bOldLookToggle; lightHandleDestroy(m_light1); lightHandleDestroy(m_light2); }
void SummonCreatureSpell::End() { lightHandleDestroy(m_light); // need to killio if(ValidIONum(m_summonedEntity)) { Entity * io = entities[m_summonedEntity]; ARX_SOUND_PlaySFX(SND_SPELL_ELECTRIC, &io->pos); if(io->scriptload && (io->ioflags & IO_NOSAVE)) { AddRandomSmoke(io, 100); Vec3f posi = io->pos; posi.y -= 100.f; MakeCoolFx(posi); LightHandle nn = GetFreeDynLight(); if(lightHandleIsValid(nn)) { EERIE_LIGHT * light = lightHandleGet(nn); light->intensity = Random::getf(0.7f, 2.7f); light->fallend = 600.f; light->fallstart = 400.f; light->rgb = Color3f(1.0f, 0.8f, 0.0f); light->pos = posi; light->duration = 600; } io->destroyOne(); } } m_summonedEntity = EntityHandle(); }
void CheckForIgnition(const Vec3f & pos, float radius, bool mode, long flag) { if(!(flag & 1)) for(size_t i = 0; i < MAX_LIGHTS; i++) { EERIE_LIGHT * el = GLight[i]; if(el == NULL) continue; if((el->extras & EXTRAS_EXTINGUISHABLE) && (el->extras & (EXTRAS_SEMIDYNAMIC | EXTRAS_SPAWNFIRE | EXTRAS_SPAWNSMOKE))) { if((el->extras & EXTRAS_FIREPLACE) && (flag & 2)) continue; if(!fartherThan(pos, el->pos, radius)) { if(mode) { if (!(el->extras & EXTRAS_NO_IGNIT)) el->m_ignitionStatus = true; } else { el->m_ignitionStatus = false; } } } } for(size_t i = 0; i < entities.size(); i++) { const EntityHandle handle = EntityHandle(i); Entity * io = entities[handle]; if( io && io->show == SHOW_FLAG_IN_SCENE && io->obj && !(io->ioflags & IO_UNDERWATER) && io->obj->fastaccess.fire >= 0 ) { if(closerThan(pos, io->obj->vertexlist3[io->obj->fastaccess.fire].v, radius)) { if(mode && io->ignition <= 0 && io->obj->fastaccess.fire >= 0) { io->ignition = 1; } else if(!mode && io->ignition > 0) { if(io->obj->fastaccess.fire >= 0) { io->ignition = 0; lightHandleDestroy(io->ignit_light); if(io->ignit_sound != audio::INVALID_ID) { ARX_SOUND_Stop(io->ignit_sound); io->ignit_sound = audio::INVALID_ID; } } else if(!(flag & 2)) io->ignition = 0.00001f; } } } } }
void RestoreAllLightsInitialStatus() { for(size_t i = 0; i < g_staticLightsMax; i++) { if(g_staticLights[i]) { g_staticLights[i]->m_ignitionStatus = !(g_staticLights[i]->extras & EXTRAS_STARTEXTINGUISHED); if(!g_staticLights[i]->m_ignitionStatus) { lightHandleDestroy(g_staticLights[i]->m_ignitionLightHandle); } } } }
void IgnitSpell::End() { std::vector<T_LINKLIGHTTOFX>::iterator itr; for(itr = m_lights.begin(); itr != m_lights.end(); ++itr) { GLight[itr->iLightNum]->m_ignitionStatus = true; ARX_SOUND_PlaySFX(SND_SPELL_IGNITE, &itr->poslight); lightHandleDestroy(itr->idl); } m_lights.clear(); }
void IgnitSpell::End() { std::vector<T_LINKLIGHTTOFX>::iterator itr; for(itr = m_lights.begin(); itr != m_lights.end(); ++itr) { EERIE_LIGHT * light = g_staticLights[itr->m_targetLight]; light->m_ignitionStatus = true; ARX_SOUND_PlaySFX(SND_SPELL_IGNITE, &light->pos); lightHandleDestroy(itr->m_effectLight); } m_lights.clear(); }
static void removeFlare(FLARES & flare) { if(flare.io && ValidIOAddress(flare.io)) { flare.io->flarecount--; } lightHandleDestroy(flare.dynlight); flare.tolive = 0; flare.exist = 0; flarenum--; }
static void removeFlare(MagicFlare & flare) { if(flare.io && ValidIOAddress(flare.io)) { flare.io->flarecount--; } lightHandleDestroy(flare.dynlight); flare.tolive = 0; flare.exist = 0; g_magicFlaresCount--; }
void Entity::cleanReferences() { ARX_INTERACTIVE_DestroyIOdelayedRemove(this); if(DRAGINTER == this) { Set_DragInter(NULL); } if(FlyingOverIO == this) { FlyingOverIO = NULL; } if(COMBINE == this) { COMBINE = NULL; } if(pIOChangeWeapon == this) { pIOChangeWeapon = NULL; // TODO we really need a proper weak_ptr } if(ioSteal == this) { ioSteal = NULL; } if(!FAST_RELEASE) { TREATZONE_RemoveIO(this); } gameFlags &= ~GFLAG_ISINTREATZONE; ARX_INTERACTIVE_DestroyDynamicInfo(this); RemoveFromAllInventories(this); ARX_SCRIPT_Timer_Clear_For_IO(this); spells.endByCaster(index()); lightHandleDestroy(ignit_light); if(ignit_sound != audio::INVALID_ID) { ARX_SOUND_Stop(ignit_sound), ignit_sound = audio::INVALID_ID; } }
void ARX_MAGICAL_FLARES_KillAll() { for(size_t i = 0; i < MAX_FLARES; i++) { FLARES & flare = magicFlares[i]; if (flare.exist) { if (flare.io) { flare.io->flarecount--; } flare.exist=0; flare.tolive=0; flarenum--; lightHandleDestroy(flare.dynlight); } } flarenum=0; }
void ARX_DAMAGES_ForceDeath(Entity * io_dead, Entity * io_killer) { if(io_dead->mainevent == "dead") { return; } Entity * old_sender = EVENT_SENDER; EVENT_SENDER = io_killer; if(io_dead == DRAGINTER) Set_DragInter(NULL); if(io_dead == FlyingOverIO) FlyingOverIO = NULL; if((MasterCamera.exist & 1) && (MasterCamera.io == io_dead)) MasterCamera.exist = 0; if((MasterCamera.exist & 2) && (MasterCamera.want_io == io_dead)) MasterCamera.exist = 0; lightHandleDestroy(io_dead->dynlight); lightHandleDestroy(io_dead->halo.dynlight); //Kill all speeches ARX_NPC_Behaviour_Reset(io_dead); ARX_SPEECH_ReleaseIOSpeech(io_dead); //Kill all Timers... ARX_SCRIPT_Timer_Clear_For_IO(io_dead); if(io_dead->mainevent != "dead") { if(SendIOScriptEvent(io_dead, SM_DIE) != REFUSE && ValidIOAddress(io_dead)) { io_dead->infracolor = Color3f::blue; } } if (!ValidIOAddress(io_dead)) return; ARX_SCRIPT_SetMainEvent(io_dead, "dead"); if(fartherThan(io_dead->pos, ACTIVECAM->orgTrans.pos, 3200.f)) { io_dead->animlayer[0].ctime = 9999999; io_dead->animBlend.lastanimtime = 0; } std::string killer; if(io_dead->ioflags & IO_NPC) io_dead->_npcdata->weaponinhand = 0; ARX_INTERACTIVE_DestroyDynamicInfo(io_dead); if(io_killer == entities.player()) { killer = "player"; } else { if(io_killer) killer = io_killer->idString(); } for(size_t i = 1; i < entities.size(); i++) { const EntityHandle handle = EntityHandle(i); Entity * ioo = entities[handle]; if(ioo == io_dead) continue; if(ioo && (ioo->ioflags & IO_NPC)) { if(ValidIONum(ioo->targetinfo)) if(entities[ioo->targetinfo] == io_dead) { EVENT_SENDER = io_dead; Stack_SendIOScriptEvent(entities[handle], SM_NULL, killer, "target_death"); ioo->targetinfo = EntityHandle(TARGET_NONE); ioo->_npcdata->reachedtarget = 0; } if(ValidIONum(ioo->_npcdata->pathfind.truetarget)) if(entities[ioo->_npcdata->pathfind.truetarget] == io_dead) { EVENT_SENDER = io_dead; Stack_SendIOScriptEvent(entities[handle], SM_NULL, killer, "target_death"); ioo->_npcdata->pathfind.truetarget = EntityHandle(TARGET_NONE); ioo->_npcdata->reachedtarget = 0; } } } io_dead->animlayer[1].cur_anim = NULL; io_dead->animlayer[2].cur_anim = NULL; io_dead->animlayer[3].cur_anim = NULL; if(io_dead->ioflags & IO_NPC) { io_dead->_npcdata->lifePool.current = 0; if(io_dead->_npcdata->weapon) { Entity * ioo = io_dead->_npcdata->weapon; if(ValidIOAddress(ioo)) { ioo->show = SHOW_FLAG_IN_SCENE; ioo->ioflags |= IO_NO_NPC_COLLIDE; ioo->pos = ioo->obj->vertexlist3[ioo->obj->origin].v; ioo->velocity = Vec3f(0.f, 13.f, 0.f); ioo->stopped = 0; } } } EVENT_SENDER = old_sender; }
Entity::~Entity() { cleanReferences(); if(g_cameraEntity == this) { g_cameraEntity = NULL; } // Releases ToBeDrawn Transparent Polys linked to this object ! tweaks.clear(); if(obj && !(ioflags & IO_CAMERA) && !(ioflags & IO_MARKER) && !(ioflags & IO_GOLD)) { delete obj, obj = NULL; } spells.removeTarget(this); delete tweakerinfo; delete tweaky, tweaky = NULL; ReleaseScript(&script); ReleaseScript(&over_script); for(size_t n = 0; n < MAX_ANIMS; n++) { if(anims[n]) { EERIE_ANIMMANAGER_ReleaseHandle(anims[n]); anims[n] = NULL; } } lightHandleDestroy(dynlight); delete usepath; delete symboldraw; symboldraw = NULL; if(ioflags & IO_NPC) { delete _npcdata; } else if(ioflags & IO_ITEM) { free(_itemdata->equipitem); delete _itemdata; } else if(ioflags & IO_FIX) { delete _fixdata; } else if(ioflags & IO_CAMERA && _camdata) { if(g_camera == &_camdata->cam) { SetActiveCamera(&g_playerCamera); } delete _camdata; } if(SecondaryInventory && SecondaryInventory->io == this) { SecondaryInventory = NULL; } if(TSecondaryInventory && TSecondaryInventory->io == this) { TSecondaryInventory = NULL; } delete inventory; if(m_index != size_t(-1)) { entities.remove(m_index); } }
void ARX_MAGICAL_FLARES_Update() { if(!flarenum) return; shinum++; if(shinum >= 10) { shinum = 1; } long TICKS = long(arxtime) - FRAMETICKS; FRAMETICKS = (unsigned long)(arxtime); if(TICKS < 0) { return; } bool key = !GInput->actionPressed(CONTROLS_CUST_MAGICMODE); RenderMaterial mat; mat.setBlendType(RenderMaterial::Additive); EERIE_LIGHT * light = lightHandleGet(torchLightHandle); for(long j = 1; j < 5; j++) { TextureContainer * surf; switch(j) { case 2: surf = flaretc.lumignon; break; case 3: surf = flaretc.lumignon2; break; case 4: surf = flaretc.plasm; break; default: surf = flaretc.shine[shinum]; break; } mat.setTexture(surf); for(size_t i = 0; i < MAX_FLARES; i++) { FLARES & flare = magicFlares[i]; if(!flare.exist || flare.type != j) { continue; } flare.tolive -= float(TICKS * 2); if(flare.flags & 1) { flare.tolive -= float(TICKS * 4); } else if (key) { flare.tolive -= float(TICKS * 6); } float z = (flare.tolive * 0.00025f); float s; if(flare.type == 1) { s = flare.size * 2 * z; } else if(flare.type == 4) { s = flare.size * 2.f * z + 10.f; } else { s = flare.size; } if(flare.tolive <= 0.f || flare.pos.y < -64.f || s < 3.f) { if(flare.io && ValidIOAddress(flare.io)) { flare.io->flarecount--; } lightHandleDestroy(flare.dynlight); flare.exist = 0; flarenum--; continue; } if(flare.type == 1 && z < 0.6f) { z = 0.6f; } Color3f c = flare.rgb * z; flare.tv.color = c.toRGB(); flare.v.p = flare.tv.p; light->rgb = componentwise_max(light->rgb, c); if(lightHandleIsValid(flare.dynlight)) { EERIE_LIGHT * el = lightHandleGet(flare.dynlight); el->pos = flare.v.p; el->rgb = c; } mat.setDepthTest(flare.io != NULL); if(flare.bDrawBitmap) { s *= 2.f; EERIEAddBitmap(mat, flare.v.p, s, s, surf, Color::fromRGBA(flare.tv.color)); } else { EERIEAddSprite(mat, flare.v.p, s * 0.025f + 1.f, Color::fromRGBA(flare.tv.color), 2.f); } } } light->rgb = componentwise_min(light->rgb, Color3f::white); }
void FakeSummonSpell::End() { ARX_SOUND_PlaySFX(SND_SPELL_ELECTRIC, &m_targetPos); lightHandleDestroy(m_light); }
void SummonCreatureSpell::Update() { if(arxtime.is_paused()) return; float elapsed = arxtime.now_f() - m_timcreation; if(elapsed <= 4000) { if(Random::getf() > 0.7f) { Vec3f pos = m_fissure.m_eSrc; MakeCoolFx(pos); } m_fissure.Update(g_framedelay); m_fissure.Render(); m_requestSummon = true; m_summonedEntity = EntityHandle(); } else if(m_requestSummon) { lightHandleDestroy(m_light); m_requestSummon = false; ARX_SOUND_PlaySFX(SND_SPELL_ELECTRIC, &m_targetPos); Cylinder phys = Cylinder(m_targetPos, 50, -200); float anything = CheckAnythingInCylinder(phys, NULL, CFLAG_JUST_TEST); if(glm::abs(anything) < 30) { long tokeep; res::path cls; if(m_megaCheat) { if(Random::getf() > 0.5f) { tokeep = -1; cls = "graph/obj3d/interactive/npc/wrat_base/wrat_base"; } else { tokeep = 0; cls = "graph/obj3d/interactive/npc/y_mx/y_mx"; } } else if(Random::getf() > 0.997f || (sp_max && Random::getf() > 0.8f) || (cur_mr >= 3 && Random::getf() > 0.3f)) { tokeep = 0; cls = "graph/obj3d/interactive/npc/y_mx/y_mx"; } else if(Random::getf() > 0.997f || (cur_rf >= 3 && Random::getf() > 0.8f) || (cur_mr >= 3 && Random::getf() > 0.3f)) { tokeep = -1; cls = "graph/obj3d/interactive/npc/wrat_base/wrat_base"; } else if(m_level >= 9) { tokeep = 1; cls = "graph/obj3d/interactive/npc/demon/demon"; } else if(Random::getf() > 0.98f) { tokeep = -1; cls = "graph/obj3d/interactive/npc/wrat_base/wrat_base"; } else { tokeep = 0; cls = "graph/obj3d/interactive/npc/chicken_base/chicken_base"; } Entity * io = AddNPC(cls, -1, IO_IMMEDIATELOAD); if(!io) { cls = "graph/obj3d/interactive/npc/chicken_base/chicken_base"; tokeep = 0; io = AddNPC(cls, -1, IO_IMMEDIATELOAD); } if(io) { RestoreInitialIOStatusOfIO(io); io->summoner = m_caster; io->scriptload = 1; if(tokeep == 1) { io->ioflags |= IO_NOSAVE; } io->pos = phys.origin; SendInitScriptEvent(io); if(tokeep < 0) { io->scale=1.65f; io->physics.cyl.radius=25; io->physics.cyl.height=-43; io->speed_modif=1.f; } if(ValidIONum(m_caster)) { EVENT_SENDER = entities[m_caster]; } else { EVENT_SENDER = NULL; } SendIOScriptEvent(io,SM_SUMMONED); for(long j = 0; j < 3; j++) { Vec3f pos = m_fissure.m_eSrc; pos += randomVec3f() * 100.f; pos += Vec3f(-50.f, 50.f, -50.f); MakeCoolFx(pos); } if(tokeep==1) m_summonedEntity = io->index(); else m_summonedEntity = EntityHandle(); } } } else if(m_summonedEntity == EntityHandle()) { m_duration = 0; } }