void OnlineService::persistSaveGame(const char *filename)
{
	assert(has_user);
	assert(has_user_controller);
	assert(state == CONNECTED);

	const size_t pathsize = 255;
	char originalfilepath[pathsize];
	snprintf(originalfilepath, pathsize, "%s%s", get_save_filename_prefix(), filename);
	char encodedfilepath[pathsize];
	snprintf(encodedfilepath, pathsize, "%s%s.txt", get_save_filename_prefix(), filename);

	//printf("encoding %s to %s... ", originalfilepath, encodedfilepath); fflush(stdout);
	ascii85_encode(originalfilepath, encodedfilepath);
	//printf("done\n"); fflush(stdout);

	// read encoded save file
	//printf("reading %s... ", encodedfilepath); fflush(stdout);
	char *save_data = 0;
	bFILE *file = open_file(encodedfilepath, "r");
	if(!file->open_failure())
	{
		size_t filesize = file->file_size();
		save_data = new char[filesize + 1];
		file->read(save_data, filesize);
		save_data[filesize] = 0;
		//printf("read %i bytes\n", filesize); fflush(stdout);
	}
	else
	{
		//printf("failed\n"); fflush(stdout);
	}
	delete file;
	file = 0;

	// write encoded save file to context
	SC_String_h save_data_string;
	SC_Error_t newStringResult = SC_String_New(&save_data_string, save_data);

	SC_Context_h user_context = SC_User_GetContext(scoreloop_user);

	//printf("putting %s in user context... "); fflush(stdout);
	SC_Error_t putContextResult = SC_Context_Put(user_context, filename, save_data_string);
	//printf(putContextResult == SC_OK ? "done\n" : "failed\n"); fflush(stdout);

	//printf("setting user context... "); fflush(stdout);
	SC_Error_t setUserContextResult = SC_User_SetContext(scoreloop_user, user_context);
	//printf(setUserContextResult == SC_OK ? "done\n" : "failed\n"); fflush(stdout);

	//printf("updating user context...\n"); fflush(stdout);
	state = SUBMIT_USER_CONTEXT;
	SC_UserController_UpdateUserContext(scoreloop_user_controller);

	if (save_data)
	{
		delete save_data;
		save_data = 0;
	}
}
void OnlineService::downloadSaveGame(const char *filename)
{
	//printf("online download %s\n", filename); fflush(stdout);
	const size_t pathsize = 255;
	char originalfilepath[pathsize];
	snprintf(originalfilepath, pathsize, "%s%s", get_save_filename_prefix(), filename);
	char encodedfilepath[pathsize];
	snprintf(encodedfilepath, pathsize, "%s%s.txt", get_save_filename_prefix(), filename);

	SC_Context_h user_context = SC_User_GetContext(scoreloop_user);

	SC_String_h save_data;

	//printf("getting user context entry %s... ", filename); fflush(stdout);
	SC_Error_t getContextResult = SC_Context_Get(user_context, filename, &save_data);

	if (getContextResult == SC_OK)
	{
		//printf("done\n"); fflush(stdout);

		//printf("writing %s... ", encodedfilepath); fflush(stdout);
		bFILE *file = open_file(encodedfilepath, "w");
		if(!file->open_failure())
		{
			//printf("done\n"); fflush(stdout);
			const char *data = SC_String_GetData(save_data);
			file->write(data, strlen(data));
		}
		else
		{
			//printf("failed\n"); fflush(stdout);
		}
		delete file;
		file = 0;

		//printf("decoding %s to %s... ", encodedfilepath, originalfilepath); fflush(stdout);
		int result = ascii85_decode(encodedfilepath, originalfilepath);
		//if (result == 0)
		//	printf("done\n");
		//else
		//	printf("failed\n");
		//fflush(stdout);
	}
	else if (getContextResult == SC_NOT_FOUND)
	{
		//printf("not found\n"); fflush(stdout);
	}
	else
	{
		//printf("failed\n"); fflush(stdout);
	}
}
Exemplo n.º 3
0
int show_load_icon() {
	int i;
	for (i = 0; i < MAX_SAVE_GAMES; i++) {
		char nm[255];
		sprintf(nm, "%ssave%04d.spe", get_save_filename_prefix(), i + 1);
		bFILE *fp = open_file(nm, "rb");
		if (fp->open_failure()) {
			delete fp;
		} else {
			delete fp;
			return 1;
		}
	}
	return 0;
}
Exemplo n.º 4
0
int get_save_spot() {
	int i = MAX_SAVE_GAMES, last_free = 0;
	for (; i > 0;) {
		char name[20];
		sprintf(name, "%ssave%04d.spe", get_save_filename_prefix(), i);
		FILE *fp = open_FILE(name, "rb");
		if (fp)
			i = 0;
		else {
			last_free = i;
			i--;
		}
		fclose(fp);
	}

	if (last_free)
		return last_free; // if there are any slots not created yet...

	int w = cache.img(save_buts[0])->Size().x;
	int mx = last_demo_mx - w / 2;
	if (mx + w + 10 > xres)
		mx = xres - w - 10;
	if (mx < 0)
		mx = 0;

	Jwindow *l_win = create_num_window(mx, MAX_SAVE_GAMES, MAX_SAVE_LINES,
			NULL);
	event ev;
	int got_level = 0;
	int quit = 0;
	do {
		wm->flush_screen();
		wm->get_event(ev);
		if (ev.type == EV_MESSAGE && ev.message.id >= ID_LOAD_GAME_NUMBER
				&& ev.message.id < ID_LOAD_GAME_PREVIEW)
			got_level = ev.message.id - ID_LOAD_GAME_NUMBER + 1;

		if (ev.type == EV_CLOSE_WINDOW && ev.window == l_win)
			quit = 1;
	} while (!got_level && !quit);

	wm->close_window(l_win);
	the_game->reset_keymap();
	return got_level;
}
Exemplo n.º 5
0
void gamma_correct(palette *&pal, int force_menu)
{
    long dg=0,old_dg=0;
    int abort=0;

    // see if user has already done this routine
    LSymbol *gs = LSymbol::Find("darkest_gray");

    if(old_pal)
    {
        delete pal;
        pal = old_pal;
        old_pal = NULL;
    }

    if(gs && DEFINEDP(gs->GetValue()) && !force_menu)
    {
        dg = lnumber_value(gs->GetValue());
    }
#ifdef __QNXNTO__
    else if (!force_menu)
    {
    	dg = 36;
    }
#endif // __QNXNTO__
    else
    {
        if(gs && DEFINEDP(gs->GetValue()))
        {
            dg = old_dg = lnumber_value(gs->GetValue());
        }
        // load in a fine gray palette they can chose from
        palette *gray_pal = pal->copy();
        int i = 0;
        int tc = 32;

        for(; i < tc; i++)
        {
            gray_pal->set(i, i * 4, i * 4, i * 4);
        }

        gray_pal->load();

        int wm_bc = wm->bright_color(), wm_mc = wm->medium_color(), wm_dc = wm->dark_color();

        int br_r = pal->red(wm_bc) + 20;
        if(br_r > 255)
            br_r = 255;
        int br_g = pal->green(wm_bc) + 20;
        if(br_g > 255)
            br_g = 255;
        int br_b = pal->blue(wm_bc) + 20;
        if(br_b > 255)
            br_b = 255;

        int md_r = pal->red(wm_mc) - 20;
        if(md_r < 0)
            md_r = 0;
        int md_g = pal->green(wm_mc) - 20;
        if(md_g < 0)
            md_g = 0;
        int md_b = pal->blue(wm_mc) - 20;
        if(md_b < 0)
            md_b = 0;

        int dr_r = pal->red(wm_dc) - 40;
        if(dr_r < 0)
            dr_r = 0;
        int dr_g = pal->green(wm_dc) - 40;
        if(dr_g < 0)
            dr_g = 0;
        int dr_b = pal->blue(wm_dc) - 40;
        if(dr_b < 0)
            dr_b = 0;

        wm->set_colors(gray_pal->find_closest(br_r, br_g, br_b),
            gray_pal->find_closest(md_r, md_g, md_b),
            gray_pal->find_closest(dr_r, dr_g, dr_b));

        int sh = wm->font()->Size().y + 35;
        button *but = new button(5, 5 + sh * 3, ID_GAMMA_OK, cache.img(ok_button),
            new info_field(35, 10 + sh * 3, ID_NULL, lang_string("gamma_msg"), 0));

        gray_picker *gp = new gray_picker(2, 5 + sh, ID_GREEN_PICKER, 0, dg / 4, but);
        gp->set_pos(dg / 4);

        Jwindow *gw = wm->CreateWindow(ivec2(xres / 2 - 190,
                                             yres / 2 - 90), ivec2(-1), gp);

        Event ev;
        wm->flush_screen();
        do
        {
            do
            {
                wm->get_event(ev);
            } while(ev.type == EV_MOUSE_MOVE && wm->IsPending());
            wm->flush_screen();
            if(ev.type == EV_CLOSE_WINDOW)
                abort = 1;
            if(ev.type == EV_KEY && ev.key == JK_ESC)
                abort = 1;
        } while(!abort && (ev.type != EV_MESSAGE || ev.message.id != ID_GAMMA_OK));

        dg = ((spicker *)gw->inm->get(ID_GREEN_PICKER))->first_selected() * 4;

        wm->close_window(gw);
        wm->flush_screen();

        wm->set_colors(wm_bc, wm_mc, wm_dc);
        delete gray_pal;

        if(!abort)
        {
            char *gammapath;
            FILE *fp;

            gammapath = (char *)malloc(strlen(get_save_filename_prefix()) + 10);
            sprintf(gammapath, "%sgamma.lsp", get_save_filename_prefix());
            fp = open_FILE(gammapath, "wb");
            if(fp)
            {
                fprintf(fp, "(setq darkest_gray %ld)\n", dg);
                fclose(fp);
                LSpace *sp = LSpace::Current;
                LSpace::Current = &LSpace::Perm;
                LSymbol::FindOrCreate("darkest_gray")->SetNumber(dg);

                LSpace::Current = sp;
            }
            else
            {
                dprintf("Unable to write to file gamma.lsp\n");
            }
            free(gammapath);
        }
    }

    if(abort)
        dg = old_dg;

    if(dg < 1)
        dg = 1;
    else if(dg > 128)
        dg = 128;

    double gamma = log(dg / 255.0) / log(16.0 / 255.0);

    old_pal = pal;
    pal = new palette;
    for(int i = 0; i < 256; i++)
    {
        uint8_t oldr, oldg, oldb;
        old_pal->get(i, oldr, oldg, oldb);
        pal->set(i, (int)(pow(oldr / 255.0, gamma) * 255),
            (int)(pow(oldg / 255.0, gamma) * 255),
            (int)(pow(oldb / 255.0, gamma) * 255));
    }

    pal->load();
}
Exemplo n.º 6
0
void last_savegame_name(char *buf) {
	printf("last_savegame_name()\n");
	sprintf(buf, "%ssave%04d.spe", get_save_filename_prefix(),
			(last_save_game_number + MAX_SAVE_GAMES - 1) % MAX_SAVE_GAMES + 1);
}
Exemplo n.º 7
0
int load_game(int show_all, char const *title) // return 0 if the player escapes, else return the number of the game to load
		{
	int total_saved = 0;
	image *thumb_nails[MAX_SAVE_GAMES];
	int start_num = 0;
	int max_w = 160, max_h = 100;
	memset(thumb_nails, 0, sizeof(thumb_nails));

	image *first = NULL;

	for (start_num = 0; start_num < MAX_SAVE_GAMES; start_num++) {
		char name[255];
		int fail = 0;

		sprintf(name, "%ssave%04d.spe", get_save_filename_prefix(),
				start_num + 1);
		bFILE *fp = open_file(name, "rb");
		if (fp->open_failure()) {
			fail = 1;
		} else {
			spec_directory sd(fp);
			spec_entry *se = sd.find("thumb nail");
			if (se && se->type == SPEC_IMAGE) {
				thumb_nails[start_num] = new image(fp, se);
				if (thumb_nails[start_num]->Size().x > max_w)
					max_w = thumb_nails[start_num]->Size().x;
				if (thumb_nails[start_num]->Size().y > max_h)
					max_h = thumb_nails[start_num]->Size().y;
				if (!first)
					first = thumb_nails[start_num];
				total_saved++;
			} else
				fail = 1;
		}
		if (fail && show_all) {
			thumb_nails[start_num] = new image(vec2i(160, 100));
			thumb_nails[start_num]->clear();
			console_font->put_string(thumb_nails[start_num], 0, 0,
					symbol_str("no_saved"));
			total_saved++;
			if (!first)
				first = thumb_nails[start_num];
		}
		delete fp;
	}

	if (!total_saved)
		return 0;
	if (total_saved > MAX_SAVE_GAMES)
		total_saved = MAX_SAVE_GAMES;

	int i;
	/*  int ih=cache.img(save_buts[0])->Size().y;
	 ico_button *buts[MAX_SAVE_GAMES];
	 int y=0;


	 for (i=0; i<total_saved; i++,y+=ih)
	 {
	 buts[i]=new ico_button(0,y,ID_LOAD_GAME_NUMBER+i,
	 save_buts[i*3+1],save_buts[i*3+1],save_buts[i*3+0],save_buts[i*3+2],NULL);
	 buts[i]->set_act_id(ID_LOAD_GAME_PREVIEW+i);
	 }

	 for (i=0; i<total_saved-1; i++)
	 buts[i]->next=buts[i+1];
	 */

	Jwindow *l_win = create_num_window(0, total_saved, MAX_SAVE_LINES,
			thumb_nails);
	Jwindow *preview = wm->new_window(l_win->x + l_win->l + 5, l_win->y, max_w,
			max_h, NULL, title);

	first->put_image(preview->screen, preview->x1(), preview->y1());

	event ev;
	int got_level = 0;
	int quit = 0;
	do {
		wm->flush_screen();
		wm->get_event(ev);
		if (ev.type == EV_MESSAGE && ev.message.id >= ID_LOAD_GAME_NUMBER
				&& ev.message.id < ID_LOAD_GAME_PREVIEW)
		{
			got_level = ev.message.id - ID_LOAD_GAME_NUMBER + 1;
		}
		else if (ev.type == EV_MESSAGE && ev.message.id >= ID_LOAD_GAME_PREVIEW
				&& ev.message.id < ID_LOAD_PLAYER_GAME)
		{
			int draw_num = ev.message.id - ID_LOAD_GAME_PREVIEW;
			preview->clear();
			thumb_nails[draw_num]->put_image(preview->screen, preview->x1(),
					preview->y1());
		}
		else if ((ev.type == EV_CLOSE_WINDOW) || (ev.type == EV_KEY && ev.key == JK_ALT_L))
		{
			quit = 1;
		}
		else
		{
			l_win->inm->handle_event(ev, l_win);
		}


	} while (!got_level && !quit);

	wm->close_window(l_win);
	wm->close_window(preview);

	for (i = 0; i < total_saved; i++)
		if (thumb_nails[i])
			delete thumb_nails[i];

	return got_level;
}
Exemplo n.º 8
0
void load_data(int argc, char **argv)
{
    total_objects=0;
    total_weapons=0;
    weapon_types=NULL;
    figures=NULL;
    nforetiles=nbacktiles=0;
    foretiles=NULL;
    backtiles=NULL;
    pal=NULL;
    color_table=NULL;

# if 0
    int should_save_sd_cache = 0;

    char *cachepath;
    cachepath = (char *)malloc( strlen( get_save_filename_prefix() ) + 12 + 1 );
    sprintf( cachepath, "%ssd_cache.tmp", get_save_filename_prefix() );

    bFILE *load = open_file( cachepath, "rb" );
    if( !load->open_failure() )
    {
        sd_cache.load( load );
    }
    else
    {
        should_save_sd_cache = 1;
    }
    delete load;
#endif

  // don't let them specify a startup file we are connect elsewhere
  if (!net_start())
  {
    for (int i=1; i<argc; i++)
    {
      if (!strcmp(argv[i],"-lsf"))
      {
    i++;
    strcpy(lsf,argv[i]);
      }
      if (!strcmp(argv[i],"-a"))
      {
    i++;
    snprintf(lsf, sizeof(lsf), "addon/%s/%s.lsp", argv[i], argv[i]);
      }
    }
  }
  else if (!get_remote_lsf(net_server,lsf))
  {
    dprintf("Unable to get remote lsf from %s\n",net_server);
    exit(0);
  }
  char prog[100];
  char const *cs;

  c_mouse1=cache.reg("art/dev.spe","c_mouse1",SPEC_IMAGE,0);
  c_mouse2=cache.reg("art/dev.spe","c_mouse2",SPEC_IMAGE,0);
  c_normal=cache.reg("art/dev.spe","c_normal",SPEC_IMAGE,0);
  c_target=cache.reg("art/dev.spe","c_target",SPEC_IMAGE,0);


  snprintf(prog, sizeof(prog), "(load \"%s\")\n", lsf);

  cs=prog;
  if (!LObject::Compile(cs)->Eval())
  {
    printf("unable to open file '%s'\n",lsf);
    exit(0);
  }
  compiled_init();
  LSpace::Tmp.Clear();

  dprintf("Engine : Registering base graphics\n");
  for (int z=0; z<=11; z++)
  {
    char nm[10];
    snprintf(nm, sizeof(nm), "l%d", z);
    light_buttons[z]=cache.reg("art/dev.spe",nm,SPEC_IMAGE,0);
  }


  image *tmp_image = new image(ivec2(192, 104), fnt6x13);
  big_font=new JCFont(tmp_image);
  delete tmp_image;


  char const *ff;
  // FIXME: unnecessary duplicate call
  if (DEFINEDP(LSymbol::FindOrCreate("frame_file")->GetValue()))
    ff = lstring_value(LSymbol::FindOrCreate("frame_file")->GetValue());
  else
    ff = "art/frame.spe";

  ok_button   =      cache.reg(ff,"dev_ok",SPEC_IMAGE);
  cancel_button  =   cache.reg(ff,"cancel",SPEC_IMAGE);

//  clouds      =      cache.reg(ff,"clouds",SPEC_IMAGE);

  lower_volume=      cache.reg(ff,"lower_volume",SPEC_IMAGE);
  raise_volume=      cache.reg(ff,"raise_volume",SPEC_IMAGE);
  music_button=      cache.reg(ff,"music",SPEC_IMAGE);
  sfx_button=        cache.reg(ff,"sound_fx",SPEC_IMAGE);
  record_button=     cache.reg(ff,"record",SPEC_IMAGE);
  play_button=       cache.reg(ff,"play",SPEC_IMAGE);
  window_colors=     cache.reg(ff,"window_colors",SPEC_IMAGE);
  pause_image=       cache.reg(ff,"pause_image",SPEC_IMAGE);
  vmm_image=         cache.reg(ff,"vmm",SPEC_IMAGE);
  border_tile=       cache.reg(ff,"border_tile",SPEC_IMAGE);
  window_texture=    cache.reg(ff,"window_texture",SPEC_IMAGE);


  help_screens=NULL;
  total_help_screens=0;

  if (DEFINEDP(symbol_value(l_help_screens)))
  {
    void *v=symbol_value(l_help_screens);
    char *ff=lstring_value(CAR(v));  v=CDR(v);
    total_help_screens=0;
    while (v) { total_help_screens++; v=CDR(v); }
    if (total_help_screens)
    {
      help_screens=(int *)malloc(sizeof(int)*total_help_screens);
      v=CDR(symbol_value(l_help_screens));
      int i=0;
      for (; v; v=CDR(v),i++)
        help_screens[i]=cache.reg(ff,lstring_value(CAR(v)),SPEC_IMAGE);
    }
    else
      dprintf("Warning no help images following filename\n");
  }

  int i;
  for (i=1; i<argc; i++)
  {
    if (!strcmp(argv[i],"-ec"))
      l_empty_cache->SetValue(true_symbol);
    if (!strcmp(argv[i],"-t"))
    {
      i++;
      insert_tiles(argv[i]);
    }
  }

  if (DEFINEDP(symbol_value(l_title_screen)))
    title_screen=cache.reg_object(NULL,(LObject *)symbol_value(l_title_screen),SPEC_IMAGE,1);
  else title_screen=-1;

  if (DEFINEDP(symbol_value(l_cdc_logo)))
    cdc_logo=cache.reg_object(NULL,(LObject *)symbol_value(l_cdc_logo),SPEC_IMAGE,1);
  else cdc_logo=-1;

  start_position_type=0xffff;
  for(i=0; i<total_objects; i++)
    if (!strcmp(object_names[i],"START"))
      start_position_type=i;
  if (start_position_type==0xffff)
  {
    printf("No object named START, cannot start game.\n");
    exit(0);
  }

  sbar.load();

  load_number_icons();


  ERROR(nbacktiles,"No background tiles defined!");
  ERROR(nforetiles,"No foreground tiles defined!");
  ERROR(foretiles[0]>=0,"No black (0) foreground tile defined!");
  ERROR(backtiles[0]>=0,"No black (0) background tile defined!");
  ERROR(big_font_pict!=-1 || small_font_pict!=-1,
    "No font loaded (use load_big_font or load_small_font)!");
  f_wid=cache.foret(foretiles[0])->im->Size().x;
  f_hi=cache.foret(foretiles[0])->im->Size().y;
  b_wid=cache.backt(backtiles[0])->im->Size().x;
  b_hi=cache.backt(backtiles[0])->im->Size().y;

#if 0
    if( should_save_sd_cache )
    {
        bFILE *save = open_file( cachepath, "wb" );
        if( !save->open_failure() )
        {
            sd_cache.save( save );
        }
        delete save;
    }
#endif

    sd_cache.clear();
    past_startup = 1;
#if 0
    free( cachepath );
#endif
}
Exemplo n.º 9
0
void calc_light_table(palette *pal)
{
    white_light_initial=(uint8_t *)malloc(256*64);
    white_light=white_light_initial;

//    green_light=(uint8_t *)malloc(256*64);
    int i = 0;
    for( ; i < TTINTS; i++ )
    {
        tints[i] = (uint8_t *)malloc( 256 );
    }

    char *lightpath;
    lightpath = (char *)malloc( strlen( get_save_filename_prefix() ) + 9 + 1 );
    sprintf( lightpath, "%slight.tbl", get_save_filename_prefix() );

    bFILE *fp=open_file( lightpath, "rb" );
    int recalc = 0;
    if( fp->open_failure() )
    {
        recalc = 1;
    }
    else
    {
        if (fp->read_uint16()!=calc_crc((uint8_t *)pal->addr(),768))
            recalc=1;
        else
        {
            fp->read(white_light,256*64);
//            fp->read(green_light,256*64);
            for (i=0; i<TTINTS; i++)
                fp->read(tints[i],256);
            fp->read(bright_tint,256);
//            trans_table=(uint8_t *)malloc(256*256);
//            fp.read(trans_table,256*256);
        }
    }
    delete fp;
    fp = NULL;

    if( recalc )
    {
        dprintf("Palette has changed, recalculating light table...\n");
        stat_man->push("white light",NULL);
        int color=0;
        for (; color<256; color++)
        {
            uint8_t r,g,b;
            pal->get(color,r,g,b);
            stat_man->update(color*100/256);
            for (int intensity=63; intensity>=0; intensity--)
            {
                if (r>0 || g>0 || b>0)
                    white_light[intensity*256+color]=pal->find_closest(r,g,b);
                else
                    white_light[intensity*256+color]=0;
                if (r) r--;  if (g) g--;  if (b) b--;
            }
        }
        stat_man->pop();

/*    stat_man->push("green light",NULL);
    for (color=0; color<256; color++)
    {
      stat_man->update(color*100/256);
      uint8_t r,g,b;
      pal->get(color,b,r,g);
      r=r*3/5; b=b*3/5; g+=7; if (g>255) g=255;

      for (int intensity=63; intensity>=0; intensity--)
      {
    if (r>0 || g>0 || b>0)
          green_light[intensity*256+color]=pal->find_closest(r,g,b);
    else
          green_light[intensity*256+color]=0;
    if (r) r--;
    if ((intensity&1)==1)
      if (g) g--;
    if (b) b--;
      }
    }
    stat_man->pop(); */

    stat_man->push("tints",NULL);
    uint8_t t[TTINTS*6]={ 0,0,0,0,0,0, // normal
                   0,0,0,1,0,0,     // red
           0,0,0,1,1,0,     // yellow
           0,0,0,1,0,1,     // purple
           0,0,0,1,1,1,     // gray
           0,0,0,0,1,0,     // green
           0,0,0,0,0,1,     // blue
           0,0,0,0,1,1,     // cyan






           0,0,0,0,0,0   // reverse green  (night vision effect)
         } ;
    uint8_t *ti=t+6;
    uint8_t *c;
    for (i=0,c=tints[0]; i<256; i++,c++) *c=i;  // make the normal tint (maps everthing to itself)
    for (i=0,c=tints[TTINTS-1]; i<256; i++,c++)  // reverse green
    {
      int r=pal->red(i)/2,g=255-pal->green(i)-30,b=pal->blue(i)*3/5+50;
      if (g<0) g=0;
      if (b>255) b=0;
      *c=pal->find_closest(r,g,b);
    }
    for (i=0; i<256; i++)
    {
      int r=pal->red(i)+(255-pal->red(i))/2,
          g=pal->green(i)+(255-pal->green(i))/2,
          b=pal->blue(i)+(255-pal->blue(i))/2;
      bright_tint[i]=pal->find_closest(r,g,b);
    }

    // make the colored tints
    for (i=1; i<TTINTS-1; i++)
    {
      stat_man->update(i*100/(TTINTS-1));
      calc_tint(tints[i],ti[0],ti[1],ti[2],ti[3],ti[4],ti[5],pal);
      ti+=6;
    }
    stat_man->pop();
/*    fprintf(stderr,"calculating transparency tables (256 total)\n");
    trans_table=(uint8_t *)malloc(256*256);

    uint8_t *tp=trans_table;
    for (i=0; i<256; i++)
    {
      uint8_t r1,g1,b1,r2,g2,b2;
      pal->get(i,r1,g1,b1);
      if ((i%16)==0)
        fprintf(stderr,"%d ",i);
      for (int j=0; j<256; j++,tp++)
      {
    if (r1==0 && r2==0 && b2==0)
      *tp=j;
    else
    {
      pal->get(j,r2,g2,b2);
      *tp=pal->find_closest((r2-r1)*3/7+r1,(g2-g1)*3/7+g1,(b2-b1)*3/7+b1);
    }
      }
    }*/


        bFILE *f = open_file( lightpath, "wb" );
        if( f->open_failure() )
            dprintf( "Unable to open file light.tbl for writing\n" );
        else
        {
            f->write_uint16(calc_crc((uint8_t *)pal->addr(),768));
            f->write(white_light,256*64);
//      f->write(green_light,256*64);
            for (int i=0; i<TTINTS; i++)
                f->write(tints[i],256);
            f->write(bright_tint,256);
//    f.write(trans_table,256*256);
        }
        delete f;
    }
    free( lightpath );
}