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; }
// 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; }
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; }
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; }