Beispiel #1
0
void GuiContainer::AddBottom(GuiLayer *layer, GuiEffect *effect, bool queue)
{
    Lock();
    LayerTransform transform;
    (void)CancelEffectsInProgress(layer, true, &queue, &transform);
    LayerAdd(layers.end(), true, layer, effect, queue, &transform);
    Unlock();
}
Beispiel #2
0
void GuiContainer::AddTopFixed(GuiLayer *layer, GuiEffect *effect, bool queue)
{
    Lock();
    LayerTransform transform;
    (void)CancelEffectsInProgress(layer, true, &queue, &transform);
    LayerAdd(first_nonfixed, false, layer, effect, queue, &transform);
    Unlock();
}
Beispiel #3
0
bool GuiContainer::AddBehind(GuiLayer *behind, GuiLayer *layer, GuiEffect *effect, bool queue)
{
    Lock();

    LayerTransform transform;
    (void)CancelEffectsInProgress(layer, true, &queue, &transform);
    LayerIndex index = LayerGetIndex(behind);
    if( index != layers.end() ) {
        LayerAdd(++index, true, layer, effect, queue, &transform);
        Unlock();
        return true;
    }

    Unlock();
    return false;
}
Beispiel #4
0
bool CChar::Use_Item_Web( CItem * pItemWeb )
{
	ADDTOCALLSTACK("CChar::Use_Item_Web");
	// IT_WEB
	// IT_EQ_STUCK
	// Try to break out of the web.
	// Or just try to damage it.
	//
	// RETURN: true = held in place.
	//  false = walk thru it.

	if ( GetDispID() == CREID_GIANT_SPIDER || !pItemWeb || !pItemWeb->IsTopLevel() || IsStatFlag(STATF_DEAD|STATF_Insubstantial) || IsPriv(PRIV_GM) )
		return false;	// just walk through it

	// Try to break it.
	int iStr = pItemWeb->m_itWeb.m_Hits_Cur;
	if ( iStr == 0 )
		iStr = pItemWeb->m_itWeb.m_Hits_Cur = 60 + Calc_GetRandVal(250);

	// Since broken webs become spider silk, we should get out of here now if we aren't in a web.
	CItem *pFlag = LayerFind(LAYER_FLAG_Stuck);
	if ( CanMove(pItemWeb, false) )
	{
		if ( pFlag )
			pFlag->Delete();
		return false;
	}

	if ( pFlag )
	{
		if ( pFlag->IsTimerSet() )	// don't allow me to try to damage it too often
			return true;
	}

	int iDmg = pItemWeb->OnTakeDamage(Stat_GetAdjusted(STAT_STR), this);
	switch ( iDmg )
	{
		case 0:			// damage blocked
		case 1:			// web survived
		default:		// unknown
			if ( GetTopPoint() == pItemWeb->GetTopPoint() )		// is character still stuck on the web?
				break;

		case 2:			// web turned into silk
		case INT_MAX:	// web destroyed
			if ( pFlag )
				pFlag->Delete();
			return false;
	}

	// Stuck in it still.
	if ( !pFlag )
	{
		if ( iDmg < 0 )
			return false;

		// First time message.
		pFlag = CItem::CreateBase(ITEMID_WEB1_1);
		ASSERT(pFlag);
		pFlag->SetAttr(ATTR_DECAY);
		pFlag->SetType(IT_EQ_STUCK);
		pFlag->m_uidLink = pItemWeb->GetUID();
		pFlag->SetTimeout(pItemWeb->GetTimerDAdjusted());
		LayerAdd(pFlag, LAYER_FLAG_Stuck);
	}
	else
	{
		if ( iDmg < 0 )
		{
			pFlag->Delete();
			return false;
		}
		SysMessagef(g_Cfg.GetDefaultMsg(DEFMSG_ITEMUSE_SWEB_STUCK), pItemWeb->GetName());
	}

	return true;
}