Exemplo n.º 1
0
static D_RESET *load_reset( lua_State *L )
{
   D_RESET *r;
   
   if( !L )
      return NULL;
   
   if( ( r = new_reset() ) == NULL )
      return NULL;
   
   lua_pushstring( L, "rtype" );
   lua_gettable( L, -2 );
   r->type = luaL_checkstring( L, -1 )[0]; //'M' for mob reset, 'O' for object
   lua_pop( L, 1 );                        //additional can be added easily
   
   lua_pushstring( L, "vnum" );
   lua_gettable( L, -2 );
   r->vnum = luaL_checknumber( L, -1 );
   lua_pop( L, 1 );
   
   switch( r->type )
   {
      case 'm':
      case 'M':
      {
         //attach any worn items
         break;
      }
      case 'o':
      case 'O':
      {
         //load_area_objects_resets( L, 
         break;
      }
      default:
      {
         bug( "Reset with invalid type \'%c\'.", r->type );
         free( r );
         return NULL;
         break;
      }
   }
   
   return r;
}
Exemplo n.º 2
0
// Added by SinaC 2003 for  Circle style
void load_reset_circle( FILE *fp ) {
  RESET_DATA *pReset;
  int         iLastRoom = 0;
  int         iLastObj  = 0;
  int         iLastObj2  = 0;

  log_stringf(" RESETS");

  if ( !area_last ) {
    bug( "Load_reset_circle: no #AREA seen yet.");
    exit( 1 );
  }

  for ( ; ; ) {
    ROOM_INDEX_DATA *pRoomIndex;
    char letter;
    OBJ_INDEX_DATA *temp_index;
    /* int temp; */

    if ( ( letter = fread_letter( fp ) ) == 'S' )
      break;

    if ( letter == '*' ) {
      fread_to_eol( fp );
      continue;
    }
	
    //    pReset		= (RESET_DATA *) alloc_perm( sizeof(*pReset) );
    pReset = new_reset_data();
    pReset->command	= letter;

           fread_number( fp ); // not used
    pReset->arg1	= fread_number( fp );
    pReset->arg2	= fread_number( fp );
    pReset->arg3	= (letter == 'G' || letter == 'R') ? 0 : fread_number( fp );
    fread_to_eol( fp );
    pReset->arg4 = pReset->arg2;
    
    /*
     * Validate parameters.
     * We're calling the index functions for the side effect.
     */
    switch ( letter ) {
    default:
      bug( "Load_reset_circle: bad command '%c'.", letter );
      exit( 1 );
      break;

    case 'M':
      //get_mob_index  ( pReset->arg1 );  Circle areas may use mob from areas which will be read later
      /*	    get_room_index ( pReset->arg3 ); */
      // fix added by SinaC 2003
      if ( pReset->arg2 == 0 || pReset->arg4 == 0 )
	bug("reset M has arg2 equals to 0 (room: %d)", pReset->arg3);

      if ( ( pRoomIndex = get_room_index ( pReset->arg3 ) ) ) {
	new_reset( pRoomIndex, pReset );
	iLastRoom = pReset->arg3;
      }
      break;

    case 'O':
      //temp_index = get_obj_index ( pReset->arg1 ); // same for obj
      //temp_index->reset_num++; 
      if ( ( pRoomIndex = get_room_index ( pReset->arg3 ) ) ) {
	new_reset( pRoomIndex, pReset );
	iLastObj = pReset->arg3;
	iLastObj2 = pReset->arg1;
      }
      break;

    case 'P':
      //temp_index = get_obj_index  ( pReset->arg1 ); // same for obj
      //temp_index->reset_num++;
      //get_obj_index  ( pReset->arg1 );
      if ( pReset->arg3 == 0 ) {
	log_stringf("reset P has arg3 equals to 0, fixing to: %d", iLastObj2 );
	pReset->arg3 = iLastObj2;
      }
      if ( pReset->arg2 == 0 || pReset->arg4 == 0 )
	bug("reset P has arg2 equals to 0 (room: %d)", iLastObj);

      if ( ( pRoomIndex = get_room_index ( iLastObj ) ) ) {
	new_reset( pRoomIndex, pReset );
      }
      break;

    case 'G':
    case 'E':
      //temp_index = get_obj_index  ( pReset->arg1 ); // same for obj
      //temp_index->reset_num++; 
      if ( ( pRoomIndex = get_room_index ( iLastRoom ) ) ) {
	new_reset( pRoomIndex, pReset );
	iLastObj = iLastRoom;
	iLastObj2 = pReset->arg1;
      }
      break;

    case 'D': {
      pRoomIndex = get_room_index( pReset->arg1 );
      EXIT_DATA *pexit = NULL;

      if ( pReset->arg2 < 0
	   ||   pReset->arg2 >= MAX_DIR // > (MAX_DIR - 1)  SinaC 2003
	   || !pRoomIndex
	   || !( pexit = pRoomIndex->exit[pReset->arg2] )
	   || !IS_SET( pexit->rs_flags, EX_ISDOOR ) ) {
	if ( pexit == NULL ) {
	  bug("Load_reset_circle: 'D': exit from room [%d] not found", pReset->arg1 );
	  exit(1);
	}
	else
	  bug( "Load_reset_circle: 'D': exit %d not door.", pReset->arg2 );
	break;
	//exit( 1 );
      }

      switch ( pReset->arg3 ) {
      default:
	bug( "Load_reset_circle: 'D': bad 'locks': %d." , pReset->arg3);
      case 0: break;
      case 1:
	SET_BIT( pexit->rs_flags, EX_CLOSED );
	SET_BIT( pexit->exit_info, EX_CLOSED ); break;
      case 2:
	SET_BIT( pexit->rs_flags, EX_CLOSED | EX_LOCKED );
	SET_BIT( pexit->exit_info, EX_CLOSED | EX_LOCKED ); break;
      }

      break;
    }
    case 'R':
      break;
    }
  }
  
  return;
}
Exemplo n.º 3
0
Arquivo: reset.c Projeto: Lamieur/Lac
int zapisz_reset_M( ROOM_INDEX_DATA *room )
{
    MOB_INDEX_DATA *mob;
    OBJ_INDEX_DATA *obj;
    int i, j, n, v;
    RESET_DATA *r, *temp;
    GtkTreeModel *model;
    GtkTreeIter iter, child;
    char buf[ MIL ], bufnum[ MIL ];

    /* sprawdz poprawnosc danych */
    if ( ( v = SPIN_GET_VALUE( dres.spin_mob ) ) < 0
      || !( mob = get_mob_index( v ) ) )
	return 1;

    for ( i = 0; i < MAX_WEAR; i++ )
    {
	if ( ( v = SPIN_GET_VALUE( dres.spin_ekw[ i ] ) ) < 0 )
	    continue;

	if ( !( obj = get_obj_index( v ) ) )
	    return 2;

	if( dres.wear_na_item[ i ] != obj->wear_flags
	  || ( i == WEAR_LIGHT && obj->item_type != ITEM_LIGHT ) )
	    /* przydalby sie dialog z komunikatem, dlaczego odmawia zapisu */
	    return 3;
    }

    /* zmien reset M */
    dres.reset->arg1 = SPIN_GET_VALUE( dres.spin_mob );
    dres.reset->arg2 = SPIN_GET_VALUE( dres.spin_int );
    dres.reset->arg3 = SPIN_GET_VALUE( dres.spin_pom );

    /* zwolnij wszystkie resety podczepione do resetu M */
    for ( r = dres.reset->next; r;  )
    {
	if ( r->command != 'P' && r->command != 'G'
	  && r->command != 'E' && r->command != '*' )
	    break;

	temp = r;
	r = r->next;
	del_reset( temp );
    }

    temp = r; /* tutaj temp pamieta pierwszy reset spoza M */
    r = dres.reset;

    model = GTK_TREE_MODEL( dres.store_inw );

    /* z kazdego wybranego przedmiotu zrob reset E */
    for ( i = 0; i < MAX_WEAR; i++ )
    {
	if ( ( v = SPIN_GET_VALUE( dres.spin_ekw[ i ] ) ) == -1 )
	    continue;

	r->next = new_reset( );
	r = r->next;
	r->command = 'E';
	r->arg1 = v;
	r->arg3 = i;

	iter = dres.iter_ekw[ i ];

	/* jesli przedmiot ma zawartosc, zrob z niej resety P */
	if ( iter.stamp != 0 )
	{
	    j = gtk_tree_model_iter_n_children( model, &iter );

	    for ( n = 0; n < j; n++ )
		if ( gtk_tree_model_iter_nth_child( model, &child, &iter, n ) )
		{
		    gtk_tree_model_get( model, &child, KOL_WSKAZNIK, &obj, -1 );

		    r->next = new_reset( );
		    r = r->next;
		    r->command = 'P';
		    r->arg1 = obj->vnum;
		}
	}
    }

    /* teraz zapis przedmiotow "przy sobie" jako resety G */
    gtk_tree_model_get_iter_first( model, &iter );
    j = gtk_tree_model_iter_n_children( model, &iter );

    for ( n = 0; n < j; n++ )
	if ( gtk_tree_model_iter_nth_child( model, &child, &iter, n ) )
	{
	    gtk_tree_model_get( model, &child, KOL_WSKAZNIK, &obj, -1 );

	    r->next = new_reset( );
	    r = r->next;
	    r->command = 'G';
	    r->arg1 = obj->vnum;

	    /* resety G moga byc pojemnikami, wiec jeszcze raz resety P: */
	    {
		int k, l;
		GtkTreeIter grandchild;

		l = gtk_tree_model_iter_n_children( model, &child );

		for ( k = 0; k < l; k++ )
		    if ( gtk_tree_model_iter_nth_child( model, &grandchild, &child, k ) )
		    {
			gtk_tree_model_get( model, &grandchild, KOL_WSKAZNIK, &obj, -1 );

			r->next = new_reset( );
			r = r->next;
			r->command = 'P';
			r->arg1 = obj->vnum;
		    }
	    }
	}

    r->next = temp;

    /* odzwierciedlenie powyzszych zmian na liscie resetow */
    strcpy( bufnum, &dres.reset->command );
    sprintf( buf, "%s -> %s", mob->short_descr, room->name );
    gtk_tree_store_set( dkra.store_res, &dres.iter,
	KOL_VNUM, bufnum,
	KOL_OPIS, _( buf ), -1 );

    model = GTK_TREE_MODEL( dkra.store_res );
    j = gtk_tree_model_iter_n_children( model, &dres.iter );
    for ( n = 0; n < j; n++ )
	if ( gtk_tree_model_iter_nth_child( model, &child, &dres.iter, 0 ) )
	    gtk_tree_store_remove( dkra.store_res, &child );

    for ( r = dres.reset->next; r; r = r->next )
    {
	switch ( r->command )
	{
	    case 'G':
	    case 'E':
		gtk_tree_store_append( dkra.store_res, &iter, &dres.iter );
		child = iter;
		break;
	    case 'P':
	        gtk_tree_store_append( dkra.store_res, &iter, &child );
	        break;
	    case '*':
		continue;
	    default:
		return 0;
	}

	sprintf( bufnum, "%c", r->command );
	strcpy( buf, get_obj_index( r->arg1 )->short_descr );

	gtk_tree_store_set( dkra.store_res, &iter,
	    KOL_WSKAZNIK, r,
	    KOL_VNUM, bufnum,
	    KOL_OPIS, _( buf ), -1 );
    }

    return 0;
}
Exemplo n.º 4
0
Arquivo: reset.c Projeto: Lamieur/Lac
int zapisz_reset_O( ROOM_INDEX_DATA *room )
{
    OBJ_INDEX_DATA *obj;
    int j, n, v;
    RESET_DATA *r, *temp;
    GtkTreeModel *model;
    GtkTreeIter iter, child;
    char buf[ MIL ], bufnum[ MIL ];

    if ( ( v = SPIN_GET_VALUE( dres.spin_prz ) ) < 0
      || !( obj = get_obj_index( v ) ) )
	return 1;

    /* zmien reset O */
    dres.reset->arg1 = SPIN_GET_VALUE( dres.spin_prz );
    dres.reset->arg2 = SPIN_GET_VALUE( dres.spin_int );
    dres.reset->arg3 = SPIN_GET_VALUE( dres.spin_pom );

    /* zwolnij wszystkie komentarze i resety P podczepione do resetu O */
    for ( r = dres.reset->next; r;  )
	if ( r->command == 'P' || r->command == '*' )
	{
	    temp = r;
	    r = r->next;
	    del_reset( temp );
	}
	else
	    break;

    temp = r; /* tutaj temp pamieta pierwszy reset spoza O */
    r = dres.reset;

    model = GTK_TREE_MODEL( dres.store_inw );

    /* teraz zapis przedmiotow w pojemniku jako resety P */
    if ( obj->item_type == ITEM_CONTAINER )
    {
	gtk_tree_model_iter_nth_child( model, &iter, NULL, 0 );
	j = gtk_tree_model_iter_n_children( model, &iter );

	for ( n = 0; n < j; n++ )
	    if ( gtk_tree_model_iter_nth_child( model, &child, &iter, n ) )
	    {
		OBJ_INDEX_DATA *o;

		gtk_tree_model_get( model, &child, KOL_WSKAZNIK, &o, -1 );

		r->next = new_reset( );
		r = r->next;
		r->command = 'P';
		r->arg1 = o->vnum;
	    }
    }
    r->next = temp;

    /* odzwierciedlenie powyzszych zmian na liscie resetow */
    strcpy( bufnum, &dres.reset->command );
    sprintf( buf, "%s -> %s", obj->short_descr, room->name );
    gtk_tree_store_set( dkra.store_res, &dres.iter,
	KOL_VNUM, bufnum,
	KOL_OPIS, _( buf ), -1 );

    model = GTK_TREE_MODEL( dkra.store_res );
    j = gtk_tree_model_iter_n_children( model, &dres.iter );
    for ( n = 0; n < j; n++ )
	if ( gtk_tree_model_iter_nth_child( model, &child, &dres.iter, 0 ) )
	    gtk_tree_store_remove( dkra.store_res, &child );

    for ( r = dres.reset->next; r && r->command == 'P'; r = r->next )
    {
	OBJ_INDEX_DATA *o = get_obj_index( r->arg1 );

	sprintf( bufnum, "%c", r->command );
	strcpy( buf, o->short_descr );

	gtk_tree_store_append( dkra.store_res, &iter, &dres.iter );
	gtk_tree_store_set( dkra.store_res, &iter,
	    KOL_WSKAZNIK, r,
	    KOL_VNUM, bufnum,
	    KOL_OPIS, _( buf ), -1 );
    }

    return 0;
}