static bool ANCHOR_AttemptValidCylinderPos(Cylinder & cyl, Entity * io, CollisionFlags flags) { float anything = ANCHOR_CheckAnythingInCylinder(cyl, flags); if ((flags & CFLAG_LEVITATE) && (anything == 0.f)) return true; if (anything >= 0.f) // Falling Cylinder but valid pos ! { if (flags & CFLAG_RETURN_HEIGHT) cyl.origin.y += anything; return true; } Cylinder tmp; if(!(flags & CFLAG_ANCHOR_GENERATION)) { tmp = cyl; while(anything < 0.f) { tmp.origin.y += anything; anything = ANCHOR_CheckAnythingInCylinder(tmp, flags); } anything = tmp.origin.y - cyl.origin.y; } if(MOVING_CYLINDER) { if(flags & CFLAG_NPC) { float tolerate; if(io && (io->ioflags & IO_NPC) && (io->_npcdata->pathfind.listnb > 0) && (io->_npcdata->pathfind.listpos < io->_npcdata->pathfind.listnb) ) { tolerate = -80; } else { tolerate = -45; } if(anything < tolerate) return false; } if(io && !(flags & CFLAG_JUST_TEST)) { if((flags & CFLAG_PLAYER) && anything < 0.f) { if(player.jumpphase != NotJumping) { io->_npcdata->climb_count = MAX_ALLOWED_PER_SECOND; return false; } float dist = std::max(glm::length(vector2D), 1.f); float pente; pente = glm::abs(anything) / dist * ( 1.0f / 2 ); io->_npcdata->climb_count += pente; if(io->_npcdata->climb_count > MAX_ALLOWED_PER_SECOND) { io->_npcdata->climb_count = MAX_ALLOWED_PER_SECOND; return false; } if(anything < -55) { io->_npcdata->climb_count = MAX_ALLOWED_PER_SECOND; return false; } } } } else if(anything < -45) { return false; } if((flags & CFLAG_SPECIAL) && anything < -40) { if(flags & CFLAG_RETURN_HEIGHT) cyl.origin.y += anything; return false; } tmp = cyl; tmp.origin.y += anything; anything = ANCHOR_CheckAnythingInCylinder(tmp, flags); if(anything < 0.f) { if(flags & CFLAG_RETURN_HEIGHT) { while(anything < 0.f) { tmp.origin.y += anything; anything = ANCHOR_CheckAnythingInCylinder(tmp, flags); } cyl.origin.y = tmp.origin.y; } return false; } cyl.origin.y = tmp.origin.y; return true; }
BOOL ANCHOR_AttemptValidCylinderPos(EERIE_CYLINDER * cyl, INTERACTIVE_OBJ * io, long flags) { float anything = ANCHOR_CheckAnythingInCylinder(cyl, io, flags); if ((flags & CFLAG_LEVITATE) && (anything == 0.f)) return TRUE; if (anything >= 0.f) // Falling Cylinder but valid pos ! { if (flags & CFLAG_RETURN_HEIGHT) cyl->origin.y += anything; return TRUE; } EERIE_CYLINDER tmp; if (!(flags & CFLAG_ANCHOR_GENERATION)) { memcpy(&tmp, cyl, sizeof(EERIE_CYLINDER)); while (anything < 0.f) { tmp.origin.y += anything; anything = ANCHOR_CheckAnythingInCylinder(&tmp, io, flags); } anything = tmp.origin.y - cyl->origin.y; } if (MOVING_CYLINDER) { if (flags & CFLAG_NPC) { float tolerate; if ((io) && (io->ioflags & IO_NPC) && (io->_npcdata->pathfind.listnb > 0) && (io->_npcdata->pathfind.listpos < io->_npcdata->pathfind.listnb)) { tolerate = -80; } else tolerate = -45; if (anything < tolerate) return FALSE; } if (io && (!(flags & CFLAG_JUST_TEST))) { if ((flags & CFLAG_PLAYER) && (anything < 0.f)) { if (player.jumpphase) { io->_npcdata->climb_count = MAX_ALLOWED_PER_SECOND; return FALSE; } float dist; dist = __max(TRUEVector_Magnitude(&vector2D), 1.f); float pente; pente = EEfabs(anything) / dist * DIV2; io->_npcdata->climb_count += pente; if (io->_npcdata->climb_count > MAX_ALLOWED_PER_SECOND) { io->_npcdata->climb_count = MAX_ALLOWED_PER_SECOND; return FALSE; } if (anything < -55) { io->_npcdata->climb_count = MAX_ALLOWED_PER_SECOND; return FALSE; } } } } else if (anything < -45) return FALSE; if ((flags & CFLAG_SPECIAL) && (anything < -40)) { if (flags & CFLAG_RETURN_HEIGHT) cyl->origin.y += anything; return FALSE; } memcpy(&tmp, cyl, sizeof(EERIE_CYLINDER)); tmp.origin.y += anything; anything = ANCHOR_CheckAnythingInCylinder(&tmp, io, flags); if (anything < 0.f) { if (flags & CFLAG_RETURN_HEIGHT) { while (anything < 0.f) { tmp.origin.y += anything; anything = ANCHOR_CheckAnythingInCylinder(&tmp, io, flags); } cyl->origin.y = tmp.origin.y; } return FALSE; } cyl->origin.y = tmp.origin.y; return TRUE; }