Exemple #1
0
G* Memory<G>::Require( std::size_t size )
{
    if( size > size_ )
    {
        delete[] buffer_;
#ifndef ELEM_RELEASE
        try {
#endif
            buffer_ = new G[size];
#ifndef ELEM_RELEASE
        } 
        catch( std::bad_alloc& e )
        {
            std::ostringstream os;
            os << "Failed to allocate " << size*sizeof(G) 
               << " bytes on process " << mpi::WorldRank() << std::endl;
            std::cerr << os.str();
            throw e;
        }
#endif
        size_ = size;
#ifdef ELEM_ZERO_INIT
        MemZero( buffer_, size_ );
#elif defined(ELEM_HAVE_VALGRIND)
        if( ELEM_RUNNING_ON_VALGRIND )    
            MemZero( buffer_, size_ );
#endif
    }
    return buffer_;
}
Exemple #2
0
inline void
MakeTriangular( UpperOrLower uplo, DistMatrix<T,U,V>& A )
{
#ifndef RELEASE
    PushCallStack("MakeTriangular");
#endif
    const int height = A.Height();
    const int localHeight = A.LocalHeight();
    const int localWidth = A.LocalWidth();
    const int colShift = A.ColShift();
    const int rowShift = A.RowShift();
    const int colStride = A.ColStride();
    const int rowStride = A.RowStride();

    T* localBuffer = A.LocalBuffer();
    const int ldim = A.LocalLDim();

    if( uplo == LOWER )
    {

#ifdef HAVE_OPENMP
        #pragma omp parallel for
#endif
        for( int jLocal=0; jLocal<localWidth; ++jLocal )
        {
            const int j = rowShift + jLocal*rowStride;
            const int lastZeroRow = j-1;
            if( lastZeroRow >= 0 )
            {
                const int boundary = std::min( lastZeroRow+1, height );
                const int numZeroRows =
                    RawLocalLength( boundary, colShift, colStride );
                MemZero( &localBuffer[jLocal*ldim], numZeroRows );
            }
        }
    }
    else
    {
#ifdef HAVE_OPENMP
        #pragma omp parallel for
#endif
        for( int jLocal=0; jLocal<localWidth; ++jLocal )
        {
            const int j = rowShift + jLocal*rowStride;
            const int firstZeroRow = j+1;
            const int numNonzeroRows =
                RawLocalLength(firstZeroRow,colShift,colStride);
            if( numNonzeroRows < localHeight )
            {
                T* col = &localBuffer[numNonzeroRows+jLocal*ldim];
                MemZero( col, localHeight-numNonzeroRows );
            }
        }
    }
#ifndef RELEASE
    PopCallStack();
#endif
}
Exemple #3
0
  RegionImpl::RegionImpl(int id)
    : self( &data )
  {
    // Set client data
    MemZero(this->data);

    // Assuming this is called via GameInternals, so no checks are made
    BW::region *r         = &BW::BWDATA_SAIPathing->regions[id];

    // Assign common region properties
    self->islandID        = r->groupIndex;
    self->center_x        = r->getCenter().x;
    self->center_y        = r->getCenter().y;

    self->isWalkable      = r->accessabilityFlags != 0x1FFD;
    self->isHigherGround  = r->accessabilityFlags == 0x1FF9;
    self->priority        = r->properties & 0x7F;
    self->leftMost        = r->rgnBox.left;
    self->rightMost       = r->rgnBox.right;
    self->topMost         = r->rgnBox.top;
    self->bottomMost      = r->rgnBox.bottom;

    // Connect the BWAPI Region and BW Region two ways
    self->id  = id;
    r->unk_28 = (u32)this;
    
    this->closestAccessibleRgn    = NULL;
    this->closestInaccessibleRgn  = NULL;
  }
Exemple #4
0
void InitializeWModeBitmap(int width, int height)
{
  if ( hdcMem )
    DeleteDC(hdcMem);
  hdcMem = NULL;
  
  // Create Bitmap HDC
  MemZero(wmodebmp);
  wmodebmp.bmiHeader.biSize          = sizeof(BITMAPINFOHEADER);
  wmodebmp.bmiHeader.biWidth         = width;
  wmodebmp.bmiHeader.biHeight        = -(height);
  wmodebmp.bmiHeader.biPlanes        = 1;
  wmodebmp.bmiHeader.biBitCount      = 8;
  wmodebmp.bmiHeader.biCompression   = BI_RGB;
  wmodebmp.bmiHeader.biSizeImage     = width * height;
#ifndef SHADOW_BROODWAR
  if ( isCorrectVersion )
  {
    for ( int i = 0; i < 256; ++i )
    {
      wmodebmp.bmiColors[i].rgbRed   = BW::BWDATA::GamePalette[i].peRed;
      wmodebmp.bmiColors[i].rgbGreen = BW::BWDATA::GamePalette[i].peGreen;
      wmodebmp.bmiColors[i].rgbBlue  = BW::BWDATA::GamePalette[i].peBlue;
    }
  }
#endif
  HDC     hdc   = GetDC(ghMainWnd);
  hwmodeBmp     = CreateDIBSection(hdc, (BITMAPINFO*)&wmodebmp, DIB_RGB_COLORS, &pBits, NULL, 0);
  hdcMem        = CreateCompatibleDC(hdc);
  ReleaseDC(ghMainWnd, hdc);
  SelectObject(hdcMem, hwmodeBmp);
}
Exemple #5
0
 //--------------------------------------------- CONSTRUCTOR ------------------------------------------------
 UnitImpl::UnitImpl(BW::CUnit* originalUnit,
                    u16 index)
     : getOriginalRawData(originalUnit)
     , self(&data)
     , index(index)
     , userSelected(false)
     , isAlive(false)
     , wasAlive(false)
     , wasCompleted(false)
     , wasAccessible(false)
     , wasVisible(false)
     , staticInformation(false)
     , lastType(UnitTypes::Unknown)
     , lastPlayer(nullptr)
     , nukeDetected(false)
     , lastGroundWeaponCooldown(0)
     , lastAirWeaponCooldown(0)
     , startingAttack(false)
     , lastCommandFrame(0)
     , lastImmediateCommandFrame(0)
     , lastCommand()
     , lastImmediateCommand()
     , id(-1)
 {
   MemZero(data);
   clear();
 }
Exemple #6
0
IS_FRAME *LoadIS_FRAME( COAL *path )
{
    DWORD dErr = ERROR_FRAMSERV( 0x10 );
    IS_FRAME *f = 0, *o;

    DWORD oRes = (DWORD) path <= IDX_LAST;

    CHECK_ERROR( o = (IS_FRAME *) MemAlloc( sizeof( IS_FRAME ) / 4 ) );
    MemZero( sizeof( IS_FRAME ) / 4, o );

    CHECK_ERROR( o->hBM = LoadImage( oRes ? gs_hInst : 0, path, IMAGE_BITMAP, 0, 0, oRes ? 0 : LR_LOADFROMFILE ) );
    CHECK_ERROR( GetObject( o->hBM, sizeof( BITMAP ), &o->bih ) );
    CHECK_ERROR( o->hDC = CreateCompatibleDC( 0 ) );
    CHECK_ERROR( o->hGO = SelectObject( o->hDC, o->hBM ) );

    CHECK_ERROR( f = MakeIS_FRAME( o->_x, o->_y ) );
    CHECK_ERROR( BitBlt( f->hDC, 0, 0, o->_x, o->_y, o->hDC, 0, 0, SRCCOPY ) );

    dErr = ERROR_SUCCESS;

CatchError:

    KillIS_FRAME( o );

    if ( dErr )
    {
        KillIS_FRAME( f );
        f = 0;
    }

    return f;
}
Exemple #7
0
int mbbs_memalloc(MemType **buf, unsigned int *bufsz, unsigned int nobj, size_t objsz) {
	if (buf == (MemType **)0)
		return MEM_BADARG;
	if (bufsz == (unsigned int *)0)
		return MEM_BADARG;

	/* sufficient memory already allocated? */
	if (*bufsz >= nobj) {
		if ((*buf != (MemType *)0) && (nobj != 0) && (objsz != 0))
			MemZero(*buf, nobj * objsz);
		return MEM_SUCCESS;
	}

	if ((mem_maxallocsz != 0) && (mem_maxallocsz < (unsigned long)(nobj * objsz)))
		return MEM_OOB;

	/* free any existing memory */
	if (*buf != (MemType *)0)
		CFree((MemType *)*buf);
	*bufsz = 0;

	/* allocate new memory */
	if ((*buf = (MemType *)calloc((MemSizeType)nobj, (MemSizeType)objsz)) == (MemType *)0)
		return MEM_CALLOC;
	*bufsz = nobj;

	return MEM_SUCCESS;
}
/////////////////////////////////////////////////////////////////////////////////
// ConsoleEnvironment implementation
ConsoleEnvironment::ConsoleEnvironment():
    m_mapVariables(), m_itEnumerate()
{
    // Resource state data
    m_pActiveDB = NULL;

    m_bOpenedResource = false;
    MemZero( &m_hOpenedResource, sizeof(RDB_ResourceHandle) );
    m_strOpenedResourceName[0] = NULLBYTE;
}
Exemple #9
0
 //---------------------------------------------- CONSTRUCTOR -----------------------------------------------
 BulletImpl::BulletImpl(BW::CBullet* originalBullet, u16 _index)
     : self( &data )
     , bwOriginalBullet(originalBullet)
     , index(_index)
     , id(-1)
     , __exists(false)
     , lastExists(false)
 {
   MemZero(data);
 }
//------------------------------------------------------------------
void	INetworkedObject::AddField( EFieldType type, uint bits, uint size, const void* data )
{
	_fields.resize( _fields.size() + 1 );

	SField& field( *_fields.rbegin() );
	field.type = type;
	field.bits = bits;
	field.data = data;
	field.size = size;
	MemZero( field.prevValue, size );
}
Exemple #11
0
static
bool F_Parse_INI_and_Load_Packages( PCHARS szProjFilePath )
{
	AssertPtr( szProjFilePath );

	// Parse .INI file and load resource packages.

	ANSICHAR	iniFilePath[ FS_MAX_PATH ];
	VRET_FALSE_IF_NOT( F_Compose_File_Path( szProjFilePath, iniFilePath, NUMBER_OF(iniFilePath) ) );

	FileReader	iniFileReader( iniFilePath, FileRead_NoErrors );

	if( !iniFileReader.IsOpen() ) {
		mxWarnf("Failed to load config file '%s'\n",iniFilePath);
		return false;
	}

	// 1 KiB
	enum { MAX_INI_SIZE = 1*mxKIBIBYTE};

	const UINT fileSize = iniFileReader.GetSize();

	if( fileSize > MAX_INI_SIZE )
	{
		mxWarnf("Config file '%s' is too big\n",iniFilePath);
		return false;
	}

	ANSICHAR	buffer[ MAX_INI_SIZE ];
	MemZero( buffer, sizeof buffer );
	iniFileReader.Read( buffer, fileSize );

	idLexer		lexer( buffer, fileSize, iniFilePath, LEXFL_ALLOWPATHNAMES|LEXFL_NOSTRINGCONCAT );
	idToken		token;
	while( lexer.ReadToken( &token ) )
	{
		if( token == "[" ) {
			lexer.ExpectAnyToken( &token );
			lexer.ExpectTokenString("]");
			continue;
		}
		if( token.type == TT_STRING ) {
			UNDONE;
			//F_MountExistingPackage( token.ToChars() );
			continue;
		} else {
			lexer.Error("Expected a string, but got '%s'\n",token.ToChars());
		}
		return false;
	}//while (ReadToken)

	return true;
}
Exemple #12
0
inline void
MakeTriangular( UpperOrLower uplo, Matrix<T>& A )
{
#ifndef RELEASE
    PushCallStack("MakeTriangular");
#endif
    const int height = A.Height();
    const int width = A.Width();
    const int ldim = A.LDim();
    T* buffer = A.Buffer();

    if( uplo == LOWER )
    {
#ifdef HAVE_OPENMP
        #pragma omp parallel for
#endif
        for( int j=1; j<width; ++j )
        {
            const int numZeroRows = std::min( j, height );
            MemZero( &buffer[j*ldim], numZeroRows );
        }
    }
    else
    {
#ifdef HAVE_OPENMP
        #pragma omp parallel for
#endif
        for( int j=0; j<std::min(width,height); ++j )
        {
            const int firstZeroRow = j+1;
            MemZero( &buffer[firstZeroRow+j*ldim], height-firstZeroRow );
        }
    }
#ifndef RELEASE
    PopCallStack();
#endif
}
Exemple #13
0
int
mbbs_memallocsh(MemType **buf, int *shmid, unsigned int *bufsz, unsigned int nobj, size_t objsz)
{
	if (buf == (MemType **) 0)
		return MEM_BADARG;
	if (shmid == (int *) 0)
		return MEM_BADARG;
	if (bufsz == (unsigned int *) 0)
		return MEM_BADARG;

	/* sufficient memory already allocated? */
	if (*bufsz >= nobj) {
		if ((*buf != (MemType *) 0) && (nobj != 0) && (objsz != 0))
			MemZero(*buf, nobj*objsz);
		return MEM_SUCCESS;
	}

	if ((mem_maxallocsz != 0) && (mem_maxallocsz < (unsigned long) (nobj*objsz)))
		return MEM_OOB;

	/* free any existing memory */
	if ((*buf != (MemType *) 0) && (*shmid != MEM_SHMNULLID)) {
		if (shmdt((MemType *) *buf) < 0)
			return MEM_SHMDET;
		*buf= (MemType *) 0;
		*bufsz= 0;
		if (shmctl(*shmid, IPC_RMID, (struct shmid_ds *) 0) < 0) {
			*shmid= MEM_SHMNULLID;
			return MEM_SHMRM;
		}
	}
	*buf= (MemType *) 0;
	*bufsz= 0;
	*shmid= MEM_SHMNULLID;

	/* allocate new memory */
	if ((*shmid= shmget(mem_key, (MemSizeType) (nobj*objsz), mem_shmflag)) < 0) {
		*shmid= MEM_SHMNULLID;
		return MEM_SHMGET;
	}
	if ((*buf= (MemType *) shmat(*shmid, (MemType *) 0, (int) 0)) == (MemType *) -1) {
		(void) shmctl(*shmid, IPC_RMID, (struct shmid_ds *) 0);
		*shmid= MEM_SHMNULLID;
		return MEM_SHMATT;
	}
	*bufsz= nobj;

	return MEM_SUCCESS;
}
Void InputManager::Initialize()
{
    // default state
    m_AsyncKeyboard.NumLock = true;
    m_AsyncKeyboard.CapsLock = false;
    m_AsyncKeyboard.ScrollLock = false;
    m_AsyncKeyboard.LastKey = KEYCODE_NULL;
    MemZero( m_AsyncKeyboard.Keys, KEYBOARD_KEYS );
    m_AsyncMouse.X = 0;
    m_AsyncMouse.Y = 0;
    m_AsyncMouse.DX = 0;
    m_AsyncMouse.DY = 0;
    m_AsyncMouse.DWheel = 0;
    m_AsyncMouse.LastButton = KEYCODE_NULL;
    MemZero( m_AsyncMouse.Buttons, MOUSE_BUTTONS );

    // Action Mapping
    for( UInt i = 0; i < INPUT_MAX_MAPS; ++i )
        m_arrActionMaps[i] = NULL;
    m_iMapCount = 0;
    m_iActiveMap = INVALID_OFFSET;

    // Build a default map ?
}
Exemple #15
0
G* Memory<G>::Require( size_t size )
{
    if( size > size_ )
    {
        Delete( rawBuffer_ );

#ifndef EL_RELEASE
        try {
#endif

            // TODO: Optionally overallocate to force alignment of buffer_
            rawBuffer_ = New<G>( size );
            buffer_ = rawBuffer_;

            size_ = size;
#ifndef EL_RELEASE
        } 
        catch( std::bad_alloc& e )
        {
            size_ = 0;
            ostringstream os;
            os << "Failed to allocate " << size*sizeof(G) 
               << " bytes on process " << mpi::WorldRank() << endl;
            cerr << os.str();
            throw e;
        }
#endif
#ifdef EL_ZERO_INIT
        MemZero( buffer_, size_ );
#elif defined(EL_HAVE_VALGRIND)
        if( EL_RUNNING_ON_VALGRIND )
            MemZero( buffer_, size_ );
#endif
    }
    return buffer_;
}
/////////////////////////////////////////////////////////////////////////////////
// HProcess implementation
HProcess::HProcess( ProcessCreationFlags iFlags, GChar * strCmdLine, Void * pEnvironment,
                    HThread * outMainThread, ProcessID * outProcessID, ThreadID * outMainThreadID ):
    HThreadingObject()
{
    STARTUPINFO startupInfos;
    MemZero( &startupInfos, sizeof(STARTUPINFO) );
    startupInfos.cb = sizeof(STARTUPINFO);
    if ( iFlags & PROCESS_FULLSCREEN )
        startupInfos.dwFlags |= STARTF_RUNFULLSCREEN;

    DWord dwFlags = 0;
    if ( iFlags & PROCESS_SUSPENDED ) // main thread is suspended upon creation
        dwFlags |= CREATE_SUSPENDED;
    if ( iFlags & PROCESS_NO_WINDOW ) // no console window
        dwFlags |= CREATE_NO_WINDOW;
    else {
        if ( iFlags & PROCESS_DETACHED ) // new console instead of parent's
            dwFlags |= DETACHED_PROCESS;
        else if ( iFlags & PROCESS_NEW_CONSOLE ) // don't inherit parent's console, create manually later (or not)
            dwFlags |= CREATE_NEW_CONSOLE;
    }

    PROCESS_INFORMATION processInfos;
    MemZero( &processInfos, sizeof(PROCESS_INFORMATION) );

    BOOL bRes = CreateProcess( NULL, strCmdLine, NULL, NULL, FALSE, dwFlags, pEnvironment, NULL, &startupInfos, &processInfos );
    DebugAssert( bRes );

    m_hThreadingObject = processInfos.hProcess;
    if ( outMainThread != NULL )
        outMainThread->m_hThreadingObject = processInfos.hThread;
    if ( outProcessID != NULL )
        *outProcessID = processInfos.dwProcessId;
    if ( outMainThreadID != NULL )
        *outMainThreadID = processInfos.dwThreadId;
}
Exemple #17
0
bool Image::Create(uint width, uint height, uint bpp)
{
  if (!m_pImageData && IMAGE_BPP_8 == bpp &&
      width > IMAGE_MIN_WIDTH && height > IMAGE_MIN_HEIGHT)
  {
    //create image only if not already created
    ulong size = width * height * IMAGE_NUM_COMPONENTS;
    m_pImageData = new ubyte [size];
    MemZero(m_pImageData, size);
    m_width  = width;
    m_height = height;
    m_bpp    = bpp;
    return true;
  }
  return false;
}
Exemple #18
0
NetworkError System::ResolveHostName( const GChar * strServiceName, const GChar * strHostName,
                                      SocketProtocol protocolHint, AddressResolveFlags iFlags )
{
    ADDRINFOT hints;
    MemZero( &hints, sizeof(ADDRINFOT) );
    switch( protocolHint ) {
        case SOCKET_UNSPECIFIED: hints.ai_family = AF_UNSPEC; hints.ai_socktype = 0;           hints.ai_protocol = 0; break;
        case SOCKET_ICMPv4:      hints.ai_family = AF_INET;   hints.ai_socktype = SOCK_RAW;    hints.ai_protocol = IPPROTO_ICMP; break;
        case SOCKET_IGMPv4:      hints.ai_family = AF_INET;   hints.ai_socktype = SOCK_RAW;    hints.ai_protocol = IPPROTO_IGMP; break;
        case SOCKET_UDPIPv4:     hints.ai_family = AF_INET;   hints.ai_socktype = SOCK_DGRAM;  hints.ai_protocol = IPPROTO_UDP; break;
        case SOCKET_TCPIPv4:     hints.ai_family = AF_INET;   hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; break;
        case SOCKET_ICMPv6:      hints.ai_family = AF_INET6;  hints.ai_socktype = SOCK_RAW;    hints.ai_protocol = IPPROTO_ICMPV6; break;
        case SOCKET_IGMPv6:      hints.ai_family = AF_INET6;  hints.ai_socktype = SOCK_RAW;    hints.ai_protocol = IPPROTO_IGMP; break;
        case SOCKET_UDPIPv6:     hints.ai_family = AF_INET6;  hints.ai_socktype = SOCK_DGRAM;  hints.ai_protocol = IPPROTO_UDP; break;
        case SOCKET_TCPIPv6:     hints.ai_family = AF_INET6;  hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; break;
        default: return NETWORK_ERROR;
    }
    if ( iFlags & ADDRRESOLVE_FLAG_SERVER_USAGE )
        hints.ai_flags |= AI_PASSIVE;
    if ( iFlags & ADDRRESOLVE_FLAG_NUMERIC_HOST )
        hints.ai_flags |= AI_NUMERICHOST;
    if ( iFlags & ADDRRESOLVE_FLAG_CANONICAL_NAME )
        hints.ai_flags |= AI_CANONNAME;
    // Many more flags supported with Vista/Seven ...

    Int iResult = GetAddrInfo( strHostName, strServiceName, &hints, &m_pCurAddrInfo );
    if ( iResult == 0 )
        return NETWORK_OK;

    m_pCurAddrInfo = NULL;
    iResult = WSAGetLastError();
    switch(iResult) {
        case WSAHOST_NOT_FOUND: return NETWORK_HOST_NOT_FOUND;
        case WSANO_DATA:        return NETWORK_NO_DATA;
        case WSATRY_AGAIN:      return NETWORK_RETRY;
        case WSANOTINITIALISED:
        case WSAEAFNOSUPPORT:
        case WSAESOCKTNOSUPPORT:
        case WSAEINVAL:
        case WSATYPE_NOT_FOUND:
        case WSA_NOT_ENOUGH_MEMORY:
        case WSANO_RECOVERY:
        default: break;
    }
    return NETWORK_ERROR;
}
Exemple #19
0
DWORD TrayAction( DWORD m_dAction )
{
    NOTIFYICONDATA xNID;
    MemZero( sizeof( NOTIFYICONDATA ) / 4, &xNID );

    xNID.cbSize = sizeof( NOTIFYICONDATA );
    xNID.hWnd = gm_hWnd;
    xNID.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
    xNID.uCallbackMessage = WM_TRAYIDOL;
    xNID.hIcon = LoadIcon( gs_hInst, MAKEINTRESOURCE( gm_hAC ? IDI_POINTER : IDI_DENIED ) );

    wsprintf( xNID.szTip, TEXT( "%s - %s" ), &gs_sSH, gm_hAC ? TEXT( "Active" ) : TEXT( "Disabled" ) );

    if ( !Shell_NotifyIcon( m_dAction, &xNID ) ) return ERROR_TRAYIDOL( 0x00 );

    return ERROR_SUCCESS;
}
Exemple #20
0
inline void
Zero( Matrix<T>& A )
{
#ifndef RELEASE
    PushCallStack("Zero");
#endif
    const int height = A.Height();
    const int width = A.Width();
#ifdef HAVE_OPENMP
    #pragma omp parallel for
#endif
    for( int j=0; j<width; ++j )
        MemZero( A.Buffer(0,j), height );
#ifndef RELEASE
    PopCallStack();
#endif
}
Exemple #21
0
void MakeTrapezoidal( UpperOrLower uplo, Matrix<T>& A, Int offset )
{
    EL_DEBUG_CSE
    const Int height = A.Height();
    const Int width = A.Width();
    const Int ldim = A.LDim();
    T* buffer = A.Buffer();

    if( uplo == LOWER )
    {
        EL_PARALLEL_FOR
        for( Int j=Max(0,offset+1); j<width; ++j )
        {
            const Int lastZeroRow = j-offset-1;
            const Int numZeroRows = Min( lastZeroRow+1, height );
            MemZero( &buffer[j*ldim], numZeroRows );
        }
    }
Exemple #22
0
void Zero( AutoMatrix<Int>& A )
{
#ifndef RELEASE
	PushCallStack("Zero");
#endif
	const size_t dsize = A.DataSize();
	const size_t height = A.Height() * dsize;
	const size_t ldim = A.LDim() * dsize;
	const int width = A.Width();
	byte* buffer = static_cast<byte*>( A.Buffer() );
#ifdef HAVE_OPENMP
    #pragma omp parallel for
#endif
    for( int j=0; j<width; ++j )
    	MemZero( buffer + j * ldim, height );
#ifndef RELEASE    	
    PopCallStack();
#endif
}
Exemple #23
0
NAMESPACE_BEGIN

ParticleSystem::ParticleSystem()
: m_reduceSize  (false),
  m_reduceAlpha (false),
  m_maxSize (0.0f),
  m_spread  (0.0f),
  m_minFade (0.0f),
  m_maxFade (0.0f),
  m_maxLife (0.0f),
  m_count   (0),
  m_frame   (0)
{
#ifdef _DEBUG
  SetName("psystem");
#endif
  ColorZero(m_color);
  VectorZero(m_velocity);
  VectorZero(m_accel);
  MemZero(m_aParticles, sizeof(m_aParticles));
}
Exemple #24
0
IS_FRAME *MakeIS_FRAME( int f_iX, int f_iY )
{
    DWORD dErr = ERROR_FRAMSERV( 0x00 );
    IS_FRAME *f = 0;

    CHECK_ERROR( ( f_iX > 0 ) && ( f_iY > 0 ) );

    CHECK_ERROR( f = (IS_FRAME *) MemAlloc( sizeof( IS_FRAME ) / 4 ) );
    MemZero( sizeof( IS_FRAME ) / 4, f );

    f->bih.biSize = sizeof( BITMAPINFOHEADER );
    f->bih.biPlanes = 1;
    f->bih.biBitCount = 32;
    f->bih.biSizeImage = f_iX * f_iY << 2;

    f->_x =   ( f->_rl = f_iX );
    f->_y = - ( f->_rt = f_iY );

    CHECK_ERROR( f->hBM = CreateDIBSection( 0, (BITMAPINFO *) &f->bih, 0, &f->dPx, 0, 0 ) );
    f->_y = f_iY;

    CHECK_ERROR( f->hDC = CreateCompatibleDC( 0 ) );
    CHECK_ERROR( f->hGO = SelectObject( f->hDC, f->hBM ) );

    dErr = ERROR_SUCCESS;

CatchError:

    if ( dErr )
    {
        KillIS_FRAME( f );
        f = 0;

        MsgErr( dErr, MB_ICONWARNING );
    }

    return f;
}
Exemple #25
0
//=============================================================================
CManager::CManager ()
{
    MemZero(m_keys);
    MemZero(m_mouse);
}
Exemple #26
0
  void UnitImpl::updateInternalData()
  {
    BW::CUnit *o = getOriginalRawData;
    if ( !o )
      return;
    int selfPlayerID = BroodwarImpl.server.getPlayerID(Broodwar->self());
    self->replayID   = BWAPI::BroodwarImpl.isFlagEnabled(Flag::CompleteMapInformation) ? BW::UnitTarget(o).getTarget() : 0;
    if (isAlive)
    {
      _getPlayer = BroodwarImpl._getPlayer(getOriginalRawData->playerID); //_getPlayer
      //------------------------------------------------------------------------------------------------------
      //isVisible
      for ( int i = 0; i < 9; ++i )
      {
        if ( i == selfPlayerID )
          continue;
        PlayerImpl* player = static_cast<PlayerImpl*>(Broodwar->getPlayer(i));
        if ( !o->sprite || !player )
          self->isVisible[i] = false;
        else if (!BroodwarImpl.isReplay() && !BWAPI::BroodwarImpl.isFlagEnabled(Flag::CompleteMapInformation))
          self->isVisible[i] = false;
        else if ( _getPlayer == player )
          self->isVisible[i] = true;
        else if ( player->isNeutral() )
          self->isVisible[i] = o->sprite->visibilityFlags > 0;
        else
          self->isVisible[i] = (o->sprite->visibilityFlags & (1 << player->getIndex())) != 0;
      }
      if (selfPlayerID >= 0)
      {
        if ( !o->sprite )
        {
          self->isVisible[selfPlayerID] = false;
          self->isDetected              = false;
        }
        else if (_getPlayer == BWAPI::BroodwarImpl.self())
        {
          self->isVisible[selfPlayerID] = true;
          self->isDetected              = true;
        }
        else if (o->unitType == UnitTypes::Spell_Scanner_Sweep)
        {
          self->isVisible[selfPlayerID] = isScannerVisible(o->position);
          self->isDetected = true;
        }
        else
        {
          self->isVisible[selfPlayerID] = (o->sprite->visibilityFlags & (1 << BroodwarImpl.BWAPIPlayer->getIndex())) != 0;
          if (o->statusFlag(BW::StatusFlags::RequiresDetection))
          {
            self->isVisible[selfPlayerID] &= ((o->visibilityStatus == -1) ||
                                             ((o->visibilityStatus & (1 << BroodwarImpl.BWAPIPlayer->getIndex())) != 0) ||
                                               o->movementFlag(BW::MovementFlags::Moving | BW::MovementFlags::Accelerating) ||
                                               o->orderID == Orders::Move ||
                                               o->groundWeaponCooldown > 0 ||
                                               o->airWeaponCooldown > 0 ||
                                              !o->statusFlag(BW::StatusFlags::Burrowed) );
          }
          bool canDetect = !o->statusFlag(BW::StatusFlags::RequiresDetection) ||
                           o->visibilityStatus == -1 ||
                           ((o->visibilityStatus & (1 << BroodwarImpl.BWAPIPlayer->getIndex())) != 0);
          self->isDetected = self->isVisible[selfPlayerID] & canDetect;
        }
      }
      else
      {
        self->isDetected = false;
        for(unsigned int i = 0; i < 9; ++i)
        {
          if (self->isVisible[i])
          {
            self->isDetected = true;
            break;
          }
        }
      }
      //------------------------------------------------------------------------------------------------------
      //_getType
      _getType = UnitType(o->unitType);
      if ( _getType.isMineralField() )
        _getType = UnitTypes::Resource_Mineral_Field;

      getBuildQueueSlot = o->buildQueueSlot; //getBuildQueueSlot
      for ( unsigned int i = 0; i < 5; ++i )
        getBuildQueue[i] = BWAPI::UnitType(o->buildQueue[i]);  //getBuildQueue

      if (_getType.isBuilding())
      {
        if (o->orderID == Orders::ZergBirth          ||
            o->orderID == Orders::ZergBuildingMorph  ||
            o->orderID == Orders::ZergUnitMorph      ||
            o->orderID == Orders::Enum::IncompleteMorphing )
        {
          //if we have a morphing building, set unit type to the build type (what it is morphing to)
          if ( getBuildQueue[(getBuildQueueSlot % 5)] != UnitTypes::None )
            _getType = getBuildQueue[(getBuildQueueSlot % 5)];
        }
      }

      //------------------------------------------------------------------------------------------------------
      //_getTransport
      _getTransport = nullptr;
      if (_getType == UnitTypes::Protoss_Interceptor  ||
          _getType == UnitTypes::Protoss_Scarab       ||
          _getType == UnitTypes::Terran_Vulture_Spider_Mine)
      {
        if (o->fighter.inHanger == false ||
            o->statusFlag(BW::StatusFlags::InTransport | BW::StatusFlags::InBuilding) )
          _getTransport = UnitImpl::BWUnitToBWAPIUnit(o->fighter.parent);
      }
      else if (o->statusFlag(BW::StatusFlags::InTransport | BW::StatusFlags::InBuilding) )
        _getTransport = UnitImpl::BWUnitToBWAPIUnit(o->connectedUnit);

      //------------------------------------------------------------------------------------------------------
      //_getPosition
      _getPosition = BWAPI::Position(_getTransport ? static_cast<UnitImpl*>(_getTransport)->getOriginalRawData->position : o->position);

      _getHitPoints = (int)std::ceil(o->hitPoints / 256.0); //_getHitPoints
      //------------------------------------------------------------------------------------------------------
      //_getResources
      _getResources = 0;
      if ( _getType.isResourceContainer() )
        _getResources = o->resource.resourceCount;

      hasEmptyBuildQueue = getBuildQueueSlot < 5 ? (getBuildQueue[getBuildQueueSlot] == UnitTypes::None) : false;  //hasEmptyBuildQueue
      _isCompleted = o->statusFlag(BW::StatusFlags::Completed); //_isCompleted
    }
    else // not alive
    {
      //------------------------------------------------------------------------------------------------------
      //isVisible
      MemZero(self->isVisible);
      self->isDetected = false;

      _getPlayer          = nullptr;               //_getPlayer
      _getType            = UnitTypes::Unknown; //_getType
      _getTransport       = nullptr;               //_getTransport
      _getPosition        = Positions::Unknown; //_getPosition
      _getHitPoints       = 0;                  //_getHitPoints
      _getResources       = 0;                  //_getResources
      getBuildQueueSlot   = 0;                  //getBuildQueueSlot
      for ( unsigned int i = 0; i < 5; ++i )
        getBuildQueue[i]  = UnitTypes::None;               //getBuildQueue
      hasEmptyBuildQueue  = true;               //hasEmptyBuildQueue
      _isCompleted        = false;              //_isCompleted
    }
  }
Exemple #27
0
//=============================================================================
void CManager::Update ()
{
    //byte newKeyState[256];
    //::GetKeyboardState(newKeyState);

    //for (uint i = 8; i < array_size(newKeyState); ++i)
    //{
    //    const bool newState = newKeyState[i] != 0;
    //    const bool oldState = m_keys[i] != 0;
    //    if (newState == oldState)
    //        continue;

    //    const EKey key = (EKey)i;
    //    m_keys[i] = newState;
    //    if (newState)
    //        m_notifier.Call(&CInputNotify::OnInputKeyDown, key);
    //    else
    //        m_notifier.Call(&CInputNotify::OnInputKeyUp, key);
    //}

    {
        XINPUT_STATE state;
        MemZero(state);
        const DWORD result = ::XInputGetState(0, &state);
        
        if (result == ERROR_SUCCESS)
        {
            m_gamepad.isAvailable = true;

            m_gamepad.axis[int(EGameAxis::LeftStickX)] = MapStick(state.Gamepad.sThumbLX);
            m_gamepad.axis[int(EGameAxis::LeftStickY)] = MapStick(state.Gamepad.sThumbLY);
            m_gamepad.axis[int(EGameAxis::LeftTrigger)] = MapTrigger(state.Gamepad.bLeftTrigger);

            m_gamepad.axis[int(EGameAxis::RightStickX)] = MapStick(state.Gamepad.sThumbRX);
            m_gamepad.axis[int(EGameAxis::RightStickY)] = MapStick(state.Gamepad.sThumbRY);
            m_gamepad.axis[int(EGameAxis::RightTrigger)] = MapTrigger(state.Gamepad.bRightTrigger);

            Update(EButton::LeftDpadUp, MapButton(state.Gamepad.wButtons, XINPUT_GAMEPAD_DPAD_UP));
            Update(EButton::LeftDpadUp, MapButton(state.Gamepad.wButtons, XINPUT_GAMEPAD_DPAD_UP));
            Update(EButton::LeftDpadRight, MapButton(state.Gamepad.wButtons, XINPUT_GAMEPAD_DPAD_RIGHT));
            Update(EButton::LeftDpadDown, MapButton(state.Gamepad.wButtons, XINPUT_GAMEPAD_DPAD_DOWN));
            Update(EButton::LeftDpadLeft, MapButton(state.Gamepad.wButtons, XINPUT_GAMEPAD_DPAD_LEFT));
            Update(EButton::LeftStick, MapButton(state.Gamepad.wButtons, XINPUT_GAMEPAD_LEFT_THUMB));
            Update(EButton::LeftShoulder, MapButton(state.Gamepad.wButtons, XINPUT_GAMEPAD_LEFT_SHOULDER));
            Update(EButton::LeftTrigger, (state.Gamepad.bLeftTrigger > XINPUT_GAMEPAD_TRIGGER_THRESHOLD));

            Update(EButton::RightDpadUp, MapButton(state.Gamepad.wButtons, XINPUT_GAMEPAD_Y));
            Update(EButton::RightDpadRight, MapButton(state.Gamepad.wButtons, XINPUT_GAMEPAD_X));
            Update(EButton::RightDpadDown, MapButton(state.Gamepad.wButtons, XINPUT_GAMEPAD_A));
            Update(EButton::RightDpadLeft, MapButton(state.Gamepad.wButtons, XINPUT_GAMEPAD_B));
            Update(EButton::RightStick, MapButton(state.Gamepad.wButtons, XINPUT_GAMEPAD_RIGHT_THUMB));
            Update(EButton::RightShoulder, MapButton(state.Gamepad.wButtons, XINPUT_GAMEPAD_RIGHT_SHOULDER));
            Update(EButton::RightTrigger, (state.Gamepad.bRightTrigger > XINPUT_GAMEPAD_TRIGGER_THRESHOLD));

            Update(EButton::CenterLeft, MapButton(state.Gamepad.wButtons, XINPUT_GAMEPAD_BACK));
            Update(EButton::CenterMiddle, false);
            Update(EButton::CenterRight, MapButton(state.Gamepad.wButtons, XINPUT_GAMEPAD_START));
        }
        else
        {
            MemZero(m_gamepad);
        }
    }
}
Exemple #28
0
  void BulletImpl::updateData()
  {
    bool _exists = __exists && bwOriginalBullet;
    if ( _exists )
    {
      for(int i = 0; i < 9; ++i)
      {
        PlayerImpl* player = static_cast<PlayerImpl*>(Broodwar->getPlayer(i));

        if ( !bwOriginalBullet->sprite || !player )
          self->isVisible[i] = false;
        else if ( BWAPI::BroodwarImpl.isFlagEnabled(Flag::CompleteMapInformation) )
          self->isVisible[i] = true;
        else
          self->isVisible[i] = Broodwar->isVisible( TilePosition(bwOriginalBullet->sprite->position) );
      }
    }
    else
    {
      MemZero(self->isVisible);
    }

    if ( _exists && 
         (BWAPI::BroodwarImpl.isFlagEnabled(Flag::CompleteMapInformation) ||
          BroodwarImpl.isReplay() || 
          isVisible()) )
    {
      UnitImpl *_getSource = UnitImpl::BWUnitToBWAPIUnit(bwOriginalBullet->sourceUnit);
      UnitImpl *_getTarget = UnitImpl::BWUnitToBWAPIUnit(bwOriginalBullet->attackTarget.pUnit);
      Player   _getPlayer = _getSource ? _getSource->_getPlayer : nullptr;

      // id, player, type, source
      self->id      = id;
      self->player  = (_getSource && _getSource->isAlive && _getPlayer) ? _getPlayer->getID() : -1;
      self->type    = bwOriginalBullet->type;
      self->source  = (_getSource && _getSource->exists()) ? _getSource->getID() : -1;

      // position
      self->positionX = bwOriginalBullet->position.x;
      self->positionY = bwOriginalBullet->position.y;

      // angle, velocity
      int d = (int)bwOriginalBullet->currentDirection - 64;
      if ( d < 0 )
        d += 256;
      self->angle     = (double)d * 3.14159265358979323846 / 128.0;
      self->velocityX = (double)(bwOriginalBullet->current_speed.x / 256.0);
      self->velocityY = (double)(bwOriginalBullet->current_speed.y / 256.0);

      // target, targetPosition
      self->target          = (_getTarget && _getTarget->exists()) ? _getTarget->getID() : -1;
      self->targetPositionX = bwOriginalBullet->targetPosition.x;
      self->targetPositionY = bwOriginalBullet->targetPosition.y;

      // removeTimer
      self->removeTimer = bwOriginalBullet->time_remaining;

      // exists
      self->exists  = true;
    }
    else
    {
      self->id              = -1;
      self->player          = -1;
      self->type            = BulletTypes::Unknown;
      self->source          = -1;
      self->positionX       = Positions::Unknown.x;
      self->positionY       = Positions::Unknown.y;
      self->angle           = 0;
      self->velocityX       = 0;
      self->velocityY       = 0;
      self->target          = -1;
      self->targetPositionX = Positions::Unknown.x;
      self->targetPositionY = Positions::Unknown.y;
      self->removeTimer     = 0;
      self->exists          = false;
    }

  }
Exemple #29
0
  //--------------------------------------------- UPDATE -----------------------------------------------------
  void PlayerImpl::updateData()
  { 
    self->color = index < BW::PLAYER_COUNT ? BW::BWDATA::PlayerColors[index] : Colors::Black;
  
    // Get upgrades, tech, resources
    if ( this->isNeutral() || 
      index >= BW::PLAYER_COUNT ||
         (!BroodwarImpl.isReplay() && 
          BroodwarImpl.self()->isEnemy(this) && 
          !BroodwarImpl.isFlagEnabled(Flag::CompleteMapInformation)) )
    {
      self->minerals           = 0;
      self->gas                = 0;
      self->gatheredMinerals   = 0;
      self->gatheredGas        = 0;
      self->repairedMinerals   = 0;
      self->repairedGas        = 0;
      self->refundedMinerals   = 0;
      self->refundedGas        = 0;

      // Reset values
      MemZero(self->upgradeLevel);
      MemZero(self->hasResearched);
      MemZero(self->isUpgrading);
      MemZero(self->isResearching);
    
      MemZero(self->maxUpgradeLevel);
      MemZero(self->isResearchAvailable);
      MemZero(self->isUnitAvailable);

      if (!this->isNeutral() && index < BW::PLAYER_COUNT)
      {
        // set upgrade level for visible enemy units
        for(int i = 0; i < 46; ++i)
        {
          for(UnitType t : UpgradeType(i).whatUses())
          {
            if ( self->completedUnitCount[t] > 0 )
              self->upgradeLevel[i] = BW::BWDATA::UpgradeLevelSC[index][i];
          }
        }
        for (int i = 46; i < BW::UPGRADE_TYPE_COUNT; ++i)
        {
          for(UnitType t : UpgradeType(i).whatUses())
          {
            if ( self->completedUnitCount[t] > 0 )
              self->upgradeLevel[i] = BW::BWDATA::UpgradeLevelBW[index][i - 46];
          }
        }
      }
    }
    else
    {
      this->wasSeenByBWAPIPlayer = true;

      // set resources
      self->minerals           = BW::BWDATA::PlayerResources.minerals[index];
      self->gas                = BW::BWDATA::PlayerResources.gas[index];
      self->gatheredMinerals   = BW::BWDATA::PlayerResources.cumulativeMinerals[index];
      self->gatheredGas        = BW::BWDATA::PlayerResources.cumulativeGas[index];
      self->repairedMinerals   = this->_repairedMinerals;
      self->repairedGas        = this->_repairedGas;
      self->refundedMinerals   = this->_refundedMinerals;
      self->refundedGas        = this->_refundedGas;

      // set upgrade level
      for(int i = 0; i < 46; ++i)
      {
        self->upgradeLevel[i]     = BW::BWDATA::UpgradeLevelSC[index][i];
        self->maxUpgradeLevel[i]  = BW::BWDATA::UpgradeMaxSC[index][i];
      }
      for (int i = 46; i < BW::UPGRADE_TYPE_COUNT; ++i)
      {
        self->upgradeLevel[i]     = BW::BWDATA::UpgradeLevelBW[index][i - 46];
        self->maxUpgradeLevel[i]  = BW::BWDATA::UpgradeMaxBW[index][i - 46];
      }

      // set abilities researched
      for(int i = 0; i < 24; ++i)
      {
        self->hasResearched[i]        = (TechType(i).whatResearches() == UnitTypes::None ? true : !!BW::BWDATA::TechResearchSC[index][i]);
        self->isResearchAvailable[i]  = !!BW::BWDATA::TechAvailableSC[index][i];
      }
      for (int i = 24; i < BW::TECH_TYPE_COUNT; ++i)
      {
        self->hasResearched[i]        = (TechType(i).whatResearches() == UnitTypes::None ? true : !!BW::BWDATA::TechResearchBW[index][i - 24]);
        self->isResearchAvailable[i]  = !!BW::BWDATA::TechAvailableBW[index][i - 24];
      }

      // set upgrades in progress
      for (int i = 0; i < BW::UPGRADE_TYPE_COUNT; ++i)
        self->isUpgrading[i]   = (BW::BWDATA::UpgradeProgress[index * 8 + i/8] & (1 << i%8)) != 0;
      
      // set research in progress
      for (int i = 0; i < BW::TECH_TYPE_COUNT; ++i)
        self->isResearching[i] = (BW::BWDATA::ResearchProgress[index * 6 + i/8] & (1 << i%8)) != 0;

      for (int i = 0; i < BW::UNIT_TYPE_COUNT; ++i)
        self->isUnitAvailable[i] = !!BW::BWDATA::UnitAvailability[index][i];

      self->hasResearched[TechTypes::Enum::Nuclear_Strike] = self->isUnitAvailable[UnitTypes::Enum::Terran_Nuclear_Missile];
    }

    // Get Scores, supply
    if ( (!BroodwarImpl.isReplay() && 
          BroodwarImpl.self()->isEnemy(this) && 
          !BroodwarImpl.isFlagEnabled(Flag::CompleteMapInformation)) ||
          index >= BW::PLAYER_COUNT)
    {
      MemZero(self->supplyTotal);
      MemZero(self->supplyUsed);
      MemZero(self->deadUnitCount);
      MemZero(self->killedUnitCount);

      self->totalUnitScore      = 0;
      self->totalKillScore      = 0;
      self->totalBuildingScore  = 0;
      self->totalRazingScore    = 0;
      self->customScore         = 0;
    }
    else
    {
      // set supply
      for (u8 i = 0; i < BW::RACE_COUNT; ++i)
      {
        self->supplyTotal[i]  = BW::BWDATA::AllScores.supplies[i].available[index];
        if (self->supplyTotal[i] > BW::BWDATA::AllScores.supplies[i].max[index])
          self->supplyTotal[i]  = BW::BWDATA::AllScores.supplies[i].max[index];
        self->supplyUsed[i]   = BW::BWDATA::AllScores.supplies[i].used[index];
      }
      // set total unit counts
      for (int i = 0; i < BW::UNIT_TYPE_COUNT; ++i)
      {
        self->deadUnitCount[i]   = BW::BWDATA::AllScores.unitCounts.dead[i][index];
        self->killedUnitCount[i] = BW::BWDATA::AllScores.unitCounts.killed[i][index];
      }
      // set macro dead unit counts
      self->deadUnitCount[UnitTypes::AllUnits]    = BW::BWDATA::AllScores.allUnitsLost[index] + BW::BWDATA::AllScores.allBuildingsLost[index];
      self->deadUnitCount[UnitTypes::Men]         = BW::BWDATA::AllScores.allUnitsLost[index];
      self->deadUnitCount[UnitTypes::Buildings]   = BW::BWDATA::AllScores.allBuildingsLost[index];
      self->deadUnitCount[UnitTypes::Factories]   = BW::BWDATA::AllScores.allFactoriesLost[index];

      // set macro kill unit counts
      self->killedUnitCount[UnitTypes::AllUnits]  = BW::BWDATA::AllScores.allUnitsKilled[index] + BW::BWDATA::AllScores.allBuildingsRazed[index];
      self->killedUnitCount[UnitTypes::Men]       = BW::BWDATA::AllScores.allUnitsKilled[index];
      self->killedUnitCount[UnitTypes::Buildings] = BW::BWDATA::AllScores.allBuildingsRazed[index];
      self->killedUnitCount[UnitTypes::Factories] = BW::BWDATA::AllScores.allFactoriesRazed[index];
      
      // set score counts
      self->totalUnitScore      = BW::BWDATA::AllScores.allUnitScore[index];
      self->totalKillScore      = BW::BWDATA::AllScores.allKillScore[index];
      self->totalBuildingScore  = BW::BWDATA::AllScores.allBuildingScore[index];
      self->totalRazingScore    = BW::BWDATA::AllScores.allRazingScore[index];
      self->customScore         = BW::BWDATA::AllScores.customScore[index];
    }

    if (index < BW::PLAYER_COUNT && (BW::BWDATA::Players[index].nType == PlayerTypes::PlayerLeft ||
        BW::BWDATA::Players[index].nType == PlayerTypes::ComputerLeft ||
       (BW::BWDATA::Players[index].nType == PlayerTypes::Neutral && !isNeutral())))
    {
      self->leftGame = true;
    }
  }
Exemple #30
0
NetworkError System::ResolveNetAddress( GChar * outServiceName, GChar * outHostName, const NetAddress * pAddress,
                                        AddressResolveFlags iFlags ) const
{
    Int iNameInfoFlags = 0;
    if ( iFlags & ADDRRESOLVE_FLAG_NUMERIC_SERVICE )
        iNameInfoFlags |= NI_NUMERICSERV;
    if ( iFlags & ADDRRESOLVE_FLAG_NUMERIC_HOST )
        iNameInfoFlags |= NI_NUMERICHOST;
    if ( iFlags & ADDRRESOLVE_FLAG_RELATIVE_NAME )
        iNameInfoFlags |= NI_NOFQDN;
    if ( iFlags & ADDRRESOLVE_FLAG_REQUIRED_NAME )
        iNameInfoFlags |= NI_NAMEREQD;
    if ( iFlags & ADDRRESOLVE_FLAG_DATAGRAM )
        iNameInfoFlags |= NI_DGRAM;

    Int iResult;
    switch( pAddress->iType ) {
        case NETADDRESS_IPv4: {
                const NetAddressIPv4 * pAddr = (const NetAddressIPv4 *)pAddress;

                SOCKADDR_IN sockIPv4;
                MemZero( &sockIPv4, sizeof(SOCKADDR_IN) );
                sockIPv4.sin_family = AF_INET;
                sockIPv4.sin_addr.s_addr = pAddr->Addr.Value;
                sockIPv4.sin_port = pAddr->wPort;

                iResult = GetNameInfo( (const SOCKADDR*)( &sockIPv4 ), sizeof(SOCKADDR_IN),
                                       outHostName, NI_MAXHOST, outServiceName, NI_MAXSERV, iNameInfoFlags );
            } break;
        case NETADDRESS_IPv6: {
                const NetAddressIPv6 * pAddr = (const NetAddressIPv6 *)pAddress;

                SOCKADDR_IN6 sockIPv6;
                MemZero( &sockIPv6, sizeof(SOCKADDR_IN6) );
                sockIPv6.sin6_family = AF_INET6;
                sockIPv6.sin6_flowinfo = pAddr->dwFlowInfo;
                sockIPv6.sin6_scope_id = pAddr->dwScopeID;
                MemCopy( sockIPv6.sin6_addr.s6_addr, pAddr->Addr.Bytes, 16 );
                sockIPv6.sin6_port = pAddr->wPort;

                iResult = GetNameInfo( (const SOCKADDR*)( &sockIPv6 ), sizeof(SOCKADDR_IN6),
                                       outHostName, NI_MAXHOST, outServiceName, NI_MAXSERV, iNameInfoFlags );
            } break;
        default: return NETWORK_ERROR;
    }
    if ( iResult == 0 )
        return NETWORK_OK;

    iResult = WSAGetLastError();
    switch(iResult) {
        case WSAHOST_NOT_FOUND: return NETWORK_HOST_NOT_FOUND;
        case WSATRY_AGAIN:      return NETWORK_RETRY;
        case WSANOTINITIALISED:
        case WSAEAFNOSUPPORT:
        case WSAEINVAL:
        case WSAEFAULT:
        case WSANO_RECOVERY:
        default: break;
    }
    return NETWORK_ERROR;
}