📄 be_aas_route.c
字号:
return tfl;
} //end of the function AAS_GetAreaContentsTravelFlags
//===========================================================================
//
// Parameter: -
// Returns: -
// Changes Globals: -
//===========================================================================
__inline int AAS_AreaContentsTravelFlags_inline(int areanum)
{
return aasworld.areacontentstravelflags[areanum];
} //end of the function AAS_AreaContentsTravelFlags
//===========================================================================
//
// Parameter: -
// Returns: -
// Changes Globals: -
//===========================================================================
int AAS_AreaContentsTravelFlags(int areanum)
{
return aasworld.areacontentstravelflags[areanum];
} //end of the function AAS_AreaContentsTravelFlags
//===========================================================================
//
// Parameter: -
// Returns: -
// Changes Globals: -
//===========================================================================
void AAS_InitAreaContentsTravelFlags(void)
{
int i;
if (aasworld.areacontentstravelflags) FreeMemory(aasworld.areacontentstravelflags);
aasworld.areacontentstravelflags = (int *) GetClearedMemory(aasworld.numareas * sizeof(int));
//
for (i = 0; i < aasworld.numareas; i++) {
aasworld.areacontentstravelflags[i] = AAS_GetAreaContentsTravelFlags(i);
}
} //end of the function AAS_InitAreaContentsTravelFlags
//===========================================================================
//
// Parameter: -
// Returns: -
// Changes Globals: -
//===========================================================================
void AAS_CreateReversedReachability(void)
{
int i, n;
aas_reversedlink_t *revlink;
aas_reachability_t *reach;
aas_areasettings_t *settings;
char *ptr;
#ifdef DEBUG
int starttime;
starttime = Sys_MilliSeconds();
#endif
//free reversed links that have already been created
if (aasworld.reversedreachability) FreeMemory(aasworld.reversedreachability);
//allocate memory for the reversed reachability links
ptr = (char *) GetClearedMemory(aasworld.numareas * sizeof(aas_reversedreachability_t) +
aasworld.reachabilitysize * sizeof(aas_reversedlink_t));
//
aasworld.reversedreachability = (aas_reversedreachability_t *) ptr;
//pointer to the memory for the reversed links
ptr += aasworld.numareas * sizeof(aas_reversedreachability_t);
//check all reachabilities of all areas
for (i = 1; i < aasworld.numareas; i++)
{
//settings of the area
settings = &aasworld.areasettings[i];
//
if (settings->numreachableareas >= 128)
botimport.Print(PRT_WARNING, "area %d has more than 128 reachabilities\n", i);
//create reversed links for the reachabilities
for (n = 0; n < settings->numreachableareas && n < 128; n++)
{
//reachability link
reach = &aasworld.reachability[settings->firstreachablearea + n];
//
revlink = (aas_reversedlink_t *) ptr;
ptr += sizeof(aas_reversedlink_t);
//
revlink->areanum = i;
revlink->linknum = settings->firstreachablearea + n;
revlink->next = aasworld.reversedreachability[reach->areanum].first;
aasworld.reversedreachability[reach->areanum].first = revlink;
aasworld.reversedreachability[reach->areanum].numlinks++;
} //end for
} //end for
#ifdef DEBUG
botimport.Print(PRT_MESSAGE, "reversed reachability %d msec\n", Sys_MilliSeconds() - starttime);
#endif
} //end of the function AAS_CreateReversedReachability
//===========================================================================
//
// Parameter: -
// Returns: -
// Changes Globals: -
//===========================================================================
unsigned short int AAS_AreaTravelTime(int areanum, vec3_t start, vec3_t end)
{
int intdist;
float dist;
vec3_t dir;
VectorSubtract(start, end, dir);
dist = VectorLength(dir);
//if crouch only area
if (AAS_AreaCrouch(areanum)) dist *= DISTANCEFACTOR_CROUCH;
//if swim area
else if (AAS_AreaSwim(areanum)) dist *= DISTANCEFACTOR_SWIM;
//normal walk area
else dist *= DISTANCEFACTOR_WALK;
//
intdist = (int) dist;
//make sure the distance isn't zero
if (intdist <= 0) intdist = 1;
return intdist;
} //end of the function AAS_AreaTravelTime
//===========================================================================
//
// Parameter: -
// Returns: -
// Changes Globals: -
//===========================================================================
void AAS_CalculateAreaTravelTimes(void)
{
int i, l, n, size;
char *ptr;
vec3_t end;
aas_reversedreachability_t *revreach;
aas_reversedlink_t *revlink;
aas_reachability_t *reach;
aas_areasettings_t *settings;
int starttime;
starttime = Sys_MilliSeconds();
//if there are still area travel times, free the memory
if (aasworld.areatraveltimes) FreeMemory(aasworld.areatraveltimes);
//get the total size of all the area travel times
size = aasworld.numareas * sizeof(unsigned short **);
for (i = 0; i < aasworld.numareas; i++)
{
revreach = &aasworld.reversedreachability[i];
//settings of the area
settings = &aasworld.areasettings[i];
//
size += settings->numreachableareas * sizeof(unsigned short *);
//
size += settings->numreachableareas * revreach->numlinks * sizeof(unsigned short);
} //end for
//allocate memory for the area travel times
ptr = (char *) GetClearedMemory(size);
aasworld.areatraveltimes = (unsigned short ***) ptr;
ptr += aasworld.numareas * sizeof(unsigned short **);
//calcluate the travel times for all the areas
for (i = 0; i < aasworld.numareas; i++)
{
//reversed reachabilities of this area
revreach = &aasworld.reversedreachability[i];
//settings of the area
settings = &aasworld.areasettings[i];
//
aasworld.areatraveltimes[i] = (unsigned short **) ptr;
ptr += settings->numreachableareas * sizeof(unsigned short *);
//
for (l = 0; l < settings->numreachableareas; l++)
{
aasworld.areatraveltimes[i][l] = (unsigned short *) ptr;
ptr += revreach->numlinks * sizeof(unsigned short);
//reachability link
reach = &aasworld.reachability[settings->firstreachablearea + l];
//
for (n = 0, revlink = revreach->first; revlink; revlink = revlink->next, n++)
{
VectorCopy(aasworld.reachability[revlink->linknum].end, end);
//
aasworld.areatraveltimes[i][l][n] = AAS_AreaTravelTime(i, end, reach->start);
} //end for
} //end for
} //end for
#ifdef DEBUG
botimport.Print(PRT_MESSAGE, "area travel times %d msec\n", Sys_MilliSeconds() - starttime);
#endif
} //end of the function AAS_CalculateAreaTravelTimes
//===========================================================================
//
// Parameter: -
// Returns: -
// Changes Globals: -
//===========================================================================
int AAS_PortalMaxTravelTime(int portalnum)
{
int l, n, t, maxt;
aas_portal_t *portal;
aas_reversedreachability_t *revreach;
aas_reversedlink_t *revlink;
aas_areasettings_t *settings;
portal = &aasworld.portals[portalnum];
//reversed reachabilities of this portal area
revreach = &aasworld.reversedreachability[portal->areanum];
//settings of the portal area
settings = &aasworld.areasettings[portal->areanum];
//
maxt = 0;
for (l = 0; l < settings->numreachableareas; l++)
{
for (n = 0, revlink = revreach->first; revlink; revlink = revlink->next, n++)
{
t = aasworld.areatraveltimes[portal->areanum][l][n];
if (t > maxt)
{
maxt = t;
} //end if
} //end for
} //end for
return maxt;
} //end of the function AAS_PortalMaxTravelTime
//===========================================================================
//
// Parameter: -
// Returns: -
// Changes Globals: -
//===========================================================================
void AAS_InitPortalMaxTravelTimes(void)
{
int i;
if (aasworld.portalmaxtraveltimes) FreeMemory(aasworld.portalmaxtraveltimes);
aasworld.portalmaxtraveltimes = (int *) GetClearedMemory(aasworld.numportals * sizeof(int));
for (i = 0; i < aasworld.numportals; i++)
{
aasworld.portalmaxtraveltimes[i] = AAS_PortalMaxTravelTime(i);
//botimport.Print(PRT_MESSAGE, "portal %d max tt = %d\n", i, aasworld.portalmaxtraveltimes[i]);
} //end for
} //end of the function AAS_InitPortalMaxTravelTimes
//===========================================================================
//
// Parameter: -
// Returns: -
// Changes Globals: -
//===========================================================================
/*
int AAS_FreeOldestCache(void)
{
int i, j, bestcluster, bestarea, freed;
float besttime;
aas_routingcache_t *cache, *bestcache;
freed = qfalse;
besttime = 999999999;
bestcache = NULL;
bestcluster = 0;
bestarea = 0;
//refresh cluster cache
for (i = 0; i < aasworld.numclusters; i++)
{
for (j = 0; j < aasworld.clusters[i].numareas; j++)
{
for (cache = aasworld.clusterareacache[i][j]; cache; cache = cache->next)
{
//never remove cache leading towards a portal
if (aasworld.areasettings[cache->areanum].cluster < 0) continue;
//if this cache is older than the cache we found so far
if (cache->time < besttime)
{
bestcache = cache;
bestcluster = i;
bestarea = j;
besttime = cache->time;
} //end if
} //end for
} //end for
} //end for
if (bestcache)
{
cache = bestcache;
if (cache->prev) cache->prev->next = cache->next;
else aasworld.clusterareacache[bestcluster][bestarea] = cache->next;
if (cache->next) cache->next->prev = cache->prev;
AAS_FreeRoutingCache(cache);
freed = qtrue;
} //end if
besttime = 999999999;
bestcache = NULL;
bestarea = 0;
for (i = 0; i < aasworld.numareas; i++)
{
//refresh portal cache
for (cache = aasworld.portalcache[i]; cache; cache = cache->next)
{
if (cache->time < besttime)
{
bestcache = cache;
bestarea = i;
besttime = cache->time;
} //end if
} //end for
} //end for
if (bestcache)
{
cache = bestcache;
if (cache->prev) cache->prev->next = cache->next;
else aasworld.portalcache[bestarea] = cache->next;
if (cache->next) cache->next->prev = cache->prev;
AAS_FreeRoutingCache(cache);
freed = qtrue;
} //end if
return freed;
} //end of the function AAS_FreeOldestCache
*/
//===========================================================================
//
// Parameter: -
// Returns: -
// Changes Globals: -
//===========================================================================
int AAS_FreeOldestCache(void)
{
int clusterareanum;
aas_routingcache_t *cache;
for (cache = aasworld.oldestcache; cache; cache = cache->time_next) {
// never free area cache leading towards a portal
if (cache->type == CACHETYPE_AREA && aasworld.areasettings[cache->areanum].cluster < 0) {
continue;
}
break;
}
if (cache) {
// unlink the cache
if (cache->type == CACHETYPE_AREA) {
//number of the area in the cluster
clusterareanum = AAS_ClusterAreaNum(cache->cluster, cache->areanum);
// unlink from cluster area cache
if (cache->prev) cache->prev->next = cache->next;
else aasworld.clusterareacache[cache->cluster][clusterareanum] = cache->next;
if (cache->next) cache->next->prev = cache->prev;
}
else {
// unlink from portal cache
if (cache->prev) cache->prev->next = cache->next;
else aasworld.portalcache[cache->areanum] = cache->next;
if (cache->next) cache->next->prev = cache->prev;
}
AAS_FreeRoutingCache(cache);
return qtrue;
}
return qfalse;
} //end of the function AAS_FreeOldestCache
//===========================================================================
//
// Parameter: -
// Returns: -
// Changes Globals: -
//===========================================================================
aas_routingcache_t *AAS_AllocRoutingCache(int numtraveltimes)
{
aas_routingcache_t *cache;
int size;
//
size = sizeof(aas_routingcache_t)
+ numtraveltimes * sizeof(unsigned short int)
+ numtraveltimes * sizeof(unsigned char);
//
routingcachesize += size;
//
cache = (aas_routingcache_t *) GetClearedMemory(size);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -