void CStarmap::AddBase(const Sector §or, BYTE propTech) { AssertBotE(sector.on_map()); // merken, dass Sektor einen Außenposten besitzt; falls der Außenposten schon vorhanden ist, die folgende // Berechnung trotzdem durchführen, da eine andere <code>rangeMap</code> vorgegeben sein könnte. if (!IsBase(sector)) m_lBases.push_back(sector); // --- Map mit Entfernungen aktualisieren --- this->CalcRangeMap(propTech); // lokale Rangemap durchlaufen for (char x = -m_RangeMap.x0; x < m_RangeMap.w - m_RangeMap.x0; x++) for (char y = -m_RangeMap.y0; y < m_RangeMap.h - m_RangeMap.y0; y++) { Sector pt(sector.x + x, sector.y + y); if (pt.is_in_rect(0, 0, STARMAP_SECTORS_HCOUNT, STARMAP_SECTORS_VCOUNT)) { // Wert überschreiben, wenn der neue Einfluss größer ist m_Range.at(CoordsToIndex(pt.x, pt.y)) = max(m_Range.at(CoordsToIndex(pt.x, pt.y)), GetRangeMapValue(x, y)); } } // pathStart zurücksetzen, damit sämtliche Wege beim nächsten Aufruf von // CalcPath() neu berechnet werden pathStart = Sector(); #ifdef DEBUG_AI_BASE_DEMO // ACHTUNG: verwenden i. A. falsche RangeMap! RecalcRangePoints(); RecalcConnectionPoints(); RecalcTargetPoints(); #endif }
static base_n addtotable( token_n *tokens, token_n *end_token, action_n *actions, token_n default_token, token_n parent_token ) { base_n start, i; token_n max; action_n default_action; token_n *r; a_table *t; a_table *tstart; action_n actval; token_n tokval; if( compactflag ) { start = used++; expand_table( used ); // Leave room for parent & default default_action = ACTION_NULL; for( r = tokens; r < end_token; ++r ) { tokval = *r; if( tokval == default_token ) { default_action = actions[tokval]; } else if( tokval != parent_token ) { actval = actions[tokval]; if( tokval > 0x0FFF ) { printf( "Error: token index 0x%X for item %d is higher then 0x0FFF !\n", tokval, start ); } if( actval > 0x0FFF ) { printf( "Error: token action 0x%X for item %d is higher then 0x0FFF !\n", actval, start ); } expand_table( used + 1 ); table[used].token = tokval; table[used].action = actval; ++used; } } actval = actions[parent_token]; if( actval > 0x0FFF ) { printf( "Error: parent action 0x%X for item %d is higher then 0x0FFF !\n", actval, start ); } if( default_action > 0x0FFF ) { printf( "Error: default action 0x%X for item %d is higher then 0x0FFF !\n", default_action, start ); } table[start].token = (token_n)actval; table[start].action = default_action; } else { max = *tokens; for( r = tokens + 1; r < end_token; ++r ) { if( *r > max ) { max = *r; } } for( start = 0; ; ++start ) { i = avail; expand_table( start + max + 1 ); while( i < avail ) { table[i].token = TOKEN_IMPOSSIBLE; table[i].action = ACTION_NULL; ++i; } tstart = table + start; if( !IsBase( tstart ) ) { for( r = tokens; r < end_token; ++r ) { if( IsUsed( tstart + *r ) ) { break; } } if( r >= end_token ) { break; } } } SetBase( tstart ); for( r = tokens; r < end_token; ++r ) { tokval = *r; t = tstart + tokval; if( ! bigflag ) { if( tokval >= UCHAR_MAX ) { msg( "too many tokens!\n" ); } } SetToken( t, tokval ); actval = actions[tokval]; if( (actval & ACTION_MASK) != actval ) { printf( "Error: token action 0x%X for token %d is higher then 0x3FFF !\n", actval, tokval ); } SetAction( t, actval ); } i = start + max + 1; if( i > used ) { used = i; } } return( start ); }