static EERIEPOLY * ANCHOR_CheckInPoly(const Vec3f & pos) { long x = pos.x * ACTIVEBKG->Xmul; long z = pos.z * ACTIVEBKG->Zmul; if(x < 0 || x >= ACTIVEBKG->Xsize || z < 0 || z >= ACTIVEBKG->Zsize) return NULL; EERIEPOLY *found = NULL; EERIE_BKG_INFO *feg = &ACTIVEBKG->fastdata[x][z]; for(long k = 0; k < feg->nbpolyin; k++) { EERIEPOLY *ep = feg->polyin[k]; if (!(ep->type & (POLY_WATER | POLY_TRANS | POLY_NOCOL)) && (ep->max.y >= pos.y) && (ep != found) && ((ep->norm.y < 0.f) || ((ep->type & POLY_QUAD) && (ep->norm2.y < 0.f))) && (PointIn2DPolyXZ(ep, pos.x, pos.z))) { if(!found || (found && ep->min.y < found->min.y)) found = ep; } } if(!found) return CheckInPoly(pos); return found; }
void Hole:: Update() { if(mario->GetTranslate().y==0 && CheckInPoly(p1, p2, p3, p4, mario->GetTranslate(), View::Up)) { mario->SetDrown(); mario->SetDead(); } }
static long ARX_PORTALS_GetRoomNumForCamera(float * height) { EERIEPOLY * ep; ep = CheckInPoly(ACTIVECAM->orgTrans.pos); if(ep && ep->room > -1) { if(height) *height=ep->center.y; return ep->room; } ep = GetMinPoly(ACTIVECAM->orgTrans.pos); if(ep && ep->room > -1) { if(height) *height=ep->center.y; return ep->room; } float dist=0.f; while(dist<=20.f) { Vec3f tmpPos = ACTIVECAM->orgTrans.pos; tmpPos += angleToVectorXZ_180offset(ACTIVECAM->angle.getPitch()) * dist; ep = CheckInPoly(tmpPos); if(ep && ep->room > -1) { if(height) *height=ep->center.y; return ep->room; } dist += 5.f; } return -1; }
void ARXDRAW_DrawInterShadows() { ARX_PROFILE_FUNC(); g_shadowBatch.clear(); GRenderer->SetFogColor(Color::none); GRenderer->SetDepthBias(1); for(long i=0; i<TREATZONE_CUR; i++) { if(treatio[i].show != 1 || !treatio[i].io) continue; Entity *io = treatio[i].io; if( !io->obj || (io->ioflags & IO_JUST_COLLIDE) || (io->ioflags & IO_NOSHADOW) || (io->ioflags & IO_GOLD) || !(io->show == SHOW_FLAG_IN_SCENE) ) { continue; } EERIE_BKG_INFO * bkgData = getFastBackgroundData(io->pos.x, io->pos.z); if(bkgData && !bkgData->treat) { //TODO is that correct ? continue; } TexturedVertex ltv[4]; ltv[0] = TexturedVertex(Vec3f(0, 0, 0.001f), 1.f, ColorRGBA(0), Vec2f(0.3f, 0.3f)); ltv[1] = TexturedVertex(Vec3f(0, 0, 0.001f), 1.f, ColorRGBA(0), Vec2f(0.7f, 0.3f)); ltv[2] = TexturedVertex(Vec3f(0, 0, 0.001f), 1.f, ColorRGBA(0), Vec2f(0.7f, 0.7f)); ltv[3] = TexturedVertex(Vec3f(0, 0, 0.001f), 1.f, ColorRGBA(0), Vec2f(0.3f, 0.7f)); if(io->obj->grouplist.size() <= 1) { for(size_t k = 0; k < io->obj->vertexlist.size(); k += 9) { EERIEPOLY *ep = CheckInPoly(io->obj->vertexlist3[k].v); if(!ep) continue; Vec3f in; in.y = ep->min.y - 3.f; float r = 0.5f - ((float)glm::abs(io->obj->vertexlist3[k].v.y - in.y)) * (1.f/500); r -= io->invisibility; r *= io->scale; if(r <= 0.f) continue; float s1 = 16.f * io->scale; float s2 = s1 * (1.f/2); in.x = io->obj->vertexlist3[k].v.x - s2; in.z = io->obj->vertexlist3[k].v.z - s2; r *= 255.f; long lv = r; ltv[0].color = ltv[1].color = ltv[2].color = ltv[3].color = Color(lv, lv, lv, 255).toRGBA(); ltv[0].p = EE_RT(in); in.x += s1; ltv[1].p = EE_RT(in); in.z += s1; ltv[2].p = EE_RT(in); in.x -= s1; ltv[3].p = EE_RT(in); if(ltv[0].p.z > 0.f && ltv[1].p.z > 0.f && ltv[2].p.z > 0.f) { AddToShadowBatch(<v[0], <v[1], <v[2]); AddToShadowBatch(<v[0], <v[2], <v[3]); } } } else { for(size_t k = 0; k < io->obj->grouplist.size(); k++) { long origin = io->obj->grouplist[k].origin; EERIEPOLY *ep = CheckInPoly(io->obj->vertexlist3[origin].v); if(!ep) continue; Vec3f in; in.y = ep->min.y - 3.f; float r = 0.8f - ((float)glm::abs(io->obj->vertexlist3[origin].v.y - in.y)) * (1.f/500); r *= io->obj->grouplist[k].siz; r -= io->invisibility; if(r <= 0.f) continue; float s1 = io->obj->grouplist[k].siz * 44.f; float s2 = s1 * (1.f/2); in.x = io->obj->vertexlist3[origin].v.x - s2; in.z = io->obj->vertexlist3[origin].v.z - s2; r *= 255.f; long lv = r; ltv[0].color = ltv[1].color = ltv[2].color = ltv[3].color = Color(lv, lv, lv, 255).toRGBA(); ltv[0].p = EE_RT(in); in.x += s1; ltv[1].p = EE_RT(in); in.z += s1; ltv[2].p = EE_RT(in); in.x -= s1; ltv[3].p = EE_RT(in); AddToShadowBatch(<v[0], <v[1], <v[2]); AddToShadowBatch(<v[0], <v[2], <v[3]); } } } if(g_shadowBatch.size() > 0) { GRenderer->SetRenderState(Renderer::DepthWrite, false); GRenderer->SetBlendFunc(Renderer::BlendZero, Renderer::BlendInvSrcColor); GRenderer->SetRenderState(Renderer::AlphaBlending, true); GRenderer->SetTexture(0, Boom); EERIEDRAWPRIM(Renderer::TriangleList, &g_shadowBatch[0], g_shadowBatch.size()); GRenderer->SetRenderState(Renderer::AlphaBlending, false); GRenderer->SetRenderState(Renderer::DepthWrite, true); GRenderer->SetDepthBias(0); GRenderer->SetFogColor(ulBKGColor); } }
float GetColorz(const Vec3f &pos) { UpdateLlights(pos, true); Color3f ff = Color3f(0.f, 0.f, 0.f); for(long k = 0; k < MAX_LLIGHTS; k++) { EERIE_LIGHT * el = llights[k]; if(el) { float dd = fdist(el->pos, pos); if(dd < el->fallend) { float dc; if(dd <= el->fallstart) { dc = el->intensity * GLOBAL_LIGHT_FACTOR; } else { float p = ((el->fallend - dd) * el->falldiffmul); if(p <= 0.f) dc = 0.f; else dc = p * el->intensity * GLOBAL_LIGHT_FACTOR; } dc *= 0.4f * 255.f; ff.r = std::max(ff.r, el->rgb.r * dc); ff.g = std::max(ff.g, el->rgb.g * dc); ff.b = std::max(ff.b, el->rgb.b * dc); } } } EERIEPOLY * ep; float needy; ep = CheckInPoly(pos, &needy); if(ep != NULL) { Color3f _ff = Color3f(0.f, 0.f, 0.f); long to = (ep->type & POLY_QUAD) ? 4 : 3; float div = (1.0f / to); EP_DATA & epdata = portals->rooms[ep->room].epdata[0]; ApplyTileLights(ep, epdata.p); for(long i = 0; i < to; i++) { Color col = Color::fromRGBA(ep->tv[i].color); _ff.r += float(col.r); _ff.g += float(col.g); _ff.b += float(col.b); } _ff.r *= div; _ff.g *= div; _ff.b *= div; float ratio, ratio2; ratio = glm::abs(needy - pos.y) * ( 1.0f / 300 ); ratio = (1.f - ratio); ratio2 = 1.f - ratio; ff.r = ff.r * ratio2 + _ff.r * ratio; ff.g = ff.g * ratio2 + _ff.g * ratio; ff.b = ff.b * ratio2 + _ff.b * ratio; } return (std::min(ff.r, 255.f) + std::min(ff.g, 255.f) + std::min(ff.b, 255.f)) * (1.f/3); }
void levelInit() { arx_assert(entities.player()); LogDebug("Initializing level ..."); g_requestLevelInit = true; ARX_PARTICLES_FirstInit(); RenderBatcher::getInstance().reset(); progressBarAdvance(2.f); LoadLevelScreen(); if(!pParticleManager) pParticleManager = new ParticleManager(); if(GMOD_RESET) ARX_GLOBALMODS_Reset(); GMOD_RESET = true; STARTDRAG = Vec2s_ZERO; DANAEMouse = Vec2s_ZERO; if(LOAD_N_ERASE) arxtime.init(); ARX_BOOMS_ClearAllPolyBooms(); ARX_DAMAGES_Reset(); ARX_MISSILES_ClearAll(); spells.clearAll(); ARX_SPELLS_ClearAllSymbolDraw(); ARX_PARTICLES_ClearAll(); if(LOAD_N_ERASE) { CleanScriptLoadedIO(); RestoreInitialIOStatus(); DRAGINTER=NULL; } ARX_SPELLS_ResetRecognition(); eyeball.exist=0; for(size_t i = 0; i < MAX_DYNLIGHTS; i++) { lightHandleGet((LightHandle)i)->exist = 0; } arxtime.update_last_frame_time(); if(LOAD_N_ERASE) { CleanInventory(); ARX_SCRIPT_Timer_ClearAll(); UnlinkAllLinkedObjects(); ARX_SCRIPT_ResetAll(false); } SecondaryInventory=NULL; TSecondaryInventory=NULL; ARX_FOGS_Render(); if(LOAD_N_ERASE) { arxtime.init(); if(!DONT_ERASE_PLAYER) ARX_PLAYER_InitPlayer(); g_hudRoot.playerInterfaceFader.resetSlid(); player.lifePool.current = player.lifePool.max; player.manaPool.current = player.manaPool.max; if(!DONT_ERASE_PLAYER) { ARX_PLAYER_MakeFreshHero(); } } InitSnapShot(fs::paths.user / "snapshot"); if(FASTmse) { FASTmse = 0; if(LOADEDD) { Vec3f trans = Mscenepos; player.pos = loddpos + trans; } else { player.pos.y += player.baseHeight(); } progressBarAdvance(4.f); LoadLevelScreen(); } #if BUILD_EDIT_LOADSAVE else if(mse) { Mscenepos.x=-mse->cub.xmin-(mse->cub.xmax-mse->cub.xmin)*.5f+((float)ACTIVEBKG->Xsize*(float)ACTIVEBKG->Xdiv)*.5f; Mscenepos.z=-mse->cub.zmin-(mse->cub.zmax-mse->cub.zmin)*.5f+((float)ACTIVEBKG->Zsize*(float)ACTIVEBKG->Zdiv)*.5f; float t1=(float)(long)(mse->point0.x/BKG_SIZX); float t2=(float)(long)(mse->point0.z/BKG_SIZZ); t1=mse->point0.x-t1*BKG_SIZX; t2=mse->point0.z-t2*BKG_SIZZ; Mscenepos.x=(float)((long)(Mscenepos.x/BKG_SIZX))*BKG_SIZX+(float)BKG_SIZX*.5f; Mscenepos.z=(float)((long)(Mscenepos.z/BKG_SIZZ))*BKG_SIZZ+(float)BKG_SIZZ*.5f; mse->pos.x=Mscenepos.x=Mscenepos.x+BKG_SIZX-t1; mse->pos.z=Mscenepos.z=Mscenepos.z+BKG_SIZZ-t2; Mscenepos.y=mse->pos.y=-mse->cub.ymin-100.f-mse->point0.y; if (PLAYER_POSITION_RESET) { player.pos.x = mse->pos.x+mse->point0.x; player.pos.z = mse->pos.z+mse->point0.z; player.pos.y = mse->pos.y+mse->point0.y; } EERIERemovePrecalcLights(); progressBarAdvance(); LoadLevelScreen(); SceneAddMultiScnToBackground(mse); progressBarAdvance(2.f); LoadLevelScreen(); Vec3f trans = mse->pos; ReleaseMultiScene(mse); mse=NULL; if(PLAYER_POSITION_RESET) { if(LOADEDD) { player.pos = loddpos + trans; } else { player.pos.y += player.baseHeight(); } } PLAYER_POSITION_RESET = true; progressBarAdvance(); LoadLevelScreen(); } #endif // BUILD_EDIT_LOADSAVE else { progressBarAdvance(4.f); LoadLevelScreen(); } if(player.torch) { ARX_SOUND_PlaySFX(SND_TORCH_LOOP, NULL, 1.0F, ARX_SOUND_PLAY_LOOPED); } MagicFlareSetCamera(&subj); lastteleport = player.basePosition(); subj.orgTrans.pos = g_moveto = player.pos; subj.angle = player.angle; RestoreLastLoadedLightning(*ACTIVEBKG); progressBarAdvance(); LoadLevelScreen(); if(LOAD_N_ERASE) SetEditMode(0); progressBarAdvance(); LoadLevelScreen(); LOAD_N_ERASE = true; DONT_ERASE_PLAYER=0; progressBarAdvance(); LoadLevelScreen(); g_requestLevelInit = false; PrepareIOTreatZone(1); CURRENTLEVEL=GetLevelNumByName(LastLoadedScene.string()); if(TIME_INIT) arxtime.init(); arxtime.update_last_frame_time(); progressBarAdvance(); LoadLevelScreen(); if(DONT_WANT_PLAYER_INZONE) { player.inzone = NULL; DONT_WANT_PLAYER_INZONE = 0; } progressBarAdvance(); LoadLevelScreen(); player.desiredangle.setYaw(0.f); player.angle.setYaw(0.f); ARX_PLAYER_RectifyPosition(); entities.player()->_npcdata->vvpos = -99999; SendGameReadyMsg(); PLAYER_MOUSELOOK_ON = false; player.Interface &= ~INTER_NOTE; if(!TIME_INIT) { arxtime.force_time_restore(FORCE_TIME_RESTORE); arxtime.force_frame_time_restore(FORCE_TIME_RESTORE); } else { arxtime.resume(); } EntityHandle t = entities.getById("seat_stool1_0012"); if(ValidIONum(t)) { entities[t]->ioflags |= IO_FORCEDRAW; } if(WILL_RESTORE_PLAYER_POSITION_FLAG) { Entity * io = entities.player(); player.pos = WILL_RESTORE_PLAYER_POSITION; io->pos = player.basePosition(); for(size_t i = 0; i < io->obj->vertexlist.size(); i++) { io->obj->vertexlist3[i].v = io->obj->vertexlist[i].v + io->pos; } WILL_RESTORE_PLAYER_POSITION_FLAG = 0; } ARX_NPC_RestoreCuts(); ResetVVPos(entities.player()); progressBarAdvance(); LoadLevelScreen(); LoadLevelScreen(-2); if ( (!CheckInPoly(player.pos)) && (LastValidPlayerPos.x!=0.f) && (LastValidPlayerPos.y!=0.f) && (LastValidPlayerPos.z!=0.f)) { player.pos = LastValidPlayerPos; } LastValidPlayerPos = player.pos; }
float GetColorz(const Vec3f & pos) { ShaderLight lights[llightsSize]; size_t lightsCount; UpdateLlights(lights, lightsCount, pos, true); Color3f ff = Color3f(0.f, 0.f, 0.f); for(size_t k = 0; k < lightsCount; k++) { const ShaderLight & light = lights[k]; float dd = fdist(light.pos, pos); if(dd < light.fallend) { float dc; if(dd <= light.fallstart) { dc = light.intensity * GLOBAL_LIGHT_FACTOR; } else { float p = ((light.fallend - dd) * light.falldiffmul); if(p <= 0.f) dc = 0.f; else dc = p * light.intensity * GLOBAL_LIGHT_FACTOR; } dc *= 0.4f * 255.f; ff.r = std::max(ff.r, light.rgb.r * dc); ff.g = std::max(ff.g, light.rgb.g * dc); ff.b = std::max(ff.b, light.rgb.b * dc); } } EERIEPOLY * ep; float needy; ep = CheckInPoly(pos, &needy); if(ep != NULL) { Color3f _ff = Color3f(0.f, 0.f, 0.f); long to = (ep->type & POLY_QUAD) ? 4 : 3; float div = (1.0f / to); EP_DATA & epdata = portals->rooms[ep->room].epdata[0]; ApplyTileLights(ep, epdata.tile); for(long i = 0; i < to; i++) { Color col = Color::fromRGBA(ep->color[i]); _ff.r += float(col.r); _ff.g += float(col.g); _ff.b += float(col.b); } _ff.r *= div; _ff.g *= div; _ff.b *= div; float ratio, ratio2; ratio = glm::abs(needy - pos.y) * (1.0f / 300); ratio = (1.f - ratio); ratio2 = 1.f - ratio; ff.r = ff.r * ratio2 + _ff.r * ratio; ff.g = ff.g * ratio2 + _ff.g * ratio; ff.b = ff.b * ratio2 + _ff.b * ratio; } return (std::min(ff.r, 255.f) + std::min(ff.g, 255.f) + std::min(ff.b, 255.f)) * (1.f / 3); }
void ShowInfoText() { DebugBox frameInfo = DebugBox(Vec2i(10, 10), "FrameInfo"); frameInfo.add("Platform time", prettyUs(toUs(g_platformTime.frameStart()))); frameInfo.add("Game time", prettyUs(toUs(g_gameTime.now()))); frameInfo.add("Prims", EERIEDrawnPolys); frameInfo.add("Particles", getParticleCount()); frameInfo.add("Sparks", ParticleSparkCount()); frameInfo.add("Polybooms", long(PolyBoomCount())); frameInfo.print(); DebugBox camBox = DebugBox(Vec2i(10, frameInfo.size().y + 5), "Camera"); camBox.add("Position", g_camera->m_pos); camBox.add("Rotation", g_camera->angle); camBox.add("Focal", g_camera->focal); camBox.print(); DebugBox playerBox = DebugBox(Vec2i(10, camBox.size().y + 5), "Player"); playerBox.add("Position", player.pos); playerBox.add("Rotation", player.angle); playerBox.add("Velocity", player.physics.velocity); EERIEPOLY * ep = CheckInPoly(player.pos); float truePolyY = -666.66f; if(ep) { float tempY = 0.f; if(GetTruePolyY(ep, player.pos, &tempY)) { truePolyY = tempY; } } ep = CheckInPoly(player.pos + Vec3f(0.f, -10.f, 0.f)); float slope = 0.f; if(ep) slope = ep->norm.y; long zap = IsAnyPolyThere(player.pos.x, player.pos.z); playerBox.add("Ground Slope", slope); playerBox.add("Ground truePolyY", truePolyY); playerBox.add("Ground POLY", zap); playerBox.add("Color", CURRENT_PLAYER_COLOR); playerBox.add("Stealth", GetPlayerStealth()); playerBox.add("Jump", player.jumplastposition); playerBox.add("OFFGRND", (!player.onfirmground ? "OFFGRND" : "")); playerBox.add("Life", player.lifePool); playerBox.add("Mana", player.manaPool); playerBox.add("Poisoned", player.poison); playerBox.add("Hunger", player.hunger); playerBox.add("Magic", static_cast<long>(player.doingmagic)); playerBox.print(); DebugBox miscBox = DebugBox(Vec2i(10, playerBox.size().y + 5), "Misc"); miscBox.add(arx_name + " version", arx_version); miscBox.add("Level", LastLoadedScene.string()); miscBox.add("Spell failed seq", LAST_FAILED_SEQUENCE); miscBox.add("Cinema", cinematicBorder.CINEMA_DECAL); miscBox.add("Mouse", Vec2i(DANAEMouse)); miscBox.add("Pathfind queue", EERIE_PATHFINDER_Get_Queued_Number()); miscBox.add("Pathfind status", EERIE_PATHFINDER_Is_Busy() ? "Working" : "Idled"); miscBox.print(); { struct ScriptDebugReport { std::string entityName; long events; long sends; ScriptDebugReport() : entityName("") , events(0) , sends(0) {} }; ScriptDebugReport maxEvents; Entity * io = ARX_SCRIPT_Get_IO_Max_Events(); if(io) { maxEvents.entityName = io->idString(); maxEvents.events = io->stat_count; } ScriptDebugReport maxSender; io = ARX_SCRIPT_Get_IO_Max_Events_Sent(); if(io) { maxSender.entityName = io->idString(); maxSender.sends = io->stat_sent; } DebugBox scriptBox = DebugBox(Vec2i(10, miscBox.size().y + 5), "Script"); scriptBox.add("Events", ScriptEvent::totalCount); scriptBox.add("Timers", ARX_SCRIPT_CountTimers()); scriptBox.add("Max events", maxEvents.entityName); scriptBox.add("Max events#", maxEvents.events); scriptBox.add("Max sender", maxSender.entityName); scriptBox.add("Max sender#", maxSender.sends); scriptBox.print(); } Entity * io = entities.get(LastSelectedIONum); if(io) { DebugBox entityBox = DebugBox(Vec2i(500, 10), "Entity " + io->idString()); entityBox.add("Pos", io->pos); entityBox.add("Angle", io->angle); entityBox.add("Room", static_cast<long>(io->room)); entityBox.add("Move", io->move); entityBox.add("Flags", flagNames(EntityFlagNames, io->ioflags)); entityBox.add("GFlags", flagNames(GameFlagNames, io->gameFlags)); entityBox.add("Show", entityVisilibityToString(io->show)); entityBox.print(); if(io->ioflags & IO_NPC) { IO_NPCDATA * npcData = io->_npcdata; DebugBox npcBox = DebugBox(Vec2i(500, entityBox.size().y + 5), "NPC"); npcBox.add("Life", npcData->lifePool); npcBox.add("Mana", npcData->manaPool); npcBox.add("Poisoned", npcData->poisonned); npcBox.add("ArmorClass", ARX_INTERACTIVE_GetArmorClass(io)); npcBox.add("Absorb", npcData->absorb); npcBox.add("Moveproblem", npcData->moveproblem); npcBox.add("Pathfind listpos", static_cast<long>(npcData->pathfind.listpos)); npcBox.add("Pathfind listnb", npcData->pathfind.listnb); npcBox.add("Pathfind targ", npcData->pathfind.truetarget.handleData()); npcBox.add("Behavior", flagNames(BehaviourFlagNames, npcData->behavior)); // TODO should those really be flags ? PathfindFlags pflag = io->_npcdata->pathfind.flags; std::string pflags; if(pflag & PATHFIND_ALWAYS) pflags += "ALWAYS "; if(pflag & PATHFIND_ONCE) pflags += "ONCE "; if(pflag & PATHFIND_NO_UPDATE) pflags += "NO_UPDATE "; npcBox.add("Pathfind flgs", pflags); npcBox.print(); } if(io->ioflags & (IO_FIX | IO_ITEM)) { DebugBox itemBox = DebugBox(Vec2i(500, entityBox.size().y + 5), "Item"); itemBox.add("Durability", io->durability); itemBox.add("Durability max", io->max_durability); itemBox.add("Poisonous", static_cast<long>(io->poisonous)); itemBox.add("Poisonous count", static_cast<long>(io->poisonous_count)); itemBox.print(); } long column2y = 400; for(size_t i = 0; i < MAX_ANIM_LAYERS; i++) { AnimLayer & layer = io->animlayer[i]; DebugBox animLayerBox = DebugBox(Vec2i(500, column2y), str(boost::format("Anim Layer %1%") % i)); animLayerBox.add("ctime", long(layer.ctime.t)); animLayerBox.add("flags", flagNames(AnimUseFlagNames, layer.flags)); animLayerBox.add("currentFrame", layer.currentFrame); if(layer.cur_anim) { animLayerBox.add("cur_anim", layer.cur_anim->path.string()); } else { animLayerBox.add("cur_anim", "none"); } animLayerBox.print(); column2y = animLayerBox.size().y + 5; } } ARX_SCRIPT_Init_Event_Stats(); }
static long ARX_PORTALS_GetRoomNumForPosition2(const Vec3f & pos, long flag, float * height) { EERIEPOLY * ep; if(flag & 1) { ep=CheckInPoly(pos + Vec3f(0.f, -150.f, 0.f)); if (!ep) ep=CheckInPoly(pos + Vec3f(0.f, -1.f, 0.f)); } else { ep=CheckInPoly(pos); } if(ep && ep->room>-1) { if(height) *height=ep->center.y; return ep->room; } // Security... ? ep = GetMinPoly(pos); if(ep && ep->room > -1) { if(height) *height=ep->center.y; return ep->room; } else if( !(flag & 1) ) { ep=CheckInPoly(pos); if(ep && ep->room > -1) { if(height) *height=ep->center.y; return ep->room; } } if(flag & 2) { float off=20.f; ep=CheckInPoly(pos + Vec3f(-off, -off, 0.f)); if(ep && ep->room > -1) { if(height) *height=ep->center.y; return ep->room; } ep=CheckInPoly(pos + Vec3f(-off, -20, -off)); if(ep && ep->room > -1) { if(height) *height=ep->center.y; return ep->room; } ep=CheckInPoly(pos + Vec3f(-off, -20, off)); if(ep && ep->room > -1) { if(height) *height=ep->center.y; return ep->room; } ep=CheckInPoly(pos + Vec3f(off, -20, 0.f)); if(ep && ep->room>-1) { if(height) *height=ep->center.y; return ep->room; } ep=CheckInPoly(pos + Vec3f(off, -20, off)); if(ep && ep->room > -1) { if(height) *height=ep->center.y; return ep->room; } ep=CheckInPoly(pos + Vec3f(off, -20, -off)); if(ep && ep->room > -1) { if(height) *height=ep->center.y; return ep->room; } } return -1; }
//----------------------------------------------------------------------------- // Updates all currently launched projectiles void ARX_MISSILES_Update() { ARX_PROFILE_FUNC(); TextureContainer * tc = TC_fire; unsigned long tim = (unsigned long)(arxtime); for(unsigned long i(0); i < MAX_MISSILES; i++) { if(missiles[i].type == MISSILE_NONE) continue; long framediff = missiles[i].timecreation + missiles[i].tolive - tim; if(framediff < 0) { ARX_MISSILES_Kill(i); continue; } long framediff3 = tim - missiles[i].timecreation; switch(missiles[i].type) { case MISSILE_NONE: break; case MISSILE_FIREBALL: { Vec3f pos; pos = missiles[i].startpos + missiles[i].velocity * Vec3f(framediff3); if(lightHandleIsValid(missiles[i].longinfo)) { EERIE_LIGHT * light = lightHandleGet(missiles[i].longinfo); light->pos = pos; } Vec3f orgn = missiles[i].lastpos; Vec3f dest = pos; Vec3f tro = Vec3f(70.f); EERIEPOLY *ep = GetMinPoly(dest); EERIEPOLY *epp = GetMaxPoly(dest); if(closerThan(player.pos, pos, 200.f)) { ARX_MISSILES_Kill(i); ARX_BOOMS_Add(pos); Add3DBoom(pos); DoSphericDamage(Sphere(dest, 200.0F), 180.0F, DAMAGE_AREAHALF, DAMAGE_TYPE_FIRE | DAMAGE_TYPE_MAGICAL); break; } if(ep && ep->center.y < dest.y) { ARX_MISSILES_Kill(i); ARX_BOOMS_Add(dest); Add3DBoom(dest); DoSphericDamage(Sphere(dest, 200.0F), 180.0F, DAMAGE_AREAHALF, DAMAGE_TYPE_FIRE | DAMAGE_TYPE_MAGICAL); break; } if(epp && epp->center.y > dest.y) { ARX_MISSILES_Kill(i); ARX_BOOMS_Add(dest); Add3DBoom(dest); DoSphericDamage(Sphere(dest, 200.0F), 180.0F, DAMAGE_AREAHALF, DAMAGE_TYPE_FIRE | DAMAGE_TYPE_MAGICAL); break; } Vec3f hit; if(EERIELaunchRay3(orgn, dest, hit, 1)) { ARX_MISSILES_Kill(i); ARX_BOOMS_Add(hit); Add3DBoom(hit); DoSphericDamage(Sphere(dest, 200.0F), 180.0F, DAMAGE_AREAHALF, DAMAGE_TYPE_FIRE | DAMAGE_TYPE_MAGICAL); break; } if(!CheckInPoly(dest) || EEIsUnderWater(dest)) { ARX_MISSILES_Kill(i); ARX_BOOMS_Add(dest); Add3DBoom(dest); DoSphericDamage(Sphere(dest, 200.0F), 180.0F, DAMAGE_AREAHALF, DAMAGE_TYPE_FIRE | DAMAGE_TYPE_MAGICAL); break; } long ici = IsCollidingAnyInter(dest, tro); if(ici != -1 && ici != missiles[i].owner) { ARX_MISSILES_Kill(i); ARX_BOOMS_Add(dest); Add3DBoom(dest); DoSphericDamage(Sphere(dest, 200.0F), 180.0F, DAMAGE_AREAHALF, DAMAGE_TYPE_FIRE | DAMAGE_TYPE_MAGICAL); break; } PARTICLE_DEF * pd = createParticle(); if(pd) { pd->ov = pos; pd->move = missiles[i].velocity; pd->move += Vec3f(3.f, 4.f, 3.f) + Vec3f(-6.f, -12.f, -6.f) * randomVec3f(); pd->tolive = Random::get(500, 1000); pd->tc = tc; pd->siz = 12.f * float(missiles[i].tolive - framediff3) * (1.f / 4000); pd->scale = randomVec(15.f, 20.f); pd->special = FIRE_TO_SMOKE; } missiles[i].lastpos = pos; break; } } missiles[i].lastupdate = tim; } }
void levelInit() { arx_assert(entities.player()); LogDebug("Initializing level ..."); ARX_PARTICLES_FirstInit(); g_renderBatcher.reset(); progressBarAdvance(2.f); LoadLevelScreen(); g_particleManager.Clear(); if(GMOD_RESET) ARX_GLOBALMODS_Reset(); GMOD_RESET = true; STARTDRAG = Vec2s(0); DANAEMouse = Vec2s(0); PolyBoomClear(); ARX_DAMAGES_Reset(); ARX_MISSILES_ClearAll(); spells.clearAll(); ARX_SPELLS_ClearAllSymbolDraw(); ARX_PARTICLES_ClearAll(); ParticleSparkClear(); if(LOAD_N_ERASE) { CleanScriptLoadedIO(); RestoreInitialIOStatus(); DRAGINTER = NULL; } ARX_SPELLS_ResetRecognition(); eyeball.exist = 0; resetDynLights(); if(LOAD_N_ERASE) { CleanInventory(); ARX_SCRIPT_Timer_ClearAll(); UnlinkAllLinkedObjects(); ARX_SCRIPT_ResetAll(false); } SecondaryInventory = NULL; TSecondaryInventory = NULL; ARX_FOGS_Render(); if(LOAD_N_ERASE) { if(!DONT_ERASE_PLAYER) ARX_PLAYER_InitPlayer(); g_hudRoot.playerInterfaceFader.resetSlid(); player.lifePool.current = player.lifePool.max; player.manaPool.current = player.manaPool.max; if(!DONT_ERASE_PLAYER) { ARX_PLAYER_MakeFreshHero(); } } InitSnapShot(fs::getUserDir() / "snapshot"); progressBarAdvance(4.f); LoadLevelScreen(); if(player.torch) { player.torch_loop = ARX_SOUND_PlaySFX_loop(g_snd.TORCH_LOOP, NULL, 1.0F); } g_playerCamera.m_pos = g_moveto = player.pos; g_playerCamera.angle = player.angle; RestoreLastLoadedLightning(*ACTIVEBKG); progressBarAdvance(); LoadLevelScreen(); if(LOAD_N_ERASE) { SetEditMode(); ARX_SOUND_MixerStop(ARX_SOUND_MixerGame); ARX_SCRIPT_ResetAll(true); EERIE_ANIMMANAGER_PurgeUnused(); } progressBarAdvance(); LoadLevelScreen(); LOAD_N_ERASE = true; DONT_ERASE_PLAYER = false; progressBarAdvance(); LoadLevelScreen(); PrepareIOTreatZone(1); progressBarAdvance(); LoadLevelScreen(); if(DONT_WANT_PLAYER_INZONE) { player.inzone = NULL; DONT_WANT_PLAYER_INZONE = 0; } progressBarAdvance(); LoadLevelScreen(); player.desiredangle.setPitch(0.f); player.angle.setPitch(0.f); ARX_PLAYER_RectifyPosition(); entities.player()->_npcdata->vvpos = -99999; SendMsgToAllIO(NULL, SM_GAME_READY); PLAYER_MOUSELOOK_ON = false; g_note.clear(); EntityHandle t = entities.getById("seat_stool1_0012"); if(ValidIONum(t)) { entities[t]->ioflags |= IO_FORCEDRAW; } ARX_NPC_RestoreCuts(); ResetVVPos(entities.player()); progressBarAdvance(); LoadLevelScreen(); LoadLevelScreen(-2); if(!CheckInPoly(player.pos) && LastValidPlayerPos.x != 0.f && LastValidPlayerPos.y != 0.f && LastValidPlayerPos.z != 0.f) { player.pos = LastValidPlayerPos; } LastValidPlayerPos = player.pos; g_platformTime.updateFrame(); g_gameTime.resume(GameTime::PauseInitial | GameTime::PauseMenu); }
void ShowInfoText() { DebugBox frameInfo = DebugBox(Vec2i(10, 10), "FrameInfo"); frameInfo.add("Prims", EERIEDrawnPolys); frameInfo.add("Particles", getParticleCount()); frameInfo.add("Polybooms", long(polyboom.size())); frameInfo.add("TIME", static_cast<long>(arxtime.now_ul() / 1000)); frameInfo.print(); DebugBox playerBox = DebugBox(Vec2i(10, frameInfo.size().y + 5), "Player"); playerBox.add("Position", player.pos); playerBox.add("AnchorPos", player.pos - Mscenepos); playerBox.add("Rotation", player.angle); playerBox.add("Velocity", player.physics.velocity); EERIEPOLY * ep = CheckInPoly(player.pos); float truePolyY = -666.66f; if(ep) { float tempY = 0.f; if(GetTruePolyY(ep, player.pos, &tempY)) { truePolyY = tempY; } } ep = CheckInPoly(player.pos + Vec3f(0.f, -10.f, 0.f)); float slope = 0.f; if(ep) slope = ep->norm.y; long zap = IsAnyPolyThere(player.pos.x,player.pos.z); playerBox.add("Ground Slope", slope); playerBox.add("Ground truePolyY", truePolyY); playerBox.add("Ground POLY", zap); playerBox.add("Color", CURRENT_PLAYER_COLOR); playerBox.add("Stealth", GetPlayerStealth()); playerBox.add("Jump", player.jumplastposition); playerBox.add("OFFGRND", (!player.onfirmground ? "OFFGRND" : "")); playerBox.add("Life", player.lifePool); playerBox.add("Mana", player.manaPool); playerBox.add("Poisoned", player.poison); playerBox.add("Hunger", player.hunger); playerBox.add("Magic", static_cast<long>(player.doingmagic)); playerBox.print(); DebugBox miscBox = DebugBox(Vec2i(10, playerBox.size().y + 5), "Misc"); miscBox.add("Arx version", arx_version); miscBox.add("Level", LastLoadedScene.string().c_str()); miscBox.add("Spell failed seq", LAST_FAILED_SEQUENCE.c_str()); miscBox.add("Camera focal", ACTIVECAM->focal); miscBox.add("Cinema", CINEMA_DECAL); miscBox.add("Mouse", Vec2i(DANAEMouse)); miscBox.add("Pathfind queue", EERIE_PATHFINDER_Get_Queued_Number()); miscBox.add("Pathfind status", (PATHFINDER_WORKING ? "Working" : "Idled")); miscBox.print(); { struct ScriptDebugReport { std::string entityName; long events; long sends; ScriptDebugReport() : entityName("") , events(0) , sends(0) {} }; ScriptDebugReport maxEvents; Entity * io = ARX_SCRIPT_Get_IO_Max_Events(); if(io) { maxEvents.entityName = io->idString(); maxEvents.events = io->stat_count; } ScriptDebugReport maxSender; io = ARX_SCRIPT_Get_IO_Max_Events_Sent(); if(io) { maxSender.entityName = io->idString(); maxSender.sends = io->stat_sent; } DebugBox scriptBox = DebugBox(Vec2i(10, miscBox.size().y + 5), "Script"); scriptBox.add("Events", ScriptEvent::totalCount); scriptBox.add("Timers", ARX_SCRIPT_CountTimers()); scriptBox.add("Max events", maxEvents.entityName); scriptBox.add("Max events#", maxEvents.events); scriptBox.add("Max sender", maxSender.entityName); scriptBox.add("Max sender#", maxSender.sends); scriptBox.print(); } if(ValidIONum(LastSelectedIONum)) { Entity * io = entities[LastSelectedIONum]; if(io) { DebugBox entityBox = DebugBox(Vec2i(500, 10), "Entity " + io->idString()); entityBox.add("Pos", io->pos); entityBox.add("Angle", io->angle); entityBox.add("Room", static_cast<long>(io->room)); entityBox.add("Move", io->move); entityBox.add("Flags", flagNames(EntityFlagNames, io->ioflags)); entityBox.add("Show", entityVisilibityToString(io->show)); entityBox.print(); if(io->ioflags & IO_NPC) { IO_NPCDATA * npcData = io->_npcdata; DebugBox npcBox = DebugBox(Vec2i(500, entityBox.size().y + 5), "NPC"); npcBox.add("Life", npcData->lifePool); npcBox.add("Mana", npcData->manaPool); npcBox.add("Poisoned", npcData->poisonned); npcBox.add("ArmorClass", ARX_INTERACTIVE_GetArmorClass(io)); npcBox.add("Absorb", npcData->absorb); npcBox.add("Moveproblem", npcData->moveproblem); npcBox.add("Pathfind listpos", static_cast<long>(npcData->pathfind.listpos)); npcBox.add("Pathfind listnb", npcData->pathfind.listnb); npcBox.add("Pathfind targ", npcData->pathfind.truetarget.handleData()); npcBox.add("Behavior", flagNames(BehaviourFlagNames, npcData->behavior)); // TODO should those really be flags ? PathfindFlags pflag = io->_npcdata->pathfind.flags; std::string pflags; if(pflag & PATHFIND_ALWAYS) pflags += "ALWAYS "; if(pflag & PATHFIND_ONCE) pflags += "ONCE "; if(pflag & PATHFIND_NO_UPDATE) pflags += "NO_UPDATE "; npcBox.add("Pathfind flgs", pflags); npcBox.print(); } if(io->ioflags & (IO_FIX | IO_ITEM)) { DebugBox itemBox = DebugBox(Vec2i(500, entityBox.size().y + 5), "Item"); itemBox.add("Durability", io->durability); itemBox.add("Durability max", io->max_durability); itemBox.add("Poisonous", static_cast<long>(io->poisonous)); itemBox.add("Poisonous count", static_cast<long>(io->poisonous_count)); itemBox.print(); } } } ARX_SCRIPT_Init_Event_Stats(); }