void DocAccessibleParent::Destroy() { NS_ASSERTION(mChildDocs.IsEmpty(), "why weren't the child docs destroyed already?"); MOZ_ASSERT(!mShutdown); mShutdown = true; uint32_t childDocCount = mChildDocs.Length(); for (uint32_t i = childDocCount - 1; i < childDocCount; i--) mChildDocs[i]->Destroy(); for (auto iter = mAccessibles.Iter(); !iter.Done(); iter.Next()) { MOZ_ASSERT(iter.Get()->mProxy != this); ProxyDestroyed(iter.Get()->mProxy); iter.Remove(); } DocManager::NotifyOfRemoteDocShutdown(this); ProxyDestroyed(this); if (mParentDoc) mParentDoc->RemoveChildDoc(this); else if (IsTopLevel()) GetAccService()->RemoteDocShutdown(this); }
void CItemSpawn::OnTick(bool fExec) { ADDTOCALLSTACK("CitemSpawn:OnTick"); INT64 iMinutes; if ( m_itSpawnChar.m_TimeHiMin <= 0 ) iMinutes = Calc_GetRandLLVal(30) + 1; else iMinutes = minimum(m_itSpawnChar.m_TimeHiMin, m_itSpawnChar.m_TimeLoMin) + Calc_GetRandLLVal(abs(m_itSpawnChar.m_TimeHiMin - m_itSpawnChar.m_TimeLoMin)); if ( iMinutes <= 0 ) iMinutes = 1; if ( !fExec || IsTimerExpired() ) SetTimeout(iMinutes * 60 * TICK_PER_SEC); // set time to check again. if ( !fExec || m_currentSpawned >= GetAmount() ) return; if ( !IsTopLevel() ) return; CResourceDef *pDef = FixDef(); if ( !pDef ) { RESOURCE_ID_BASE rid = IsType(IT_SPAWN_ITEM) ? m_itSpawnItem.m_ItemID : m_itSpawnChar.m_CharID; DEBUG_ERR(("Bad Spawn point uid=0%lx, id=%s\n", static_cast<DWORD>(GetUID()), g_Cfg.ResourceGetName(rid))); return; } if ( IsType(IT_SPAWN_ITEM) ) GenerateItem(pDef); else GenerateChar(pDef); }
void DocAccessibleParent::SetEmulatedWindowHandle(HWND aWindowHandle) { if (!aWindowHandle && mEmulatedWindowHandle && IsTopLevel()) { ::DestroyWindow(mEmulatedWindowHandle); } mEmulatedWindowHandle = aWindowHandle; }
int CItemMulti::Ship_ListObjs( CObjBase ** ppObjList ) { // List all the objects in the structure. // Move the ship and everything on the deck // If too much stuff. then some will fall overboard. hehe. if ( ! IsTopLevel()) return 0; int iMaxDist = Multi_GetMaxDist(); // always list myself first. All other items must see my new region ! int iCount = 0; ppObjList[iCount++] = this; CWorldSearch AreaChar( GetTopPoint(), iMaxDist ); while ( iCount < MAX_MULTI_LIST_OBJS ) { CChar * pChar = AreaChar.GetChar(); if ( pChar == NULL ) break; if ( pChar->IsClient()) { pChar->GetClient()->addPause(); // get rid of flicker. for anyone even seeing this. } if ( ! m_pRegion->IsInside2d( pChar->GetTopPoint())) continue; int zdiff = pChar->GetTopZ() - GetTopZ(); if ( abs( zdiff ) > 3 ) continue; ppObjList[iCount++] = pChar; } CWorldSearch AreaItem( GetTopPoint(), iMaxDist ); while ( iCount < MAX_MULTI_LIST_OBJS ) { CItem * pItem = AreaItem.GetItem(); if ( pItem == NULL ) break; if ( pItem == this ) // already listed. continue; if ( ! Multi_IsPartOf( pItem )) { if ( ! m_pRegion->IsInside2d( pItem->GetTopPoint())) continue; if ( ! pItem->IsMovable()) continue; int zdiff = pItem->GetTopZ() - GetTopZ(); if ( abs( zdiff ) > 3 ) continue; } ppObjList[iCount++] = pItem; } return( iCount ); }
bool CItemStone::SetName( LPCTSTR pszName ) { ADDTOCALLSTACK("CItemStone::SetName"); // If this is a town then set the whole regions name. if ( !CItem::SetName(pszName) ) return false; if ( IsTopLevel() && IsType(IT_STONE_TOWN) ) SetTownName(); return true; }
bool CItemMulti::MultiRealizeRegion() { // Add/move a region for the multi so we know when we are in it. // RETURN: ignored. DEBUG_CHECK( IsType(IT_MULTI) || IsType(IT_SHIP) ); ASSERT( IsTopLevel()); const CItemBaseMulti * pMultiDef = Multi_GetDef(); if ( pMultiDef == NULL ) { DEBUG_ERR(( "Bad Multi type 0%x, uid=0%x\n", GetID(), (DWORD) GetUID())); return false; } if ( m_pRegion == NULL ) { RESOURCE_ID rid; rid.SetPrivateUID( GetUID()); m_pRegion = new CRegionWorld( rid ); } // Get Background region. CPointMap pt = GetTopPoint(); const CRegionWorld * pRegionBack = dynamic_cast <CRegionWorld*> (pt.GetRegion( REGION_TYPE_AREA )); ASSERT( pRegionBack ); ASSERT( pRegionBack != m_pRegion ); // Create the new region rectangle. CRectMap rect; reinterpret_cast<CGRect&>(rect) = pMultiDef->m_rect; rect.OffsetRect( pt.m_x, pt.m_y ); m_pRegion->SetRegionRect( rect ); m_pRegion->m_pt = pt; DWORD dwFlags; if ( IsType(IT_SHIP)) { dwFlags = REGION_FLAG_SHIP; } else { // Houses get some of the attribs of the land around it. dwFlags = pRegionBack->GetRegionFlags(); } dwFlags |= pMultiDef->m_dwRegionFlags; m_pRegion->SetRegionFlags( dwFlags ); TCHAR *pszTemp = Str_GetTemp(); sprintf(pszTemp, "%s (%s)", (LPCTSTR) pRegionBack->GetName(), (LPCTSTR) GetName()); m_pRegion->SetName(pszTemp); return m_pRegion->RealizeRegion(); }
bool Conditional::Endif() { Level *l; if (IsTopLevel()) return false; l = fLevels.RemoveHead(); delete l; return true; }
void CItem::Spawn_GenerateChar( CResourceDef * pDef ) { if ( ! IsTopLevel()) return; // creatures can only be top level. if ( m_itSpawnChar.m_current >= GetAmount()) return; int iComplexity = GetTopSector()->GetCharComplexity(); if ( iComplexity > g_Cfg.m_iMaxCharComplexity ) { DEBUG_MSG(( "Spawn uid=0%lx too complex (%d>%d)\n", GetUID(), iComplexity, g_Cfg.m_iMaxCharComplexity )); return; } int iDistMax = m_itSpawnChar.m_DistMax; RESOURCE_ID_BASE rid = pDef->GetResourceID(); if ( rid.GetResType() == RES_SPAWN ) { const CRandGroupDef * pSpawnGroup = STATIC_CAST <const CRandGroupDef *>(pDef); ASSERT(pSpawnGroup); int i = pSpawnGroup->GetRandMemberIndex(); if ( i >= 0 ) { rid = pSpawnGroup->GetMemberID(i); } } CREID_TYPE id; if ( rid.GetResType() == RES_CHARDEF || rid.GetResType() == RES_UNKNOWN ) { id = (CREID_TYPE) rid.GetResIndex(); } else { return; } CChar * pChar = CChar::CreateNPC( id ); if ( pChar == NULL ) return; ASSERT(pChar->m_pNPC); m_itSpawnChar.m_current ++; pChar->Memory_AddObjTypes( this, MEMORY_ISPAWNED ); // Move to spot "near" the spawn item. pChar->MoveNearObj( this, iDistMax ); if ( iDistMax ) { pChar->m_ptHome = GetTopPoint(); pChar->m_pNPC->m_Home_Dist_Wander = iDistMax; } pChar->Update(); }
void CItemStone::SetTownName() { ADDTOCALLSTACK("CItemStone::SetTownName"); // For town stones. if ( ! IsTopLevel()) return; CRegionBase * pArea = GetTopPoint().GetRegion(( IsType(IT_STONE_TOWN)) ? REGION_TYPE_AREA : REGION_TYPE_ROOM ); if ( pArea ) { pArea->SetName( GetIndividualName()); } }
bool wxWindow::DoDrawBackground(wxDC& dc) { wxRect rect; wxSize size = GetSize(); // Why not GetClientSize() ? rect.x = 0; rect.y = 0; rect.width = size.x; rect.height = size.y; wxWindow * const parent = GetParent(); if ( HasTransparentBackground() && !UseBgCol() && parent ) { // DirectFB paints the parent first, then its child windows, so by // the time this code is called, parent's background was already // drawn and there's no point in (imperfectly!) duplicating the work // here: #ifndef __WXDFB__ wxASSERT( !IsTopLevel() ); wxPoint pos = GetPosition(); AdjustForParentClientOrigin( pos.x, pos.y, 0 ); // Adjust DC logical origin wxCoord org_x, org_y, x, y; dc.GetLogicalOrigin( &org_x, &org_y ); x = org_x + pos.x; y = org_y + pos.y; dc.SetLogicalOrigin( x, y ); // Adjust draw rect rect.x = pos.x; rect.y = pos.y; // Let parent draw the background parent->EraseBackground( dc, rect ); // Restore DC logical origin dc.SetLogicalOrigin( org_x, org_y ); #endif // !__WXDFB__ } else { // Draw background ourselves EraseBackground( dc, rect ); } return true; }
uint64_t DocInfo::FrameID() const { if (mFrameID.isNothing()) { if (IsTopLevel()) { mFrameID.emplace(0); } else { struct Matcher { uint64_t match(Window aWin) { return aWin->WindowID(); } uint64_t match(LoadInfo aLoadInfo) { return aLoadInfo->GetOuterWindowID(); } }; mFrameID.emplace(mObj.match(Matcher())); } } return mFrameID.ref(); }
bool CItemMulti::r_LoadVal( CScript & s ) { LOCKDATA; EXC_TRY(("r_LoadVal('%s %s')", s.GetKey(), s.GetArgStr())); if ( s.IsKeyHead( "REGION.", 7 )) { if ( ! IsTopLevel()) { MoveTo( GetTopPoint()); // Put item on the ground here. } ASSERT( m_pRegion ); CScript script( s.GetKey()+7, s.GetArgStr()); return( m_pRegion->r_LoadVal( script ) ); } return CItem::r_LoadVal(s); EXC_CATCH("CItemMulti"); return false; }
CItem * CItemMulti::Multi_FindItemType( IT_TYPE type ) const { // Find a part of this multi nearby. if ( ! IsTopLevel()) return( NULL ); CWorldSearch Area( GetTopPoint(), Multi_GetMaxDist() ); while (true) { CItem * pItem = Area.GetItem(); if ( pItem == NULL ) return( NULL ); if ( ! Multi_IsPartOf( pItem )) continue; if ( pItem->IsType( type )) return( pItem ); } }
bool wxWindow::DoDrawBackground(wxDC& dc) { wxRect rect; wxSize size = GetSize(); // Why not GetClientSize() ? rect.x = 0; rect.y = 0; rect.width = size.x; rect.height = size.y; wxWindow * const parent = GetParent(); if ( HasTransparentBackground() && parent ) { wxASSERT( !IsTopLevel() ); wxPoint pos = GetPosition(); AdjustForParentClientOrigin( pos.x, pos.y, 0 ); // Adjust DC logical origin wxCoord org_x, org_y, x, y; dc.GetLogicalOrigin( &org_x, &org_y ); x = org_x + pos.x; y = org_y + pos.y; dc.SetLogicalOrigin( x, y ); // Adjust draw rect rect.x = pos.x; rect.y = pos.y; // Let parent draw the background parent->EraseBackground( dc, rect ); // Restore DC logical origin dc.SetLogicalOrigin( org_x, org_y ); } else { // Draw background ourselves EraseBackground( dc, rect ); } return true; }
void CItemSpawn::GenerateChar(CResourceDef *pDef) { ADDTOCALLSTACK("CitemSpawn:GenerateChar"); if ( !IsTopLevel() ) return; RESOURCE_ID_BASE rid = pDef->GetResourceID(); if ( rid.GetResType() == RES_SPAWN ) { const CRandGroupDef *pSpawnGroup = static_cast<const CRandGroupDef *>(pDef); ASSERT(pSpawnGroup); size_t i = pSpawnGroup->GetRandMemberIndex(); if ( i != pSpawnGroup->BadMemberIndex() ) rid = pSpawnGroup->GetMemberID(i); } if ( (rid.GetResType() != RES_CHARDEF) && (rid.GetResType() != RES_UNKNOWN) ) return; CChar *pChar = CChar::CreateBasic(static_cast<CREID_TYPE>(rid.GetResIndex())); if ( !pChar ) return; CPointMap pt = GetTopPoint(); pChar->NPC_LoadScript(true); pChar->StatFlag_Set(STATF_Spawned); pChar->MoveTo(pt); // Check if the NPC can spawn in this region CRegionBase *pRegion = GetTopPoint().GetRegion(REGION_TYPE_AREA); if ( !pRegion || (pRegion->IsGuarded() && pChar->Noto_IsEvil()) ) { pChar->Delete(); return; } AddObj(pChar->GetUID()); pChar->NPC_CreateTrigger(); // removed from NPC_LoadScript() and triggered after char placement and attachment to the spawnitem pChar->Update(); size_t iCount = GetTopSector()->GetCharComplexity(); if ( iCount > g_Cfg.m_iMaxCharComplexity ) g_Log.Event(LOGL_WARN, "%d chars at %s. Sector too complex!\n", iCount, GetTopSector()->GetBasePoint().WriteUsed()); }
void EDA_BASE_FRAME::SetModalMode( bool aModal ) { // Disable all other windows #if wxCHECK_VERSION(2, 9, 4) if( IsTopLevel() ) { wxWindowList::compatibility_iterator node = wxTopLevelWindows.GetFirst(); while( node ) { wxWindow* win = node->GetData(); if( win != this ) win->Enable( !aModal ); node = node->GetNext(); } } #else // Deprecated since wxWidgets 2.9.4 MakeModal( aModal ); #endif }
bool CItemMulti::r_Verb( CScript & s, CTextConsole * pSrc ) // Execute command from script { LOCKDATA; EXC_TRY(("r_Verb('%s %s',%x)", s.GetKey(), s.GetArgStr(), pSrc)); // Speaking in this ships region. // return: true = command for the ship. //"One (direction*)", " (Direction*), one" Moves ship one tile in desired direction and stops. //"Slow (direction*)" Moves ship slowly in desired direction (see below for possible directions). int iCmd = FindTableSorted( s.GetKey(), sm_szVerbKeys, COUNTOF( sm_szVerbKeys )-1 ); if ( iCmd < 0 ) { return( CItem::r_Verb( s, pSrc )); } if ( ! pSrc ) return( false ); switch ( iCmd ) { case SHV_MULTICREATE: { CGrayUID uid( s.GetArgVal() ); CChar * pSrc = uid.CharFind(); Multi_Create( pSrc, 0 ); } return true; } if ( IsAttr(ATTR_MOVE_NEVER) || ! IsTopLevel() ) return false; CChar * pChar = pSrc->GetChar(); // Only key holders can command the ship ??? // if ( pChar && pChar->ContentFindKeyFor( pItem )) // Find the tiller man object. CItem * pTiller = Multi_GetSign(); ASSERT( pTiller ); // Get current facing dir. DIR_TYPE DirFace = sm_Ship_FaceDir[ Ship_GetFaceOffset() ]; int DirMoveChange; LPCTSTR pszSpeak = NULL; switch ( iCmd ) { case SHV_SHIPSTOP: // "Furl sail" // "Stop" Stops current ship movement. if ( ! m_itShip.m_fSail ) return( false ); Ship_Stop(); break; case SHV_SHIPFACE: // Face this direction. do not change the direction of movement. if ( ! s.HasArgs()) return( false ); return Ship_Face( GetDirStr( s.GetArgStr())); case SHV_SHIPMOVE: // Move one space in this direction. // Does NOT protect against exploits ! if ( ! s.HasArgs()) return( false ); m_itShip.m_DirMove = GetDirStr( s.GetArgStr()); return Ship_Move( (DIR_TYPE) m_itShip.m_DirMove ); case SHV_SHIPGATE: // Move the whole ship and contents to another place. if ( ! s.HasArgs()) return( false ); { CPointMap ptdelta = g_Cfg.GetRegionPoint( s.GetArgStr()); if ( ! ptdelta.IsValidPoint()) return( false ); ptdelta -= GetTopPoint(); return Ship_MoveDelta( ptdelta ); } break; case SHV_SHIPTURNLEFT: // "Port", // "Turn Left", DirMoveChange = -2; doturn: if ( m_itShip.m_fAnchored ) { anchored: pszSpeak = "The anchor is down <SEX Sir/Mam>!"; break; } m_itShip.m_DirMove = GetDirTurn( DirFace, DirMoveChange ); Ship_Face( (DIR_TYPE) m_itShip.m_DirMove ); break; case SHV_SHIPTURNRIGHT: // "Turn Right", // "Starboard", // Turn Right DirMoveChange = 2; goto doturn; case SHV_SHIPDRIFTLEFT: // "Left", // "Drift Left", DirMoveChange = -2; dodirmovechange: if ( m_itShip.m_fAnchored ) goto anchored; if ( ! Ship_SetMoveDir( GetDirTurn( DirFace, DirMoveChange ))) return( false ); break; case SHV_SHIPDRIFTRIGHT: // "Right", // "Drift Right", DirMoveChange = 2; goto dodirmovechange; case SHV_SHIPBACK: // "Back", // Move ship backwards // "Backward", // Move ship backwards // "Backwards", // Move ship backwards DirMoveChange = 4; goto dodirmovechange; case SHV_SHIPFORE: // "Forward" // "Foreward", // Moves ship forward. // "Unfurl sail", // Moves ship forward. DirMoveChange = 0; goto dodirmovechange; case SHV_SHIPFORELEFT: // "Forward left", DirMoveChange = -1; goto dodirmovechange; case SHV_SHIPFORERIGHT: // "forward right", DirMoveChange = 1; goto dodirmovechange; case SHV_SHIPBACKLEFT: // "backward left", // "back left", DirMoveChange = -3; goto dodirmovechange; case SHV_SHIPBACKRIGHT: // "backward right", // "back right", DirMoveChange = 3; goto dodirmovechange; case SHV_SHIPANCHORRAISE: // "Raise Anchor", if ( ! m_itShip.m_fAnchored ) { pszSpeak = "The anchor is already up <SEX Sir/Mam>"; break; } m_itShip.m_fAnchored = false; break; case SHV_SHIPANCHORDROP: // "Drop Anchor", if ( m_itShip.m_fAnchored ) { pszSpeak = "The anchor is already down <SEX Sir/Mam>"; break; } m_itShip.m_fAnchored = true; Ship_Stop(); break; case SHV_SHIPTURN: // "Turn around", // Turns ship around and proceeds. // "Come about", // Turns ship around and proceeds. DirMoveChange = 4; goto doturn; case SHV_SHIPUP: // "Up" { if ( ! IsAttr(ATTR_MAGIC )) return( false ); CPointMap pt; pt.m_z = PLAYER_HEIGHT; if ( Ship_MoveDelta( pt )) { pszSpeak = "As you command <SEX Sir/Mam>"; } else { pszSpeak = "Can't do that <SEX Sir/Mam>"; } } break; case SHV_SHIPDOWN: // "Down" { if ( ! IsAttr(ATTR_MAGIC )) return( false ); CPointMap pt; pt.m_z = -PLAYER_HEIGHT; if ( Ship_MoveDelta( pt )) { pszSpeak = "As you command <SEX Sir/Mam>"; } else { pszSpeak = "Can't do that <SEX Sir/Mam>"; } } break; case SHV_SHIPLAND: // "Land" { if ( ! IsAttr(ATTR_MAGIC )) return( false ); signed char zold = GetTopZ(); CPointMap pt = GetTopPoint(); pt.m_z = zold; SetTopZ( -UO_SIZE_Z ); // bottom of the world where i won't get in the way. WORD wBlockFlags = CAN_I_WATER; signed char z = g_World.GetHeightPoint( pt, wBlockFlags ); SetTopZ( zold ); // restore z for now. pt.InitPoint(); pt.m_z = z - zold; if ( pt.m_z ) { Ship_MoveDelta( pt ); pszSpeak = "As you command <SEX Sir/Mam>"; } else { pszSpeak = "We have landed <SEX Sir/Mam>"; } } break; default: return( false ); } if ( pChar ) { if ( pszSpeak == NULL ) { static LPCTSTR const sm_pszAye[] = { "Aye", "Aye Cap'n", "Aye <SEX Sir/Mam>", }; pszSpeak = sm_pszAye[ Calc_GetRandVal( COUNTOF( sm_pszAye )) ]; } TCHAR szText[ MAX_TALK_BUFFER ]; strcpy( szText, pszSpeak ); pChar->ParseText( szText, &g_Serv ); pTiller->Speak( szText, 0, TALKMODE_SAY, FONT_NORMAL ); } return false; EXC_CATCH("CItemMulti"); return true; }
bool CItemMulti::Ship_Face( DIR_TYPE dir ) { // Change the direction of the ship. ASSERT( IsTopLevel()); DEBUG_CHECK( m_pRegion ); if ( m_pRegion == NULL ) { return false; } int i=0; for ( ; true; i++ ) { if ( i >= COUNTOF(sm_Ship_FaceDir)) return( false ); if ( dir == sm_Ship_FaceDir[i] ) break; } int iFaceOffset = Ship_GetFaceOffset(); ITEMID_TYPE idnew = (ITEMID_TYPE) ( GetID() - iFaceOffset + i ); const CItemBaseMulti * pMultiNew = Multi_GetDef( idnew ); if ( pMultiNew == NULL ) { return false; } const CItemBaseMulti * pMultiDef = Multi_GetDef(); ASSERT( pMultiDef); int iTurn = dir - sm_Ship_FaceDir[ iFaceOffset ]; // ?? Are there blocking items in the way of the turn ? // CRectMap // Reorient everything on the deck CObjBase * ppObjs[MAX_MULTI_LIST_OBJS+1]; int iCount = Ship_ListObjs( ppObjs ); int i2 = 0; for ( i=0; i<iCount; i++ ) { CObjBase * pObj = ppObjs[i]; CPointMap pt = pObj->GetTopPoint(); if ( pObj->IsItem()) { CItem * pItem = STATIC_CAST <CItem*> (pObj); ASSERT( pItem ); if ( pItem == this ) { m_pRegion->UnRealizeRegion(); pItem->SetID(idnew); // Adjust the region to be the new shape/area. MultiRealizeRegion(); pItem->Update(); continue; } // Is this a ship component ? transform it. //int i = Multi_IsComponentOf( pItem ); if ( Multi_IsPartOf( pItem ) ) //i>=0 ) { pItem->SetDispID( pMultiNew->m_Components[i2].m_id ); pt = GetTopPoint(); pt.m_x += pMultiNew->m_Components[i2].m_dx; pt.m_y += pMultiNew->m_Components[i2].m_dy; pt.m_z += pMultiNew->m_Components[i2].m_dz; pItem->MoveTo( pt ); i2++; continue; } } // -2,6 = left. // +2,-6 = right. // +-4 = flip around int iTmp; int xdiff = GetTopPoint().m_x - pt.m_x; int ydiff = GetTopPoint().m_y - pt.m_y; switch ( iTurn ) { case 2: // right case (2-DIR_QTY): iTmp = xdiff; xdiff = ydiff; ydiff = -iTmp; break; case -2: // left. case (DIR_QTY-2): iTmp = xdiff; xdiff = -ydiff; ydiff = iTmp; break; default: // u turn. xdiff = -xdiff; ydiff = -ydiff; break; } pt.m_x = GetTopPoint().m_x + xdiff; pt.m_y = GetTopPoint().m_y + ydiff; pObj->MoveTo( pt ); if ( pObj->IsChar()) { // Turn creatures as well. CChar * pChar = STATIC_CAST <CChar*> (pObj); ASSERT(pChar); pChar->m_dirFace = GetDirTurn( pChar->m_dirFace, iTurn ); pChar->RemoveFromView(); pChar->Update(); } } m_itShip.m_DirFace = dir; return( true ); }
void DocAccessibleParent::Destroy() { // If we are already shutdown that is because our containing tab parent is // shutting down in which case we don't need to do anything. if (mShutdown) { return; } mShutdown = true; MOZ_DIAGNOSTIC_ASSERT(LiveDocs().Contains(mActorID)); uint32_t childDocCount = mChildDocs.Length(); for (uint32_t i = 0; i < childDocCount; i++) { for (uint32_t j = i + 1; j < childDocCount; j++) { MOZ_DIAGNOSTIC_ASSERT(mChildDocs[i] != mChildDocs[j]); } } // XXX This indirection through the hash map of live documents shouldn't be // needed, but be paranoid for now. int32_t actorID = mActorID; for (uint32_t i = childDocCount - 1; i < childDocCount; i--) { DocAccessibleParent* thisDoc = LiveDocs().Get(actorID); MOZ_ASSERT(thisDoc); if (!thisDoc) { return; } thisDoc->ChildDocAt(i)->Destroy(); } for (auto iter = mAccessibles.Iter(); !iter.Done(); iter.Next()) { MOZ_ASSERT(iter.Get()->mProxy != this); ProxyDestroyed(iter.Get()->mProxy); iter.Remove(); } DocAccessibleParent* thisDoc = LiveDocs().Get(actorID); MOZ_ASSERT(thisDoc); if (!thisDoc) { return; } // The code above should have already completely cleared these, but to be // extra safe make sure they are cleared here. thisDoc->mAccessibles.Clear(); thisDoc->mChildDocs.Clear(); DocManager::NotifyOfRemoteDocShutdown(thisDoc); thisDoc = LiveDocs().Get(actorID); MOZ_ASSERT(thisDoc); if (!thisDoc) { return; } ProxyDestroyed(thisDoc); thisDoc = LiveDocs().Get(actorID); MOZ_ASSERT(thisDoc); if (!thisDoc) { return; } if (DocAccessibleParent* parentDoc = thisDoc->ParentDoc()) parentDoc->RemoveChildDoc(thisDoc); else if (IsTopLevel()) GetAccService()->RemoteDocShutdown(this); }
bool Parser::FeedChar(Environment &env, char ch) { BeginPushbackRegion(ch); //::printf("%p ch=%c, stat=%d\n", this, ch, _stat); switch (_stat) { case STAT_Init: { if (ch == ' ' || ch == '\t' || ch == '\n' || ch == '\0') { // nothing to do } else { Pushback(ch); _str.clear(); _stat = STAT_String; } break; } case STAT_String: { if (ch == '\0') { FlushElemString(_str.c_str()); _str.clear(); } else if (IsCommandMark(ch)) { _cmdName.clear(); _stat = STAT_AcceptCommandInString; } else { _str += ch; } break; } case STAT_AcceptCommandInString: { if (IsCommandEnd(_cmdName, ch)) { if (_cmdName.empty()) { env.SetError(ERR_SyntaxError, "command name is not specified"); return false; } const CommandFormat *pCmdFmt = CommandFormat::Lookup(_cmdName.c_str()); if (pCmdFmt == nullptr) { // custom command FlushElemString(_str.c_str()); _stat = STAT_CommandCustom; } else { // special command if (pCmdFmt->IsVisual() || !IsBlank(_str.c_str())) { FlushElemString(_str.c_str()); } _pElemCmdCur.reset(new Elem_Command(pCmdFmt)); _stat = STAT_CommandSpecial; } _str.clear(); Pushback(ch); } else { _cmdName += ch; } break; } case STAT_AcceptCommandInArgLine: case STAT_AcceptCommandInArgPara: { if (_pParserChild.get() != nullptr) { if (!_pParserChild->FeedChar(env, ch)) return false; if (_pParserChild->IsComplete()) { AutoPtr<Elem_Text> pElemResult( new Elem_Text(_pParserChild->GetElemOwner().Reference())); _pElemArg->GetElemChildren().AddElem(pElemResult->ReduceContent()->Reference()); _pParserChild.reset(); _stat = (_stat == STAT_AcceptCommandInArgLine)? STAT_ArgLine : STAT_ArgPara; } } else if (IsCommandEnd(_cmdName, ch)) { if (_cmdName.empty()) { env.SetError(ERR_SyntaxError, "command name is not specified"); return false; } const CommandFormat *pCmdFmt = CommandFormat::Lookup(_cmdName.c_str()); if (pCmdFmt == nullptr) { // custom command _pParserChild.reset(new Parser(_pAliases, this)); _pParserChild->SetCommandCustom(_cmdName.c_str()); Pushback(ch); } else if (pCmdFmt->IsSectionIndicator()) { if (_stat == STAT_AcceptCommandInArgLine || _stat == STAT_AcceptCommandInArgCustom) { env.SetError(ERR_SyntaxError, "section indicator can not appear in line argument"); return false; } // finish the previous command if (!_strArg.empty()) { _pElemArg->GetElemChildren().AddElem(new Elem_String(_strArg)); _strArg.clear(); } _pElemCmdCur->GetElemArgs().AddElem(_pElemArg->ReduceContent()->Reference()); FlushElemCommand(_pElemCmdCur.release()); // special command (section indicator) _pElemCmdCur.reset(new Elem_Command(pCmdFmt)); Pushback(ch); _stat = STAT_CommandSpecial; } else { // special command (not section indicator) _pParserChild.reset(new Parser(_pAliases, this)); _pParserChild->SetCommandSpecial(pCmdFmt); } } else { _cmdName += ch; } break; } case STAT_AcceptCommandInArgCustom: { if (_pParserChild.get() != nullptr) { if (!_pParserChild->FeedChar(env, ch)) return false; if (_pParserChild->IsComplete()) { _strArg += _pParserChild->GetString(); _pParserChild.reset(); _stat = STAT_ArgCustom; } } else if (IsCommandEnd(_cmdName, ch)) { if (_cmdName.empty()) { env.SetError(ERR_SyntaxError, "command name is not specified"); return false; } const CommandFormat *pCmdFmt = CommandFormat::Lookup(_cmdName.c_str()); if (pCmdFmt == nullptr) { // custom command _pParserChild.reset(new Parser(_pAliases, this)); _pParserChild->SetCommandCustom(_cmdName); Pushback(ch); } else { // special command _strArg += _chAhead; _strArg += _cmdName; _stat = STAT_ArgCustom; } } else { _cmdName += ch; } break; } case STAT_CommandSpecial: { Pushback(ch); _strArg.clear(); _stat = STAT_NextArg; break; } case STAT_NextArg: { if (_pElemCmdCur->HasCompletedArg()) { FlushElemCommand(_pElemCmdCur.release()); Pushback(ch); _str.clear(); _stat = IsTopLevel()? STAT_String : STAT_Complete; break; } const CommandFormat::Arg *pArg = _pElemCmdCur->GetCurrentArg(); Pushback(ch); _stat = (pArg->IsWord() || pArg->IsWordOpt())? STAT_ArgWordPre : pArg->IsBracket()? STAT_ArgBracketPre : (pArg->IsLine() || pArg->IsLineOpt())? STAT_ArgLinePre : (pArg->IsQuote() || pArg->IsQuoteOpt())? STAT_ArgQuotePre : (pArg->IsBrace() || pArg->IsBraceOpt())? STAT_ArgBracePre : pArg->IsPara()? STAT_ArgParaPre : STAT_Complete; // this must not happen break; } case STAT_ArgWordPre: { if (ch == ' ' || ch == '\t') { // nothing to do } else if (ch == '\n' || ch == '\0' || IsCommandMark(ch)) { const CommandFormat::Arg *pArg = _pElemCmdCur->GetCurrentArg(); if (pArg->IsWord()) { env.SetError(ERR_SyntaxError, "argument %s doesn't exist", pArg->GetName()); return false; } Pushback(ch); _pElemCmdCur->GetElemArgs().AddElem(new Elem_Empty()); _stat = STAT_NextArg; } else if (ch == '"') { _strArg.clear(); _stat = STAT_ArgWordQuote; } else { _strArg.clear(); Pushback(ch); _stat = STAT_ArgWord; } break; } case STAT_ArgWord: { if (ch == ' ' || ch == '\t' || ch == '\n' || ch == '\0' || IsCommandMark(ch)) { Pushback(ch); _pElemCmdCur->GetElemArgs().AddElem(new Elem_String(_strArg)); _strArg.clear(); _stat = STAT_NextArg; } else if (ch == '.' || ch == ',' || ch == ';' || ch == '?' || ch == '!') { _chAhead = ch; _stat = STAT_ArgWord_Punctuation; } else { _strArg += ch; } break; } case STAT_ArgWord_Punctuation: { if (ch == ' ' || ch == '\t' || ch == '\n' || ch == '\0' || IsCommandMark(ch)) { Pushback(ch); Pushback(_chAhead); _pElemCmdCur->GetElemArgs().AddElem(new Elem_String(_strArg)); _strArg.clear(); _stat = STAT_NextArg; } else { Pushback(ch); _strArg += _chAhead; _stat = STAT_ArgWord; } break; } case STAT_ArgWordQuote: { if (ch == '\n' || ch == '\0') { Pushback(ch); _pElemCmdCur->GetElemArgs().AddElem(new Elem_String(_strArg)); _strArg.clear(); _stat = STAT_NextArg; } else if (ch == '"') { _pElemCmdCur->GetElemArgs().AddElem(new Elem_String(_strArg)); _strArg.clear(); _stat = STAT_NextArg; } else { _strArg += ch; } break; } case STAT_ArgBracketPre: { if (ch == ' ' || ch == '\t') { // nothing to do } else if (ch == '[') { _strArg.clear(); _stat = STAT_ArgBracket; } else { // including '\0' Pushback(ch); _pElemCmdCur->GetElemArgs().AddElem(new Elem_Empty()); _stat = STAT_NextArg; } break; } case STAT_ArgBracket: { if (ch == '\n' || ch == '\0' || IsCommandMark(ch)) { env.SetError(ERR_SyntaxError, "unmatched brakcet mark"); return false; } else if (ch == ']') { _pElemCmdCur->GetElemArgs().AddElem(new Elem_String(_strArg)); _strArg.clear(); _stat = STAT_NextArg; } else { _strArg += ch; } break; } case STAT_ArgLinePre: { if (ch == ' ' || ch == '\t') { // nothing to do } else { _pElemArg.reset(new Elem_Text()); Pushback(ch); _strArg.clear(); _stat = STAT_ArgLine; } break; } case STAT_ArgLine: { if (ch == '\n' || ch == '\0') { if (ch == '\0') Pushback(ch); String str = Strip(_strArg.c_str()); if (!str.empty()) { _pElemArg->GetElemChildren().AddElem(new Elem_String(str)); } _strArg.clear(); _pElemCmdCur->GetElemArgs().AddElem(_pElemArg->ReduceContent()->Reference()); _stat = STAT_NextArg; } else if (IsCommandMark(ch)) { String str = Strip(_strArg.c_str()); if (!str.empty()) { _pElemArg->GetElemChildren().AddElem(new Elem_String(str)); } _strArg.clear(); _cmdName.clear(); _stat = STAT_AcceptCommandInArgLine; } else { _strArg += ch; } break; } case STAT_ArgQuotePre: { if (ch == ' ' || ch == '\t') { // nothing to do } else if (ch == '"') { _strArg.clear(); _stat = STAT_ArgQuote; } else { // including '\0' const CommandFormat::Arg *pArg = _pElemCmdCur->GetCurrentArg(); if (pArg->IsQuote()) { env.SetError(ERR_SyntaxError, "quoted string is expected"); return false; } Pushback(ch); if (_chPrev == ' ' || _chPrev == '\t') Pushback(_chPrev); _pElemCmdCur->GetElemArgs().AddElem(new Elem_Empty()); _stat = STAT_NextArg; } break; } case STAT_ArgQuote: { if (ch == '\n' || ch == '\0') { env.SetError(ERR_SyntaxError, "quoted string doesn't end correctly"); return false; } else if (ch == '"') { _pElemCmdCur->GetElemArgs().AddElem(new Elem_String(_strArg)); _strArg.clear(); _stat = STAT_NextArg; } else { _strArg += ch; } break; } case STAT_ArgBracePre: { if (ch == ' ' || ch == '\t') { // nothing to do } else if (ch == '{') { _strArg.clear(); _stat = STAT_ArgBrace; } else { // include '\0' const CommandFormat::Arg *pArg = _pElemCmdCur->GetCurrentArg(); if (pArg->IsBrace()) { env.SetError(ERR_SyntaxError, "braced string is expected"); return false; } Pushback(ch); _pElemCmdCur->GetElemArgs().AddElem(new Elem_Empty()); _stat = STAT_NextArg; } break; } case STAT_ArgBrace: { if (ch == '\n' || ch == '\0') { env.SetError(ERR_SyntaxError, "braced string doesn't end correctly"); return false; } else if (ch == '}') { _pElemCmdCur->GetElemArgs().AddElem(new Elem_String(_strArg)); _strArg.clear(); _stat = STAT_NextArg; } else { _strArg += ch; } break; } case STAT_ArgParaPre: { if (ch == ' ' || ch == '\t') { // nothing to do } else { _pElemArg.reset(new Elem_Text()); Pushback(ch); _strArg.clear(); _stat = STAT_ArgPara; } break; } case STAT_ArgPara: { if (ch == '\n') { _strArg += ch; _strAhead.clear(); _stat = STAT_ArgParaNewline; } else if (ch == '\0') { Pushback(ch); if (!_strArg.empty()) { _pElemArg->GetElemChildren().AddElem(new Elem_String(_strArg)); _strArg.clear(); } _pElemCmdCur->GetElemArgs().AddElem(_pElemArg->ReduceContent()->Reference()); _stat = STAT_NextArg; } else if (IsCommandMark(ch)) { if (!_strArg.empty()) { _pElemArg->GetElemChildren().AddElem(new Elem_String(_strArg)); _strArg.clear(); } _cmdName.clear(); _stat = STAT_AcceptCommandInArgPara; } else { _strArg += ch; } break; } case STAT_ArgParaNewline: { if (ch == '\n') { // detected a blank line if (!_strArg.empty()) { _pElemArg->GetElemChildren().AddElem(new Elem_String(_strArg)); _strArg.clear(); } _pElemCmdCur->GetElemArgs().AddElem(_pElemArg->ReduceContent()->Reference()); _stat = STAT_NextArg; } else if (ch == ' ' || ch == '\t') { _strAhead += ch; } else { // including '\0' _strArg += _strAhead; Pushback(ch); _stat = STAT_ArgPara; } break; } case STAT_CommandCustom: { if (ch == '{') { _strArg.clear(); _stat = STAT_ArgCustom; } else { _strArg.clear(); String rtn = EvaluateCustomCommand(env); if (env.IsSignalled()) return false; _strArgs.clear(); _strArg.clear(); _str.clear(); _stat = STAT_String; foreach (String, p, rtn) { if (!FeedChar(env, *p)) return false; } if (!IsTopLevel()) _stat = STAT_Complete; Pushback(ch); } break; } case STAT_ArgCustom: { if (ch == '}') { _strArgs.push_back(_strArg); String rtn = EvaluateCustomCommand(env); if (env.IsSignalled()) return false; _strArgs.clear(); _strArg.clear(); _str.clear(); _stat = STAT_String; foreach (String, p, rtn) { if (!FeedChar(env, *p)) return false; } if (!IsTopLevel()) _stat = STAT_Complete; } else if (ch == ',') { _strArgs.push_back(_strArg); _strArg.clear(); } else if (ch == '\\') { _stat = STAT_ArgCustom_Backslash; } else if (IsCommandMark(ch)) { _cmdName.clear(); _chAhead = ch; _stat = STAT_AcceptCommandInArgCustom; } else if (ch == '\0') { // nothing to do } else { _strArg += ch; } break; }
void CItemSpawn::GenerateChar(CResourceDef * pDef) { ADDTOCALLSTACK("CitemSpawn:GenerateChar"); if ( !IsTopLevel() || ( m_itSpawnChar.m_current >= GetAmount() ) || ( GetTopSector()->GetCharComplexity() > g_Cfg.m_iMaxCharComplexity )) return; int iDistMax = m_itSpawnChar.m_DistMax; RESOURCE_ID_BASE rid = pDef->GetResourceID(); if ( rid.GetResType() == RES_SPAWN ) { const CRandGroupDef * pSpawnGroup = STATIC_CAST <const CRandGroupDef *>(pDef); ASSERT(pSpawnGroup); size_t i = pSpawnGroup->GetRandMemberIndex(); if ( i != pSpawnGroup->BadMemberIndex() ) { rid = pSpawnGroup->GetMemberID(i); } } if (( rid.GetResType() != RES_CHARDEF ) && ( rid.GetResType() != RES_UNKNOWN )) return; CREID_TYPE id = static_cast<CREID_TYPE>(rid.GetResIndex()); bool isBadPlaceToSpawn = false; CChar * pChar = CChar::CreateBasic(id); if( pChar == NULL ) { return; } pChar->NPC_LoadScript(true); AddObj(pChar->GetUID()); pChar->m_uidSpawnItem = GetUID(); // SpawnItem for this char pChar->StatFlag_Set( STATF_Spawned ); pChar->MoveTo(GetTopPoint()); pChar->NPC_CreateTrigger(); //Removed from NPC_LoadScript() and triggered after char placement if( pChar->GetRegion() == NULL ) { isBadPlaceToSpawn = true; } else if( pChar->GetRegion()->IsGuarded() && pChar->Noto_IsEvil() ) { isBadPlaceToSpawn = true; } // Deny definitely known a bad place to spawn (like red NPCs in guarded areas) // Usually caused by wide range near the edge of the towns if( isBadPlaceToSpawn ) { pChar->Delete(); //m_itSpawnChar.m_current--; return; } ASSERT(pChar->m_pNPC); if ( iDistMax ) { pChar->m_ptHome = GetTopPoint(); pChar->m_pNPC->m_Home_Dist_Wander = static_cast<WORD>(iDistMax); } pChar->Update(); }
void CItemMulti::Multi_Create( CChar * pChar, DWORD dwKeyCode ) { // Create house or Ship extra stuff. // ARGS: // dwKeyCode = set the key code for the doors/sides to this in case it's a drydocked ship. // NOTE: // This can only be done after the house is given location. const CItemBaseMulti * pMultiDef = Multi_GetDef(); // We are top level. if ( pMultiDef == NULL || ! IsTopLevel()) return; if ( dwKeyCode == UID_CLEAR ) dwKeyCode = GetUID(); // ??? SetTimeout( GetDecayTime()); house decay ? bool fNeedKey = false; int iQty = pMultiDef->m_Components.GetCount(); for ( int i=0; i<iQty; i++ ) { fNeedKey |= Multi_CreateComponent( (ITEMID_TYPE) pMultiDef->m_Components[i].m_id, pMultiDef->m_Components[i].m_dx, pMultiDef->m_Components[i].m_dy, pMultiDef->m_Components[i].m_dz, dwKeyCode ); } #if 0 const CGrayMulti * pMultiMul = g_World.GetMultiItemDefs( GetDispID()); if ( pMultiMul ) { iQty = pMultiMul->GetItemCount(); for ( int i=0; iQty--; i++ ) { const CUOMultiItemRec * pMultiItem = pMultiMul->GetItem(i); ASSERT(pMultiItem); if ( pMultiItem->m_visible ) // client side. continue; fNeedKey |= Multi_CreateComponent( pMultiItem->GetDispID(), pMultiItem->m_dx, pMultiItem->m_dy, pMultiItem->m_dz, dwKeyCode ); } } #endif CItem * pKey = NULL; if ( fNeedKey ) { // Create the key to the door. ITEMID_TYPE id = IsAttr(ATTR_MAGIC) ? ITEMID_KEY_MAGIC : ITEMID_KEY_COPPER ; pKey = CreateScript( id, pChar ); ASSERT(pKey); pKey->SetType(IT_KEY); if ( g_Cfg.m_fAutoNewbieKeys ) pKey->SetAttr(ATTR_NEWBIE); pKey->SetAttr(m_Attr&ATTR_MAGIC); pKey->m_itKey.m_lockUID.SetPrivateUID( dwKeyCode ); pKey->m_uidLink = GetUID(); } Multi_GetSign(); // set the m_uidLink if ( pChar != NULL ) { m_itShip.m_UIDCreator = pChar->GetUID(); CItemMemory * pMemory = pChar->Memory_AddObjTypes( this, MEMORY_GUARD ); if ( pKey ) { // Put in your pack pChar->GetPackSafe()->ContentAdd( pKey ); // Put dupe key in the bank. pKey = CreateDupeItem( pKey ); pChar->GetBank()->ContentAdd( pKey ); pChar->SysMessage( "The duplicate key is in your bank account" ); } } else { // Just put the key on the front step ? DEBUG_CHECK( 0 ); } }
/* * RootlessMarkOverlappedWindows * MarkOverlappedWindows is modified to ignore overlapping * top-level windows. */ static Bool RootlessMarkOverlappedWindows(WindowPtr pWin, WindowPtr pFirst, WindowPtr *ppLayerWin) { RegionRec saveRoot; Bool result; ScreenPtr pScreen = pWin->drawable.pScreen; SCREEN_UNWRAP(pScreen, MarkOverlappedWindows); RL_DEBUG_MSG("MARKOVERLAPPEDWINDOWS start "); HUGE_ROOT(pWin); if (IsRoot(pWin)) { // root - mark nothing RL_DEBUG_MSG("is root not marking "); result = FALSE; } else if (! IsTopLevel(pWin)) { // not top-level window - mark normally result = pScreen->MarkOverlappedWindows(pWin, pFirst, ppLayerWin); } else { //top-level window - mark children ONLY - NO overlaps with sibs (?) // This code copied from miMarkOverlappedWindows() register WindowPtr pChild; Bool anyMarked = FALSE; MarkWindowProcPtr MarkWindow = pScreen->MarkWindow; RL_DEBUG_MSG("is top level! "); /* single layered systems are easy */ if (ppLayerWin) *ppLayerWin = pWin; if (pWin == pFirst) { /* Blindly mark pWin and all of its inferiors. This is a slight * overkill if there are mapped windows that outside pWin's border, * but it's better than wasting time on RectIn checks. */ pChild = pWin; while (1) { if (pChild->viewable) { if (RegionBroken(&pChild->winSize)) SetWinSize (pChild); if (RegionBroken(&pChild->borderSize)) SetBorderSize (pChild); (* MarkWindow)(pChild); if (pChild->firstChild) { pChild = pChild->firstChild; continue; } } while (!pChild->nextSib && (pChild != pWin)) pChild = pChild->parent; if (pChild == pWin) break; pChild = pChild->nextSib; } anyMarked = TRUE; pFirst = pFirst->nextSib; } if (anyMarked) (* MarkWindow)(pWin->parent); result = anyMarked; } NORMAL_ROOT(pWin); SCREEN_WRAP(pScreen, MarkOverlappedWindows); RL_DEBUG_MSG("MARKOVERLAPPEDWINDOWS end\n"); return result; }
// timer expired, should I grow? bool CItem::Plant_OnTick() { ADDTOCALLSTACK("CItem::Plant_OnTick"); ASSERT(IsType(IT_CROPS) || IsType(IT_FOLIAGE)); // If it is in a container, kill it. if ( !IsTopLevel() ) return false; // Make sure the darn thing isn't moveable SetAttr(ATTR_MOVE_NEVER); Plant_SetTimer(); // No tree stuff below here if ( IsAttr(ATTR_INVIS) ) // if it's invis, take care of it here and return { SetHue(HUE_DEFAULT); ClrAttr(ATTR_INVIS); Update(); return true; } const CItemBase *pItemDef = Item_GetDef(); ITEMID_TYPE iGrowID = pItemDef->m_ttCrops.m_idGrow; if ( iGrowID == -1 ) { // Some plants generate a fruit on the ground when ripe. ITEMID_TYPE iFruitID = static_cast<ITEMID_TYPE>(RES_GET_INDEX(pItemDef->m_ttCrops.m_idGrow)); if ( m_itCrop.m_ReapFruitID ) iFruitID = static_cast<ITEMID_TYPE>(RES_GET_INDEX(m_itCrop.m_ReapFruitID)); if ( !iFruitID ) return true; // Put a fruit on the ground if not already here. CWorldSearch AreaItems(GetTopPoint()); for (;;) { CItem *pItem = AreaItems.GetItem(); if ( !pItem ) { CItem *pItemFruit = CItem::CreateScript(iFruitID); ASSERT(pItemFruit); pItemFruit->MoveToDecay(GetTopPoint(), 10 * g_Cfg.m_iDecay_Item); break; } if ( pItem->IsType(IT_FRUIT) || pItem->IsType(IT_REAGENT_RAW) ) break; } // NOTE: ??? The plant should cycle here as well ! iGrowID = pItemDef->m_ttCrops.m_idReset; } if ( iGrowID ) { SetID(static_cast<ITEMID_TYPE>(RES_GET_INDEX(iGrowID))); Update(); return true; } // some plants go dormant again ? // m_itCrop.m_Fruit_ID = iTemp; return true; }