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); } }
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; }
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; }
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(); }
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); }
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; }
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 }
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 ); }