Esempio n. 1
0
GameWidget::GameWidget(QWidget *parent, const char *name)
        : QWidget(parent, name)
{
	in_game = false;
	in_pause = false;

	random.setSeed(0);

	loadSprites();
	setPieces(Pieces_Smiles);

	map = new Sprite[scr_width * scr_height];
	mirror_sprites = new Sprite[scr_width];

	screen = new ScreenWidget(sprites, &in_game, &in_pause, this);
	screen->move(10, 10);
	screen->setScreenSprites(map);

	mirror = new MirrorWidget(sprites, &in_game, &in_pause, this);
	mirror->move(10, 407);
	mirror->setMirrorSprites(mirror_sprites);

	next = new NextPieceWidget(sprites, &in_game, &in_pause, this);
	next->move(278, 10);
	next->setNextPieceSprites(next_piece);

	timer = new QTimer(this);
	connect(timer, SIGNAL(timeout()), this, SLOT(timeout()));
}
Esempio n. 2
0
void t_chessGui::run()
{
   chessCegui.init();
   loadImages();
   loadSprites();

   initCegui();
   initServer();
   initConnect();

   RedBox = sf::Shape::Rectangle(0,0,100,100,sf::Color(255,0,0));
   BlackBox = sf::Shape::Rectangle(0,0,100,100,sf::Color(0,255,0));
   BlueBox = sf::Shape::Rectangle(0,0,100,100,sf::Color(0,0,255));
   BrownBox = sf::Shape::Rectangle(0,0,100,100,sf::Color(255,255,0));
   PurpleBox = sf::Shape::Rectangle(0,0,100,100,sf::Color(160,32,240));
   PinkBox = sf::Shape::Rectangle(0,0,100,100,sf::Color(255,182,193));

   while (App.IsOpened())
   {
      processEvents();

      checkBuffer();

      App.Clear();

      drawBoard();

      CEGUI::System::getSingleton().renderGUI();

      App.Display();
   }

   return;
}
Esempio n. 3
0
File: wall.cpp Progetto: KDE/kbounce
void KBounceWall::resize( const QSize& tileSize )
{
    if ( tileSize != s_tileSize ) {
        s_tileSize = tileSize;
        loadSprites();
        update();
    }
}
Esempio n. 4
0
const QList<KSprite::Frame>& KSprite::frames() const
{
    if ( !frameshape )
    {
        if(!spritesLoaded_)
            loadSprites();
        frameshape = &shapemap_[type()];
    }
    return *frameshape;
}
SpriteAnimator::SpriteAnimator(string file, int numberOfSprites, float fps)
{
	nSprites = numberOfSprites;
	loadSprites(file);

	Sprite* sprite = new Sprite();
	sprite->initWithTexture(sprites[0]);
	image = new CentSprite(sprite, 0, 0, 0, 0);

	internalTimer = CatacombTimer(1 / fps);

	initialPosition = Vector2F(0, 0);
}
Esempio n. 6
0
Player::Player()
{
	type = ObjectTypes::Player;
	transform.SetXSpeed(PLAYER_SPEED);
	transform.SetYSpeed(PLAYER_SPEED);
	spawn();
	numberOfSprite = 4;
	currentSprite = 0;
	animDuration = 50;
	lifePoints = START_LP;
	transform.setXRotation(0);
	transform.setYRotation(1);

	loadSprites();
	loadSpriteSize();
}
Esempio n. 7
0
//Initializes SDL graphics.
void graphics_start() //
{

    TTF_Init();
    SetFont(24);
    if(SDL_Init(SDL_INIT_VIDEO) < 0)
    {
        printf("Could not initialize SDL! SDL_Error: %s\n", SDL_GetError());
    }
    else
    {
        window = SDL_CreateWindow("Outbreak Zombol City v0.8", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
        if(window == NULL)
        {
            printf("Window could not be created! SDL_Error: %s\n", SDL_GetError());
        }
        else
        {
            gRenderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
            if(gRenderer == NULL)
            {
                printf("Could not create renderer! SDL_Error: %s\n", SDL_GetError());
            }
            else
            {
                //Initialize renderer color
                SDL_SetRenderDrawColor(gRenderer, 0xFF, 0xFF, 0xFF, 0xFF);

                //Initialize PNG loading
                int imgFlags = IMG_INIT_PNG;
                if( !( IMG_Init( imgFlags ) & imgFlags ) )
                {
                    printf( "SDL_image could not initialize! SDL_image Error: %s\n", IMG_GetError() );
                }

                //Loads all sprites in to the game.
                loadSprites();

            }
        }
    }

    printf("Graphics initialized successfully!\n");
}
Esempio n. 8
0
bool CVorticonMapLoaderWithPlayer::load( Uint8 episode, 
                                         Uint8 level,
                                         const std::string& path,
                                         bool loadNewMusic,
                                         bool stategame )
{	
    if( !loadBase( episode, level, path, loadNewMusic ) )
    {
        return false;
    }

    if( !stategame )
    {
        loadSprites(episode, level );
    }

    // Set Map Delegation Object and refresh whole level
    mpMap->drawAll();
    gVideoDriver.updateScrollBuffer( mpMap->m_scrollx,
                                     mpMap->m_scrolly );

    return true;
}
Esempio n. 9
0
int main(int argc, char* argv[]) {
	unsigned int largeurNiveau = 0, hauteurNiveau = 0;
	unsigned int numLvl = 1;
	Niveau level;
	LevelError code_e;
	CoupsJoues pileDeCoups = NULL;
	Coup* coupDepile = NULL;
	PileCible pileDeCibles = NULL;

	char cheminFichierSolution[27] = {0};
	FILE* fichierSolution = NULL;

	Position positionJoueur;
	unsigned int nbPoussee = 0, nbMvt = 0;

	char continuerBoucle = 1;

	SDLInitError sdl_e;
	SDL_Surface *ecran;
	SDL_Event event;
	SDL_Surface** tableauSprites = NULL;
	
	if(argc > 1) {
		numLvl = atoi(argv[1]);
	}
	
	code_e = readLevel(FICHIER_NIVEAUX, &level, numLvl, &largeurNiveau, &hauteurNiveau, &positionJoueur, &pileDeCibles);
	if(code_e != NoError) {
		fprintf(stderr, "(%d) Erreur de lecture du fichier de niveau \"%s\".\n", code_e, FICHIER_NIVEAUX);
		libererPileCible(&pileDeCibles);
		freeNiveau(&level, hauteurNiveau);
		exit(EXIT_FAILURE);
	}

	sdl_e = initSDL(&ecran);
	if(sdl_e != InitOk) {
		fprintf(stderr, "(%d) Erreur lors de initSDL(SDL_Surface**).\n", sdl_e);
		libererPileCible(&pileDeCibles);
		freeNiveau(&level, hauteurNiveau);
		freeSDL(NULL);
		exit(EXIT_FAILURE);
	}

	tableauSprites = (SDL_Surface**)malloc(NB_SPRITE * sizeof(SDL_Surface*));
	if(tableauSprites == NULL) {
		fprintf(stderr, "Erreur d'allocation du tableau de sprites.\n");
		libererPileCible(&pileDeCibles);
		freeNiveau(&level, hauteurNiveau);
		freeSDL(NULL);
		exit(EXIT_FAILURE);
	}

	sdl_e = loadSprites(&tableauSprites);
	if(sdl_e != InitOk) {
		fprintf(stderr, "(%d) Erreur de chargement des sprites dans le tableau de sprites.\n", sdl_e);
		libererPileCible(&pileDeCibles);
		freeNiveau(&level, hauteurNiveau);
		freeSDL(&tableauSprites);
		exit(EXIT_FAILURE);
	}

	printf("Niveau %d\n", numLvl);
	afficheNiveau(&level, largeurNiveau, hauteurNiveau);

	dessineEntete(ecran);
	dessineCompteurs(ecran, nbMvt, nbPoussee);
	dessineNiveau(&level, ecran, largeurNiveau, hauteurNiveau, &tableauSprites);

	while (continuerBoucle)
	{
		while(SDL_PollEvent(&event)) {
			switch(event.type)
			{
				case SDL_QUIT:
					continuerBoucle = 0;
					break;
				case SDL_KEYDOWN:
					switch (event.key.keysym.sym)
					{
						case SDLK_ESCAPE:
							continuerBoucle = 0;
							break;
						case SDLK_UP:
							arrowKeyDownHandler(HAUT, &level, &positionJoueur, &pileDeCoups, &nbMvt, &nbPoussee);
							break;
						case SDLK_DOWN:
							arrowKeyDownHandler(BAS, &level, &positionJoueur, &pileDeCoups, &nbMvt, &nbPoussee);
							break;
						case SDLK_RIGHT:
							arrowKeyDownHandler(DROITE, &level, &positionJoueur, &pileDeCoups, &nbMvt, &nbPoussee);
							break;
						case SDLK_LEFT:
							arrowKeyDownHandler(GAUCHE, &level, &positionJoueur, &pileDeCoups, &nbMvt, &nbPoussee);
							break;
						case SDLK_r:
							libererPile(&pileDeCoups);
							code_e = updateLevel(LevelReset, FICHIER_NIVEAUX, &level, &positionJoueur, &pileDeCibles, &numLvl, &largeurNiveau, &hauteurNiveau);
							if(code_e != NoError) {
								fprintf(stderr, "(%d) Erreur lors du redemarrage du niveau.\n", code_e);
								libererPileCible(&pileDeCibles);
								freeNiveau(&level, hauteurNiveau);
								freeSDL(&tableauSprites);
								exit(EXIT_FAILURE);
							}

							nbMvt = 0;
							nbPoussee = 0;
							break;
						case SDLK_e:
							libererPile(&pileDeCoups);
							code_e = updateLevel(LevelPrevious, FICHIER_NIVEAUX, &level, &positionJoueur, &pileDeCibles, &numLvl, &largeurNiveau, &hauteurNiveau);
							if(code_e != NoError) {
								fprintf(stderr, "(%d) Erreur lors du passage au niveau precedent.\n", code_e);
								libererPileCible(&pileDeCibles);
								freeNiveau(&level, hauteurNiveau);
								freeSDL(&tableauSprites);
								exit(EXIT_FAILURE);
							}

							nbMvt = 0;
							nbPoussee = 0;
							printf("Niveau %d\n", numLvl);
							afficheNiveau(&level, largeurNiveau, hauteurNiveau);
							break;
						case SDLK_t:
							sprintf(cheminFichierSolution, "./save/level%d.sol", numLvl);
							fichierSolution = fopen(cheminFichierSolution, "r");
							if(fichierSolution != NULL) {
								fclose(fichierSolution);

								libererPile(&pileDeCoups);
								code_e = updateLevel(LevelNext, FICHIER_NIVEAUX, &level, &positionJoueur, &pileDeCibles, &numLvl, &largeurNiveau, &hauteurNiveau);
								if(code_e != NoError) {
									fprintf(stderr, "(%d) Erreur lors du passage au niveau suivant.\n", code_e);
									libererPileCible(&pileDeCibles);
									freeNiveau(&level, hauteurNiveau);
									freeSDL(&tableauSprites);
									exit(EXIT_FAILURE);
								}

								nbMvt = 0;
								nbPoussee = 0;
								printf("Niveau %d\n", numLvl);
								afficheNiveau(&level, largeurNiveau, hauteurNiveau);
							}
							break;
						case SDLK_w: /* NB: ceci est la version windows, allez savoir pourquoi SDL prend le clavier en qwerty */
							if ((event.key.keysym.mod & KMOD_LCTRL) == KMOD_LCTRL)
							{
								coupDepile = depilerCoup(&pileDeCoups);
								if(coupDepile != NULL) {
									deplacerObjetRetour(&level, *coupDepile, &nbMvt, &nbPoussee);
									calculPosition(&positionJoueur, (*coupDepile).direction, Negatif);
									free(coupDepile);
								}								
							}
							break;
						case SDLK_q: /* NB: ceci est la version windows, allez savoir pourquoi SDL prend le clavier en qwerty */
							creerFichierSauvegarde(Sauvegarde, numLvl, &pileDeCoups);
							break;
						case SDLK_a: /* NB: ceci est la version windows, allez savoir pourquoi SDL prend le clavier en qwerty */
							chargerFichierSauvegarde(numLvl, &pileDeCoups, &level, &positionJoueur, &pileDeCibles, &nbMvt, &nbPoussee);
							break;
						default: break;
					}
					
					if(toutesCiblesValidees(&pileDeCibles, &level) == CibleValidee) {
						printf("Niveau %d termine en %d mouvements et en %d poussees ! \n", numLvl, nbMvt, nbPoussee);
						creerFichierSauvegarde(Solution, numLvl, &pileDeCoups);
						libererPile(&pileDeCoups);
						code_e = updateLevel(LevelNext, FICHIER_NIVEAUX, &level, &positionJoueur, &pileDeCibles, &numLvl, &largeurNiveau, &hauteurNiveau);
						if(code_e != NoError) {
							fprintf(stderr, "(%d) Erreur lors du passage au niveau suivant.\n", code_e);
							libererPileCible(&pileDeCibles);
							freeNiveau(&level, hauteurNiveau);
							freeSDL(&tableauSprites);
							exit(EXIT_FAILURE);
						}

						nbMvt = 0;
						nbPoussee = 0;
						printf("Niveau %d\n", numLvl);
						afficheNiveau(&level, largeurNiveau, hauteurNiveau);
					}
					break;
				default: break;
			}
		}

		effacerNiveau(ecran);
		dessineEntete(ecran);
		dessineCompteurs(ecran, nbMvt, nbPoussee);
		dessineNiveau(&level, ecran, largeurNiveau, hauteurNiveau, &tableauSprites);

		SDL_Flip(ecran);
		SDL_Delay(20);
	}

	libererPile(&pileDeCoups);
	libererPileCible(&pileDeCibles);
	freeNiveau(&level, hauteurNiveau);
	freeSDL(&tableauSprites);
	return EXIT_SUCCESS;
}
Esempio n. 10
0
OrionMenuView::OrionMenuView(M4Engine *Vm, int x, int y, MenuType menuType, bool calledFromMainMenu,
		bool loadSaveFromHotkey): DialogView(Vm, x, y, true) {
	_menuType = menuType;
	_screenType = VIEWID_MENU;
	_screenFlags.layer = LAYER_MENU;
	_screenFlags.get = SCREVENT_ALL;
	_screenFlags.blocks = SCREVENT_ALL;
	_screenFlags.immovable = true;
	//_screenFlags.immovable = false;	// uncomment to make menu movable
	_coords.left = x;
	_coords.top = y;
	_currentItem = NULL;
	_escapeHandler = &OrionCallbacks::closeMenuFn;
	_returnHandler = NULL;
	_saveNames = NULL;
	_savegameThumbnail = NULL;
	_deleteSaveDesc = false;
	_closeFlag = false;

	_calledFromMainMenu = calledFromMainMenu;
	_loadSaveFromHotkey = loadSaveFromHotkey;

	_interfaceWasVisible = _vm->_interfaceView->isVisible();
	if (_interfaceWasVisible)
		_vm->_interfaceView->hide();

	_vm->_mouse->setCursorNum(CURSOR_ARROW);

	switch (menuType) {
	case GAME_MENU:
		loadSprites(MENU_GAME);

		// Add menu contents
		_menuObjects.push_back(new MenuButton(this, BTNID_MAIN, 45, 53, 24, 24, &OrionCallbacks::closeMenuFn));
		_menuObjects.push_back(new MenuButton(this, BTNID_OPTIONS, 45, 94, 24, 24, &OrionCallbacks::gameOptionsMenuFn));
		_menuObjects.push_back(new MenuButton(this, BTNID_RESUME, 45, 135, 24, 24, &OrionCallbacks::closeMenuFn));
		_menuObjects.push_back(new MenuButton(this, BTNID_QUIT, 141, 135, 24, 24, &OrionCallbacks::gameExitFn));
		_menuObjects.push_back(new MenuButton(this, BTNID_SAVE, 141, 53, 24, 24, &OrionCallbacks::gameSaveGameFn, _calledFromMainMenu));
		_menuObjects.push_back(new MenuButton(this, BTNID_LOAD, 141, 94, 24, 24, &OrionCallbacks::gameLoadGameFn,
			!_vm->_saveLoad->hasSaves()));

		_escapeHandler = &OrionCallbacks::closeMenuFn;
		_returnHandler = &OrionCallbacks::closeMenuFn;
		break;

	case OPTIONS_MENU:
		loadSprites(MENU_OPTIONS);

		// Store the original settings in case user aborts dialog
		_originalMidiVolume = _vm->midi()->getVolume();

		// Add menu contents
		// TODO: Currently the Digi slider isn't hooked up to anything
		_menuObjects.push_back(new MenuButton(this, OPTIONID_CANCEL, 93, 141, 74, 43,
			&OrionCallbacks::optionsCancelFn, false, false, OBJTYPE_OM_CANCEL));
		_menuObjects.push_back(new MenuButton(this, OPTIONID_DONE, 168, 141, 74, 43,
			&OrionCallbacks::optionsDoneFn, false, false, OBJTYPE_OM_DONE));
		_menuObjects.push_back(new MenuHorizSlider(this, OPTIONID_HSLIDER_MIDI, 47, 64, 212, 24,
			_originalMidiVolume * 100 / 255, &OrionCallbacks::optionsMidiSliderFn, true));
		_menuObjects.push_back(new MenuHorizSlider(this, OPTIONID_HSLIDER_DIGI, 47, 104, 212, 24,
			0, &OrionCallbacks::optionsDigiSliderFn, true));

		_escapeHandler = &OrionCallbacks::optionsEscapeFn;
		_returnHandler = &OrionCallbacks::optionsReturnFn;
		break;

	case SAVE_MENU:
	case LOAD_MENU:
		loadSprites(MENU_SAVELOAD);

		// Set up the defaults for the window
		_topSaveSlotIndex = 0;
		_selectedSlot = -1;
		_highlightedSlot = -1;
		_saveNames = _vm->_saveLoad->getSaves();

		// Set up menu elements
		_menuObjects.push_back(new MenuMessage(this, SLTAG_SAVELOAD_LABEL, 50, 241, 70, 16));
		_menuObjects.push_back(new MenuButton(this, SLTAG_SAVELOAD, 214, 384, 72, 41,
			(menuType == SAVE_MENU) ? &OrionCallbacks::saveLoadSaveFn : &OrionCallbacks::saveLoadLoadFn,
			true, true, (menuType == SAVE_MENU) ? OBJTYPE_SL_SAVE : OBJTYPE_SL_LOAD));
		_menuObjects.push_back(new MenuButton(this, SLTAG_CANCEL, 139, 384, 74, 43,
			&OrionCallbacks::saveLoadCancelFn, false, false, OBJTYPE_SL_CANCEL));
		_menuObjects.push_back(new MenuVertSlider(this, SLTAG_VSLIDER, 291, 255, 23, 127, 0,
			&OrionCallbacks::saveLoadSliderFn));

		if (_menuType == SAVE_MENU)
			_savegameThumbnail = createThumbnail();

		_menuObjects.push_back(new MenuImage(this, SLTAG_THUMBNAIL, 66, 28, 215, 162,
			(_savegameThumbnail == NULL) ? _sprites->getFrame(SL_EMPTY_THUMBNAIL) : _savegameThumbnail));


		{
			SaveGameIterator slot = _saveNames->begin();
			for (uint slotIndex = 0; slotIndex < SL_NUM_VISIBLE_SLOTS; ++slotIndex, ++slot) {
				// Get save slot
				bool isEmpty = (slotIndex >= _saveNames->size()) || (*slot).empty();

				_menuObjects.push_back(new MenuSaveLoadText(this, SLTAG_SLOTS_START + slotIndex,
					50, 256 + slotIndex * 15, 238, 15, &OrionCallbacks::saveLoadSlotFn,
					(menuType == LOAD_MENU) && isEmpty, true, (menuType == LOAD_MENU),
					isEmpty ? EmptySaveString : slot->c_str(), slotIndex + 1));
			}
		}

		_escapeHandler = &OrionCallbacks::saveLoadEscapeFn;
		_returnHandler = &OrionCallbacks::saveLoadReturnFn;
		break;

	default:
		error("Unknown menu type");
		break;
	}

	// Draw all the items onto the background surface
	for (MenuObjectsIterator i = _menuObjects.begin(); i != _menuObjects.end(); ++i)
		(*i)->onRefresh();
}
Esempio n. 11
0
void GameSpriteManager::load()
{
    int tabSize, size;
    uint8 *tabData, *data;
#if 1
    // using http://rtfm.insomnia.org/~qg/syndicate.zip
    tabData = File::loadFile("hspr-0.tab", tabSize);
    data = File::loadFile("hspr-0.dat", size);
    printf("Loaded %d sprites from hspr-0.dat\n", tabSize / 6);
    loadSprites(tabData, tabSize, data);
    delete[] tabData;
    delete[] data;
#else
    tabData = File::loadFile("hspr-0-d.tab", tabSize);
    data = File::loadFile("hspr-0-d.dat", size);
    printf("Loading %d sprites from hspr-0-d.dat\n", tabSize / 6);
    loadSprites(tabData, tabSize, data);
    delete[] tabData;
    delete[] data;
#endif

    FILE *fp = File::loadTextFile("HELE-0.TXT");
    if (fp) {
        char line[1024];
        while (fgets(line, 1024, fp)) {
            GameSpriteFrameElement e;
            char flipped;
            if (*line == '#')
                continue;
            sscanf(line, "%i %i %i %c %i", &e.sprite_, &e.off_x_, &e.off_y_,
                   &flipped, &e.next_element_);
            e.flipped_ = (flipped == 'f');
            elements_.push_back(e);
        }
        for (unsigned int i = 0; i < elements_.size(); i++)
            assert(elements_[i].next_element_ < (int)elements_.size());
        fclose(fp);
    } else {
        // try original data file
        data = File::loadFile("HELE-0.ANI", size);
        assert(size % 10 == 0);
        for (int i = 0; i < size / 10; i++) {
            GameSpriteFrameElement e;
            e.sprite_ = data[i * 10] | (data[i * 10 + 1] << 8);
            assert(e.sprite_ % 6 == 0);
            e.sprite_ /= 6;
            e.off_x_ = data[i * 10 + 2] | (data[i * 10 + 3] << 8);
            e.off_y_ = data[i * 10 + 4] | (data[i * 10 + 5] << 8);
            e.flipped_ =
                (data[i * 10 + 6] | (data[i * 10 + 7] << 8)) !=
                0 ? true : false;
            e.next_element_ = data[i * 10 + 8] | (data[i * 10 + 9] << 8);
            if (e.off_x_ & (1 << 15))
                e.off_x_ = -(65536 - e.off_x_);
            if (e.off_y_ & (1 << 15))
                e.off_y_ = -(65536 - e.off_y_);
            assert(e.next_element_ < size / 10);
            elements_.push_back(e);
        }
        delete[] data;
    }

    printf("loaded %i frame elements\n", elements_.size());

    for (unsigned int i = 0; i < elements_.size(); i++) {
        int esprite = elements_[i].sprite_;
        if (esprite) {
            char tmp[1024];
            sprintf(tmp, "sprites/%i.png", esprite);
            sprites_[esprite].loadSpriteFromPNG(tmp);        
        }
    } 

    fp = File::loadTextFile("HFRA-0.TXT");
    if (fp) {
        char line[1024];
        while (fgets(line, 1024, fp)) {
            GameSpriteFrame f;
            if (*line == '#')
                continue;
            sscanf(line, "%i %i %i %i %i", &f.first_element_, &f.width_, 
                    &f.height_, &f.flags_, &f.next_frame_);
            assert(f.first_element_ < (int) elements_.size());
            frames_.push_back(f);
        }
        for (unsigned int i = 0; i < frames_.size(); i++)
            assert(frames_[i].next_frame_ < (int)frames_.size());
        fclose(fp);
    } else {
        // try original data file
        data = File::loadFile("HFRA-0.ANI", size);
        assert(size % 8 == 0);
        for (int i = 0; i < size / 8; i++) {
            GameSpriteFrame f;
            f.first_element_ = data[i * 8] | (data[i * 8 + 1] << 8);
            assert(f.first_element_ < (int) elements_.size());
            f.width_ = data[i * 8 + 2];
            f.height_ = data[i * 8 + 3];
            f.flags_ = data[i * 8 + 4] | (data[i * 8 + 5] << 8);
            f.next_frame_ = data[i * 8 + 6] | (data[i * 8 + 7] << 8);
            assert(f.next_frame_ < size / 8);
            frames_.push_back(f);
        }
        delete[] data;
    }

    printf("loaded %i frames\n", frames_.size());

    fp = File::loadTextFile("HSTA-0.TXT");
    if (fp) {
        char line[1024];
        while (fgets(line, 1024, fp)) {
            int index;
            if (*line == '#')
                continue;
            sscanf(line, "%i", &index);
            assert(index < (int) frames_.size());
            index_.push_back(index);
        }
        fclose(fp);
    } else {
        // try original data file
        data = File::loadFile("HSTA-0.ANI", size);
        assert(size % 2 == 0);
        for (int i = 0; i < size / 2; i++) {
            index_.push_back(data[i * 2] | (data[i * 2 + 1] << 8));
            assert(index_[i] < (int) frames_.size());
        }
        delete[] data;
    }

    printf("index contains %i animations\n", index_.size());
}