void chkUp(int a[], int pos)
{
	if(pos<=1)  return;
	
	if(a[pos]<a[(int)pos/2])
	{
		iSwap(a, pos, (int)pos/2);
		chkUp(a, (int)pos/2);
	}
}
void iDisplay::SetOrientation(bool bLandscape, bool bLefthander)
{
	if (bLandscape != ((m_Flags&GXLF_LANDSCAPE)>0) ) {
		if (bLandscape)  m_Flags |= GXLF_LANDSCAPE;
		else m_Flags ^= GXLF_LANDSCAPE;
		iSwap(m_Siz.w,m_Siz.h);
		m_BackBuff.Resize(m_Siz);
	}
	if (bLefthander && (m_Flags & GXLF_LHANDER) == 0) m_Flags |= GXLF_LHANDER;
	else if (!bLefthander && (m_Flags & GXLF_LHANDER) != 0) m_Flags ^= GXLF_LHANDER;
}
int extractMin(int a[])
{
	if(numm==0) 
	{
		printf("underfl0w  ");
		return -1;
	}
	
	iSwap(a,1,numm);
	minHeapify(a, numm-1, 1);
	return (a[numm--]);
}
void minHeapify(int a[], int hSize, int pos)
{
	int sm=pos,i,j, left=(2*pos), right=(2*pos+1);
	
	if(a[left]<a[pos] && (left<=hSize))
		sm=left;
	if(a[right]<a[sm] && (right<=hSize))
		sm=right;
		
	if(sm!=pos)
	{
		iSwap(a, pos, sm);
		minHeapify(a, hSize, sm);
	}
}
Exemple #5
0
bool iArmyListEx::Drop()
{
	if (m_pDropItem->m_toCell == -1) {
		LeaveDrop();
		Invalidate();
		return false;
	}

	if (m_pDropItem->m_pSender == m_pDropItem->m_pReceiver && m_pDropItem->m_fromCell == m_pDropItem->m_toCell) {
		// (same cell) do nothing
	} else if (m_pArmy->At(m_pDropItem->m_toCell).Type() == m_pDropItem->m_cGroup.Type()) {
		// (similar type of creatures)
		if (m_pDropItem->m_bSplit) {
			// split mode (show split dialog)
			uint32 flags = iDlg_SplitCreatures::Normal;
			if (m_pDropItem != m_pDragItem){
				if (!m_pDropItem->m_bCanDismiss && m_pDropItem->m_pSender->Army()->GroupCount() <=1) flags |= iDlg_SplitCreatures::SafeG1;
				if (!m_bCanDismiss && m_pArmy->GroupCount() <= 1) flags |= iDlg_SplitCreatures::SafeG2;
			}
			iDlg_SplitCreatures scdlg(m_pMgr, PID_NEUTRAL, m_pDropItem->m_pSender->Army()->At(m_pDropItem->m_fromCell), m_pArmy->At(m_pDropItem->m_toCell), flags);
			scdlg.DoModal();
		} else {
			// normal mode (merge groups)
			m_pArmy->At(m_pDropItem->m_toCell).Count() += m_pDropItem->m_cGroup.Count();
			m_pDropItem->m_pSender->Army()->At(m_pDropItem->m_fromCell).Reset();
		}
	} else {
		if (m_pDropItem->m_bSplit) {
			// show split dialog
			uint32 flags = iDlg_SplitCreatures::Normal;
			if (m_pDropItem != m_pDragItem && !m_pDropItem->m_bCanDismiss && m_pDropItem->m_pSender->Army()->GroupCount() <= 1) flags |= iDlg_SplitCreatures::SafeG1;
			iDlg_SplitCreatures scdlg(m_pMgr, PID_NEUTRAL, m_pDropItem->m_pSender->Army()->At(m_pDropItem->m_fromCell), m_pArmy->At(m_pDropItem->m_toCell), flags);
			scdlg.DoModal();
		} else {
			// swap cells
			iSwap(m_pArmy->At(m_pDropItem->m_toCell),m_pDropItem->m_pSender->Army()->At(m_pDropItem->m_fromCell));
		}
	}
	LeaveDrop();
	Invalidate();
	return true;
}
Exemple #6
0
static int OdSelect(order *od,
                    xlist *elist,
                    int   *node_status,
                    int   *marker,
                    int   *isize,
                    int   *ilink,
                    int   *oinfo,
                    int   *osize,
                    int   x,
                    int   *rsze,
                    int   *rchset,
                    int   *ibuf1,
                    int   *ibuf2,
                    int   *mask2,
                    int   *e,
                    int   *p)
{
  int absorp,old,i,j,n,esze,y,z,l,f,t,stopt,s,
      o,stops,indsze,xdeg,e0,ssze,*slist,tsze,
      *tlist,sze,*adjn,*rbeg,*rexs,*rlen,*rend;
  
  adjn =od->adjn;
  rbeg =od->rbeg;
  rexs =od->rexs;
  rlen =od->rlen;
  rend =od->rend;
  n    =od->nnod;
  slist=ibuf1;
  
  e0 = *e;
  OdArriv(od,node_status,marker,isize,x,&xdeg,rsze,&esze,rchset);
  
  XtDel(elist,x);
  
  OdRenew(od,ilink,x,xdeg,e,p);
  
  for(i=n-esze; i<n; ++i) {
    node_status[rchset[i]]=0;
    marker[rchset[i]]=TRUE;
  }
  
  marker[x]=TRUE;
  iSet(*rsze,TRUE,marker,rchset);
  
  ssze=0;
  for(i=0; i<*rsze;) {
    y=rchset[i];
    
    if (node_status[y]==0||node_status[y]==3)
      ExitProc(SysError,NULL);
    
    f=rbeg[y];
    for(t=f, stopt=f+rend[y]; t<stopt; ++t) {
      z=adjn[t];
      if (node_status[z]==3) {
        adjn[f++]=z;
        
        if (!mask2[z]) {
          slist[ssze++]=z;
          mask2[z]=TRUE;
        }
      }
    }
    rend[y]=f-rbeg[y];
    
    for(stopt=rbeg[y]+rexs[y]; t<stopt; ++t) {
      z=adjn[t];
      if (!marker[z])
        adjn[f++]=z;
    }
    
    rexs[y]=f-rbeg[y];
     
    if (rexs[y]==0) {
      OdRenew(od,ilink,y,xdeg-(*e-e0),e,p);
      node_status[y] = 0;
      marker[y]      = TRUE;
      
      (*rsze)--;
      iSwap(i,*rsze,rchset);
    }
    
    else {
      if (rexs[y]>=rlen[y]) 
        ExitProc(SysError,NULL);
      
      if (rexs[y]>rend[y])
        adjn[rbeg[y]+rexs[y]]=adjn[rbeg[y]+rend[y]];
        
      rexs[y]++;
       
      adjn[rbeg[y]+rend[y]]=x;
      rend[y]++;
      
      i++;
    }
  }
  
  iSet(ssze,FALSE,mask2,slist);
  
  if (*rsze==0) {
    node_status[x]=0;
    marker[x]=TRUE;
  }
  
  else {
    node_status[x]=3;
     
    rend[x]=0;
    rexs[x]=0;
    if (*rsze>rlen[x])
      OdAdd(od,node_status,x,*rsze);
     
    rexs[x]=*rsze;
    iCopy(*rsze,rchset,adjn+rbeg[x]);
    
    tsze=0;
    tlist=ibuf2;
    for(i=0; i<ssze; ++i){
      y=slist[i];
      old=marker[y];
      marker[y]=TRUE;
      
      absorp=TRUE;
        
      indsze=n;
      l=n;
      
      f=rbeg[y];
      for(t=f, stopt=f+rexs[y]; t<stopt; ++t) {
        z=adjn[t];
        if (node_status[z]!=0) {
          adjn[f++]=z;
          
          if (marker[z]) {
            l--;
            slist[l]=z;
            
            if (!mask2[z]) {
              for(s=rbeg[z],stops=rbeg[z]+rexs[z];
                  s<stops &&marker[adjn[s]]; ++s);
              
              if (s==stops) {
                indsze--;
                iSwap(l,indsze,slist);
              }
              
              mask2[z]=TRUE;
              tlist[tsze++]=z;
            }
          }
          else
            absorp=FALSE;
        }
      }
      
      marker[y]=old;
      rexs[y]=f-rbeg[y];
      
      if (indsze<n) {
        z=OdComb(od,node_status,marker,
                 isize,ilink,osize,
                 n-indsze,slist+indsze);
        
        node_status[z]=1;
        
        sze=0;
        for(j=l; j<indsze; ++j) {
          o=slist[j];
          sze+=1+isize[o];
          node_status[o]=2;
          oinfo[o]=z;
        }
        osize[z]=max(osize[z],sze);
      }
      
      if (absorp) {
        node_status[y]=0;
        marker[y]=TRUE;
      }
    }
    
    iSet(tsze,FALSE,mask2,tlist);
  }
  
  marker[x]=(node_status[x]==0);
  
  for(t=0; t<*rsze; ++t) {
    z=rchset[t];
    marker[z]=(node_status[z]==0);
  }
  
  return (FALSE);
} /* OdSelect */