예제 #1
0
// later put this in the custshipheader?
void DDDFrigateDied(Ship *ship)
{
    sdword i;
    DDDFrigateSpec *spec;
    Ship *deleteme;

    dbgAssert(ship->shiptype == DDDFrigate);

    spec = (DDDFrigateSpec *)ship->ShipSpecifics;

    for (i=0;i<MAX_NUM_DRONES;i++)
    {
        deleteme = spec->DronePtrs[i];

        if ((deleteme != NULL) && ((deleteme->flags & SOF_Dead) == 0))
        {
            if (deleteme->shiplink.belongto != NULL)
            {
                // ship is outside, so delete it
                deleteme->howDidIDie = ship->howDidIDie;
                deleteme->whoKilledMe = ship->whoKilledMe;
                univDeleteDeadShip(deleteme,EDT_AccumDamage);
                listRemoveNode(&deleteme->shiplink);
                listRemoveNode(&deleteme->impactablelink);

#if ETG_DISABLEABLE
                if (!etgEffectsEnabled)
                {
                    univWipeShipOutOfExistence(deleteme);
                }
#endif
            }
        }
    }
}
예제 #2
0
void MiningBaseDied(Ship *ship)
{
    Ship *deleteme;
    Node *node;
    MiningBaseSpec *spec = (MiningBaseSpec *)ship->ShipSpecifics;

    dbgAssert(ship->shiptype == MiningBase);
    if (ship->flags & SOF_NISShip)
    {
        return;
    }

    if (spec->dontRecurseKill)
    {
        return;
    }

    // first pass: Set all other MiningBases to dontRecurseKill so we don't get weird recursion

    for (node = universe.ShipList.head; node != NULL; node = node->next)
    {
        deleteme = (Ship *)listGetStructOfNode(node);
        dbgAssert(deleteme->objtype == OBJ_ShipType);

        if ((deleteme->shiptype == MiningBase) && (deleteme != ship) && ((deleteme->flags & (SOF_Dead|SOF_NISShip)) == 0))
        {
            spec = (MiningBaseSpec *)deleteme->ShipSpecifics;
            spec->dontRecurseKill = TRUE;
        }
    }

    // delete all other mining bases

    for (node = universe.ShipList.head; node != NULL; node = node->next)
    {
        deleteme = (Ship *)listGetStructOfNode(node);
        dbgAssert(deleteme->objtype == OBJ_ShipType);

        if ((deleteme->shiptype == MiningBase) && (deleteme != ship) && ((deleteme->flags & (SOF_Dead|SOF_NISShip)) == 0))
        {
            deleteme->howDidIDie = ship->howDidIDie;
            deleteme->whoKilledMe = ship->whoKilledMe;
            univDeleteDeadShip(deleteme,EDT_AccumDamage);
            listRemoveNode(&deleteme->shiplink);
            listRemoveNode(&deleteme->impactablelink);

#if ETG_DISABLEABLE
            if (!etgEffectsEnabled)
            {
                univWipeShipOutOfExistence(deleteme);
            }
#endif
        }
    }
}
예제 #3
0
xthread * xthread::getJoiner(void) {
  xthread * thread = NULL;
  lnode * node = NULL;

  node = joinqueue.next;

  PRDBG("node is %p\n", node);
#if 0
  if(node == NULL) {
    while(1) ;
  }
#endif
  
  assert(node != NULL);
  listRemoveNode(node);

  // Get corresponding thread for this thread
  if(node) {
    thread = container_of(node, xthread, toqueue);
    PRDBG("node is %p. Get thread %p\n", node, thread);
  }
  else {
    // Should not be here.
    assert(0);
  }

  return thread;
}
예제 #4
0
void* DLLCALL msgQueueFind(msg_queue_t* q, const void* data, size_t length)
{
	link_list_t*	list = msgQueueReadList(q);
	list_node_t*	node;

	if((node=listFindNode(list,data,length))==NULL)
		return(NULL);
	return listRemoveNode(list,node,/* Free Data? */FALSE);
}
예제 #5
0
void DLLCALL jsrt_Release(JSRuntime *rt)
{
	list_node_t	*node;

	pthread_mutex_lock(&jsrt_mutex);
	node = listFindNode(&rt_list, rt, 0);
	if(node)
		listRemoveNode(&rt_list, node, FALSE);
	JS_DestroyRuntime(rt);
	pthread_mutex_unlock(&jsrt_mutex);
}
예제 #6
0
파일: graph.c 프로젝트: edmunoz/Liveplasma
void graphUnlinkVertices(Graph *G, GVertex *source, GVertex *destination)
{
	NodeList *pnodo_arco;
	if(!source->LAdjacents) return;
	pnodo_arco = listSearch(source->LAdjacents, destination,gEdgeCmpxDestination);
	if(pnodo_arco){
		listRemoveNode(source->LAdjacents, pnodo_arco);
//		free(pnodo_arco->cont);
		//nodeListDelete(&pnodo_arco);
	}
}
예제 #7
0
파일: graph.c 프로젝트: edmunoz/Liveplasma
NodeList *graphRemoveVertex(Graph *G, GVertex *V, cmpfn cmp)
{
	NodeList *pnodovertice;
//	listDelete(&V->LAdjacents);
	for(pnodovertice = listGetHeader(G); pnodovertice!=NULL; 
			pnodovertice = nodeListGetNext(pnodovertice)){
				graphUnlinkVertices(G, (GVertex*)nodeListGetCont(pnodovertice), V); 		
	}
	pnodovertice = listSearch(G, V, cmp);
	listRemoveNode(G, pnodovertice);
	return pnodovertice;
}
예제 #8
0
long DLLCALL listRemoveNodes(link_list_t* list, list_node_t* node, long max, BOOL free_data)
{
    long count;

    if(list==NULL)
        return(-1);

    listLock(list);

    if(node==FIRST_NODE)
        node=list->first;

    for(count=0; node!=NULL && count<max; node=node->next, count++)
        if(listRemoveNode(list, node, free_data)==NULL)
            break;

    listUnlock(list);

    return(count);
}
void univUpdateMineWallFormations()
{
    Node *node,*minenode,*tempnode;
    //Missile *mine, *mineend = NULL, *minestart, *mineendtemp;
    MineFormationInfo *mineformationinfo;
    Missile *minestart;
    vector tempvec;
    node = universe.MineFormationList.head;
    while(node != NULL)
    {
        mineformationinfo = (MineFormationInfo *) listGetStructOfNode(node);

        if(mineformationinfo->MineList.num == 9)             //use another number other than 0 later..maybe 8? Tunable
        {
            //no more mines in formation so destroy this here formation

            //destroy any effects that are still going

            //here re-task mines (make not Force Dropped...)
            if(mineformationinfo->FULL)
            {
                //no more mines are going to be added...

                minenode = mineformationinfo->MineList.head;
                //set formationinfo to NULL
                while(minenode != NULL)
                {
                    minestart = (Missile *) listGetStructOfNode(minenode);

                    minestart->formationinfo = NULL;
                    minenode = minenode->next;
                }
                listRemoveAll(&mineformationinfo->MineList);    //removes all mine links
                tempnode = node->next;
                listDeleteNode(node);       //destroys mineformation
                node = tempnode;
                continue;
            }
        }
        else
        {
            //mines exist in formation
            if(mineformationinfo->FULL)
            {

                minenode = mineformationinfo->MineList.head;

                while(minenode != NULL)
                {
                    minestart = (Missile *) listGetStructOfNode(minenode);

                    vecSub(tempvec, minestart->posinfo.position, minestart->formation_position);
                    if(vecMagnitudeSquared(tempvec) > MINE_GONE_TOO_FAR_SQR)
                    {
                        tempnode = minenode->next;
                        minestart->formationinfo = NULL;
                        listRemoveNode(&minestart->formationLink);
                        minenode = tempnode;
                        continue;
                    }
                    minenode = minenode->next;
                }
            }
        }
ret:
        node = node->next;
    }

}
예제 #10
0
/*-----------------------------------------------------------------------------
    Name        : rmUpdateResearch
    Description : updates all research
    Inputs      : none
    Outputs     : none
    Return      : void
----------------------------------------------------------------------------*/
void rmUpdateResearch(void)
{
    sdword              index, labindex, i;
    ResearchLab        *lab;
    PlayerResearchInfo *research;
    ResearchTopic      *topic;
    Node               *walk;
    LinkedList          deletelist;
    bool                shipcanbuild[STD_LAST_SHIP];

    listInit(&deletelist);

    // search through list of players
    for (index=0; index<universe.numPlayers; index++)
    {
        research = &universe.players[index].researchinfo;

        if (research->CanDoResearch)
        {
            walk = research->listoftopics.head;

            // walk through list of topics being researched
            while (walk != NULL)
            {
                topic = (ResearchTopic *)listGetStructOfNode(walk);
                topic->timeleft -= labdec[topic->numlabsresearching];
                if (topic->timeleft < 0)
                {
                    for (i = 0; i < STD_LAST_SHIP; i++)
                    {
                        shipcanbuild[i] = rmCanBuildShip(&(universe.players[index]), i);
                    }

                    // Insert sound for technology completed
                    if (universe.players[index].race == R1)
                    {
                        speechEventFleet(STAT_F_Research_R1_Completed, topic->techresearch, index);
                    }
                    else if (universe.players[index].race == R2)
                    {
                        speechEventFleet(STAT_F_Research_R2_Completed, topic->techresearch, index);
                    }

                    topic->timeleft = 0;

                    research->HasTechnology |= TechToBit(topic->techresearch);



                    listRemoveNode(&topic->link);
                    listAddNode(&deletelist,&topic->link,topic);

                    for (labindex=0; labindex<NUM_RESEARCHLABS; labindex++)
                    {
                        lab = &research->researchlabs[labindex];
                        if (lab->topic==topic)
                        {
                            lab->labstatus = LS_NORESEARCHITEM;
                            lab->topic     = NULL;
                            if (rmGUIActive)
                                rmClearLab(labindex);
                        }
                    }

                    for (i = 0; i < STD_LAST_SHIP; i++)
                    {
                        if (shipcanbuild[i] != rmCanBuildShip(&(universe.players[index]), i))
                        {
                            speechEventFleet(STAT_F_Research_CompletedShip, i, index);
                            if (cmActive)
                            {
                                cmUpdateShipsAvailable();
                            }
                        }
                    }

                    if (singlePlayerGame && (index == 0))
                    {
                        tmTechForSale[topic->techresearch] = TM_TECH_IS_ALREADY_OWNED;
                    }

                    if (rmGUIActive)
                        rmUpdateTechList();
                }

                walk = walk->next;
            }

            listDeleteAll(&deletelist);
        }
    }
}