VolumeWindow::VolumeWindow() : Jwindow("Volume") { char const *ff = "art/frame.spe"; u_u = cache.reg(ff, "u_u", SPEC_IMAGE, 1), u_d = cache.reg(ff, "u_u", SPEC_IMAGE, 1), u_ua = cache.reg(ff, "u_ua", SPEC_IMAGE, 1), u_da = cache.reg(ff, "u_da", SPEC_IMAGE, 1), d_u = cache.reg(ff, "d_u", SPEC_IMAGE, 1), d_d = cache.reg(ff, "d_u", SPEC_IMAGE, 1), d_ua = cache.reg(ff, "d_ua", SPEC_IMAGE, 1), d_da = cache.reg(ff, "d_da", SPEC_IMAGE, 1), slider = cache.reg(ff, "volume_slide", SPEC_IMAGE, 1); m_pos.x = prop->getd("volume_x", xres / 2 - 20); m_pos.y = prop->getd("volume_y", yres / 2 - 50); //AR center text int text_x = 8; if(settings.big_font) text_x = 1; inm->add(new ico_button(10, 27, ID_SFX_DOWN, d_u, d_d, d_ua, d_da, new ico_button(21, 27, ID_SFX_UP, u_u, u_d, u_ua, u_da, new info_field(text_x, 38, 0, symbol_str("SFXv"), new ico_button(10, 72, ID_MUSIC_DOWN, d_u, d_d, d_ua, d_da, new ico_button(21, 72, ID_MUSIC_UP, u_u, u_d, u_ua, u_da, new info_field(text_x, 82, 0, symbol_str("MUSICv"), NULL))))))); //reconfigure(); bg = cache.reg(ff, "vcontrol", SPEC_IMAGE, 1); m_size = cache.img(bg)->Size(); m_surf = new image(m_size, NULL, 2); redraw(); }
void show_stats() { if (current_level) { fade_out(8); wm->SetMousePos(ivec2(0, 0)); main_screen->clear(); image *im=cache.img(cache.reg("art/frame.spe","end_level_screen",SPEC_IMAGE,1)); main_screen->PutImage(im, ivec2(0, 0)); int x1=im->Size().x+1,y1=0,x2=xres,y2=main_screen->Size().y; fade_in(NULL,16); char name[50]; strcpy(name,current_level->original_name()); char dig1=name[strlen(name)-strlen(".spe")-2]; char dig2=name[strlen(name)-strlen(".spe")-1]; char msg[50]; if (isdigit(dig1) && isdigit(dig2)) { if (dig1!='0') sprintf(msg,"%s : %c%c",symbol_str("lev_complete"),dig1,dig2); else sprintf(msg,"%s : %c",symbol_str("lev_complete"),dig2); } else sprintf(msg,"%s : %s",symbol_str("lev_complete"),current_level->original_name()); int w = wm->font()->Size().x * strlen(msg), h = wm->font()->Size().y; int x=(x1+x2)/2-w/2,y=(y1+y2)/2-h/2; main_screen->Bar(ivec2(x - 10, y - 10), ivec2(x + w + 10, y + h + 10), wm->bright_color()); main_screen->Bar(ivec2(x - 9, y - 9), ivec2(x + w + 9, y + h + 9), wm->medium_color()); wm->font()->PutString(main_screen, ivec2(x + 1, y + 1), msg, wm->dark_color()); wm->font()->PutString(main_screen, ivec2(x, y), msg, wm->bright_color()); wm->flush_screen(); Timer now; now.WaitMs(500); } }
int CrcManager::write_crc_file(char const *filename) // return 0 on failure { const size_t msgsize = 100; char msg[msgsize]; snprintf(msg, msgsize, "%s", symbol_str("calc_crc")); // this may take some time, show the user a status indicator if (stat_man) stat_man->push(msg,NULL); int i,total=0; for (i=0; i<total_files; i++) { int failed=0; get_crc(i,failed); if (failed) { jFILE *fp=new jFILE(get_filename(i),"rb"); if (!fp->open_failure()) { set_crc(i,crc_file(fp)); total++; } delete fp; } else total++; if (stat_man) stat_man->update(i*100/total_files); } if (stat_man) stat_man->pop(); jFILE *fp=new jFILE(NET_CRC_FILENAME,"wb"); if (fp->open_failure()) { delete fp; return 0; } fp->write_uint16(total); total=0; for (i=0; i<total_files; i++) { uint32_t crc; int failed=0; crc=get_crc(i,failed); if (!failed) { fp->write_uint32(crc); uint8_t len=strlen(get_filename(i))+1; fp->write_uint8(len); fp->write(get_filename(i),len); total++; } } delete fp; return 1; }
int get_inputs_from_server(unsigned char *buf) { if (prot && base->input_state!=INPUT_PROCESSING) // if input is not here, wait on it { time_marker start; int total_retry=0; Jwindow *abort=NULL; while (base->input_state!=INPUT_PROCESSING) { if (!prot) { base->input_state=INPUT_PROCESSING; return 1; } service_net_request(); time_marker now; // if this is taking to long, the packet was probably lost, ask for it to be resent if (now.diff_time(&start)>0.05) { if (prot->debug_level(net_protocol::DB_IMPORTANT_EVENT)) fprintf(stderr,"(missed packet)"); game_face->input_missing(); start.get_time(); total_retry++; if (total_retry==12000) // 2 minutes and nothing { abort=wm->CreateWindow(ivec2(0, yres / 2), ivec2(-1, wm->font()->Size().y*4), new info_field(0, 0, 0, symbol_str("waiting"), new button(0, wm->font()->Size().y + 5, ID_NET_DISCONNECT, symbol_str("slack"),NULL)),symbol_str("Error")); wm->flush_screen(); } } if (abort) { if (wm->IsPending()) { Event ev; do { wm->get_event(ev); if (ev.type==EV_MESSAGE && ev.message.id==ID_NET_DISCONNECT) { kill_slackers(); base->input_state=INPUT_PROCESSING; } } while (wm->IsPending()); wm->flush_screen(); } } } if (abort) { wm->close_window(abort); the_game->reset_keymap(); } } memcpy(base->last_packet.data,base->packet.data,base->packet.packet_size()+base->packet.packet_prefix_size()); int size=base->packet.packet_size(); memcpy(buf,base->packet.packet_data(),size); base->packet.packet_reset(); base->mem_lock=0; return size; }
void show_stats() { if (current_level) { int xp,yp; if (!player_list->next) { fade_out(8); eh->set_mouse_position(0,0); screen->clear(); switch_mode(VMODE_640x480); load_image_into_screen("art/frame.spe","end_level_screen",xp,yp); fade_in(NULL,16); } else { xp=screen->width()/2-640/2; yp=screen->height()/2-480/2; } char name[50]; strcpy(name,current_level->original_name()); char dig1=name[strlen(name)-strlen(".spe")-2]; char dig2=name[strlen(name)-strlen(".spe")-1]; char msg[50]; int lev_num; if (isdigit(dig1) && isdigit(dig2)) lev_num=(dig1-'0')*10+dig2-'0'; else lev_num=dig2-'0'; sprintf(msg,symbol_str("lev_complete"),lev_num); int w=eh->font()->width()*strlen(msg),h=eh->font()->height(); int x1=0,y1=0,x2=xres,y2=yres; // int x=(x1+x2)/2-w/2,y=(y1+y2)/2-h/2; int x=444+xp,y=293+yp; eh->font()->put_string(screen,x+1,y+1,msg,eh->dark_color()); eh->font()->put_string(screen,x,y,msg,eh->bright_color()); y+=eh->font()->height(); sprintf(msg,"Time taken.. %0.1f minutes",current_level->time_taken()/60.0); eh->font()->put_string(screen,x+1,y+1,msg,eh->dark_color()); eh->font()->put_string(screen,x,y,msg,eh->bright_color()); y+=eh->font()->height(); sprintf(msg,"Kills....... %d",player_list->kills); eh->font()->put_string(screen,x+1,y+1,msg,eh->dark_color()); eh->font()->put_string(screen,x,y,msg,eh->bright_color()); eh->flush_screen(); stat_show_start.get_time(); old_stat=stat_man; stat_man=new next_level_status_manager(xp+443,yp+424,xp+589,yp+443,93); } }
void net_reload() { if (prot) { if (net_server) { if (current_level) delete current_level; bFILE *fp; if (!reload_start()) return ; do { // make sure server saves the file fp=open_file(NET_STARTFILE,"rb"); if (fp->open_failure()) { delete fp; fp=NULL; } } while (!fp); spec_directory sd(fp); #if 0 spec_entry *e=sd.find("Copyright 1995 Crack dot Com, All Rights reserved"); if (!e) { the_game->show_help("This level is missing copyright information, cannot load\n"); current_level=new level(100,100,"untitled"); the_game->need_refresh(); } else #endif current_level=new level(&sd,fp,NET_STARTFILE); delete fp; base->current_tick=(current_level->tick_counter()&0xff); reload_end(); } else if (current_level) { join_struct *join_list=base->join_list; while (join_list) { view *f=player_list; for (; f && f->next; f=f->next); // find last player, add one for pn int i,st=0; for (i=0; i<total_objects; i++) if (!strcmp(object_names[i],"START")) st=i; game_object *o=create(current_start_type,0,0); game_object *start=current_level->get_random_start(320,NULL); if (start) { o->x=start->x; o->y=start->y; } else { o->x=100; o->y=100; } f->next=new view(o,NULL,join_list->client_id); strncpy(f->next->name,join_list->name, view::namesize); o->set_controller(f->next); f->next->set_tint(f->next->player_number); if (start) current_level->add_object_after(o,start); else current_level->add_object(o); view *v = f->next; v->m_aa = ivec2(5); v->m_bb = ivec2(319, 199) - ivec2(5); join_list = join_list->next; } base->join_list=NULL; current_level->save(NET_STARTFILE,1); base->mem_lock=0; Jwindow *j=wm->CreateWindow(ivec2(0, yres / 2), ivec2(-1), new info_field(0, 0, 0, symbol_str("resync"), new button(0, wm->font()->Size().y + 5, ID_NET_DISCONNECT, symbol_str("slack"),NULL)),symbol_str("hold!")) ; wm->flush_screen(); if (!reload_start()) return ; base->input_state=INPUT_RELOAD; // if someone missed the game tick with the RELOAD data in it, make sure the get it // wait for all client to reload the level with the new players do { service_net_request(); if (wm->IsPending()) { Event ev; do { wm->get_event(ev); if (ev.type==EV_MESSAGE && ev.message.id==ID_NET_DISCONNECT) { game_face->end_reload(1); base->input_state=INPUT_PROCESSING; } } while (wm->IsPending()); wm->flush_screen(); } } while (!reload_end()); wm->close_window(j); unlink(NET_STARTFILE); the_game->reset_keymap(); base->input_state=INPUT_COLLECTING; } } }
int net_init(int argc, char **argv) { int i,x,db_level=0; base=&local_base; local_client_number=0; if (!main_net_cfg) main_net_cfg=new net_configuration; for (i=1; i<argc; i++) { if (!strcmp(argv[i],"-nonet")) { printf( "Net: Disabled (-nonet)\n" ); return 0; } else if (!strcmp(argv[i],"-port")) { if( i == argc - 1 || !sscanf( argv[i + 1], "%d", &x ) || x < 1 || x > 0x7fff ) { fprintf( stderr, "Net: Bad value following -port, use 1..32000\n" ); return 0; } else { main_net_cfg->port = x; } } else if( !strcmp( argv[i], "-net" ) && i < argc-1 ) { i++; strncpy(main_net_cfg->server_name, argv[i], sizeof(main_net_cfg->server_name) - 1); main_net_cfg->server_name[sizeof(main_net_cfg->server_name) - 1] = '\0'; main_net_cfg->state = net_configuration::CLIENT; } else if (!strcmp(argv[i],"-ndb")) { if (i==argc-1 || !sscanf(argv[i+1],"%d",&x) || x<1 || x>3) { fprintf(stderr,"Net: Bad value following -ndb, use 1..3\n" ); return 0; } else { db_level = x; } } else if( !strcmp( argv[i], "-server" ) ) { main_net_cfg->state = net_configuration::SERVER; } else if( !strcmp( argv[i], "-min_players" ) ) { i++; int x = atoi( argv[i] ); if (x >= 1 && x <= 8) { main_net_cfg->min_players=x; } else { fprintf(stderr,"bad value for min_players use 1..8\n"); } } } net_protocol *n = net_protocol::first, *usable = NULL; // find a usable protocol from installed list int total_usable = 0; for( ; n; n = n->next ) // show a list of usables, just to be cute { fprintf( stderr, "Protocol %s : ",n->installed() ? "Installed" : "Not_installed" ); fprintf( stderr, "%s\n", n->name() ); if( n->installed() ) { total_usable++; usable=n; } } if (!usable) { fprintf(stderr,"Net: No network protocols installed\n"); return 0; } prot=usable; prot->set_debug_printing((net_protocol::debug_type)db_level); if (main_net_cfg->state==net_configuration::SERVER) set_login(main_net_cfg->name); comm_sock=game_sock=NULL; if (main_net_cfg->state==net_configuration::CLIENT) { dprintf("Attempting to locate server %s, please wait\n",main_net_cfg->server_name); char const *sn=main_net_cfg->server_name; net_server=prot->get_node_address(sn,DEFAULT_COMM_PORT,0); if (!net_server) { dprintf(symbol_str("unable_locate")); exit(0); } dprintf("Server located! Please wait while data loads....\n"); } #if HAVE_NETWORK fman = new file_manager(argc,argv,prot); // manages remote file access #endif game_face = new game_handler; join_array=(join_struct *)malloc(sizeof(join_struct)*MAX_JOINERS); base->join_list=NULL; base->mem_lock=0; base->calc_crcs=0; base->get_lsf=0; base->wait_reload=0; base->need_reload=0; base->input_state=INPUT_COLLECTING; base->current_tick=0; base->packet.packet_reset(); return 1; }
void menu_handler(event &ev, input_manager *inm) { switch (ev.type) { case EV_MESSAGE : { switch (ev.message.id) { case ID_LIGHT_OFF : if (!volume_window) { screen->clear(); eh->flush_screen(); gamma_correct(pal,1); fade_in(cash.img(title_screen),8); inm->redraw(); eh->flush_screen(); } break; case ID_RETURN : if (!volume_window) { the_game->set_state(RUN_STATE); } break; case ID_START_GAME : if (!volume_window) { the_game->load_level(level_file); the_game->set_state(RUN_STATE); view *v; for (v=player_list;v;v=v->next) if (v->focus) v->reset_player(); } break; case ID_LOAD_PLAYER_GAME : if (!volume_window) { int got_level=load_game(0,symbol_str("LOAD")); the_game->reset_keymap(); if (got_level) { char name[50]; sprintf(name,"save%04d.spe",got_level); the_game->load_level(name); the_game->set_state(RUN_STATE); } } break; case ID_VOLUME : if (!volume_window) { create_volume_window(); } break; case ID_MEDIUM : { set_symbol_value(l_difficulty,l_medium); save_difficulty(); } break; case ID_HARD : { set_symbol_value(l_difficulty,l_hard); save_difficulty(); } break; case ID_EXTREME : { set_symbol_value(l_difficulty,l_extreme); save_difficulty(); } break; case ID_EASY : { set_symbol_value(l_difficulty,l_easy); save_difficulty(); } break; case ID_NETWORKING : { if (!volume_window) { net_configuration *cfg=new net_configuration; if (cfg->input()) { if (main_net_cfg) delete main_net_cfg; main_net_cfg=cfg; } else delete cfg; the_game->draw(0); inm->redraw(); } } break; case ID_SHOW_SELL : if (!volume_window) { show_sell(1); screen->clear(); if (title_screen>=0) { image *tit=cash.img(title_screen); tit->put_image(screen,screen->width()/2-tit->width()/2, screen->height()/2-tit->height()/2); } inm->redraw(); fade_in(NULL,8); eh->flush_screen(); } break; case ID_MACKEYS : do_key_config(eh); /* fade_out(8); RestoreMac(); MacKeyConfigMenu(); UnRestoreMac(); */ fade_in(cash.img(title_screen),8); inm->redraw(); eh->flush_screen(); break; case ID_MACCONF : do_monitor_config(eh); fade_in(cash.img(title_screen),8); inm->redraw(); eh->flush_screen(); break; } break; } break; case EV_CLOSE_WINDOW : { if (ev.window==volume_window) { eh->close_window(volume_window); volume_window=NULL; } } break; } }
int request_server_entry() { if (prot && main_net_cfg) { if (!net_server) return 0; if (game_sock) delete game_sock; dprintf("Joining game in progress, hang on....\n"); game_sock=prot->create_listen_socket(main_net_cfg->port+2,net_socket::SOCKET_FAST); // this is used for fast game packet transmission if (!game_sock) { if (comm_sock) delete comm_sock; comm_sock=NULL; prot=NULL; return 0; } game_sock->read_selectable(); net_socket *sock=prot->connect_to_server(net_server,net_socket::SOCKET_SECURE); if (!sock) { fprintf(stderr,"unable to connect to server\n"); return 0; } uint8_t ctype=CLIENT_ABUSE; uint16_t port=lstl(main_net_cfg->port+2),cnum; uint8_t reg; if (sock->write(&ctype,1)!=1 || // send server out game port sock->read(®,1)!=1) // is remote engine registered? { delete sock; return 0; } if (reg==2) // too many players { fprintf(stderr, "%s", symbol_str("max_players")); delete sock; return 0; } // make sure the server is registered or sync problems will occur if (!reg) { fprintf(stderr, "%s", symbol_str("server_not_reg")); delete sock; return 0; } const size_t unamesize = 256; char uname[unamesize]; strncpy(uname, get_login(), unamesize); uint8_t len=strlen(uname)+1; short nkills; if (sock->write(&len,1)!=1 || sock->write(uname,len)!=len || sock->write(&port,2)!=2 || // send server out game port sock->read(&port,2)!=2 || // read server's game port sock->read(&nkills,2)!=2 || sock->read(&cnum,2)!=2 || cnum==0 // read player number (cannot be 0 because 0 is server) ) { delete sock; return 0; } nkills=lstl(nkills); port=lstl(port); cnum=lstl(cnum); main_net_cfg->kills=nkills; net_address *addr=net_server->copy(); addr->set_port(port); delete game_face; game_face=new game_client(sock,addr); delete addr; local_client_number=cnum; return cnum; } return 0; }
static void create_volume_window() { /* int vx=WINDOW_FRAME_LEFT,vy=WINDOW_FRAME_TOP+eh->font()->height()*2,scroller_height=130,bh=eh->font()->height()+5; volume_window=eh->new_window(prop->getd("volume_x",xres/2-20), prop->getd("volume_y",yres/2-50), -1, -1, new scroller(vx,vy,LOWER_SFX,0,scroller_height,0,127, new scroller(vx+30,vy,LOWER_MUSIC,0,scroller_height,0,127,NULL)),symbol_str("VOLUME")); event ev; int done=0; do { eh->flush_screen(); eh->get_event(ev); if (ev.type==EV_CLOSE_WINDOW && ev.window==volume_window) done=1; } while (!done); eh->close_window(volume_window); volume_window=NULL; */ char *ff="art/frame.spe"; int t=SPEC_IMAGE; int u_u=cash.reg(ff,"u_u",t,1), u_d=cash.reg(ff,"u_u",t,1), u_ua=cash.reg(ff,"u_ua",t,1), u_da=cash.reg(ff,"u_da",t,1), d_u=cash.reg(ff,"d_u",t,1), d_d=cash.reg(ff,"d_u",t,1), d_ua=cash.reg(ff,"d_ua",t,1), d_da=cash.reg(ff,"d_da",t,1), slider=cash.reg(ff,"volume_slide",t,1); image *ok_image=cash.img(cash.reg("art/frame.spe","dev_ok",SPEC_IMAGE,1))->copy(); volume_window=eh->new_window(prop->getd("volume_x",xres-185), prop->getd("volume_y",yres/2-50), 120-WINDOW_FRAME_LEFT-WINDOW_FRAME_RIGHT-2, 163-WINDOW_FRAME_TOP-WINDOW_FRAME_BOTTOM, new ico_button(62,112,ID_SFX_DOWN,d_u,d_d,d_ua,d_da, new ico_button(24,18,ID_SFX_UP,u_u,u_d,u_ua,u_da, new button(17,127,ID_QUIT_OK,ok_image, new info_field(35,0,0,symbol_str("SFXv"),0))))); /* new ico_button(10,72,ID_MUSIC_DOWN,d_u,d_d,d_ua,d_da, new ico_button(21,72,ID_MUSIC_UP,u_u,u_d,u_ua,u_da, new info_field(3,86,0,symbol_str("MUSICv"), NULL))))))); */ cash.img(cash.reg(ff,"vcontrol",t,1))->put_image(volume_window->screen,0,0); // draw_music_vol(slider); draw_sfx_vol(slider); volume_window->inm->redraw(); eh->grab_focus(volume_window); eh->flush_screen(); volume_window->inm->allow_no_selections(); volume_window->inm->clear_current(); event ev; do { do { eh->get_event(ev); } while (ev.type==EV_MOUSE_MOVE && eh->event_waiting()); eh->flush_screen(); if (ev.type==EV_MESSAGE) { switch (ev.message.id) { case ID_SFX_UP : { if (volume_window) { sfx_volume+=16; if (sfx_volume>127) sfx_volume=127; draw_sfx_vol(slider); char *s="sfx/ambtech1.wav"; if (sound_avail&SFX_INITIALIZED) cash.sfx(cash.reg(s,s,SPEC_EXTERN_SFX,1))->play(sfx_volume); } } break; case ID_SFX_DOWN : { if (volume_window) { sfx_volume-=16; if (sfx_volume<0) sfx_volume=0; draw_sfx_vol(slider); char *s="sfx/ambtech1.wav"; if (sound_avail&SFX_INITIALIZED) cash.sfx(cash.reg(s,s,SPEC_EXTERN_SFX,1))->play(sfx_volume); } } break; case ID_MUSIC_UP : { if (volume_window) { music_volume+=16; if (music_volume>127) music_volume=127; draw_music_vol(slider); if (current_song) current_song->set_volume(music_volume); } } break; case ID_MUSIC_DOWN : { if (volume_window) { music_volume-=16; if (music_volume<0) music_volume=0; draw_music_vol(slider); if (current_song) current_song->set_volume(music_volume); } } break; case ID_QUIT_OK : { eh->close_window(volume_window); volume_window=NULL; } } } else if (ev.type==EV_CLOSE_WINDOW || (ev.type==EV_KEY && ev.key==JK_ESC)) { eh->close_window(volume_window); volume_window=NULL; } } while (volume_window); delete ok_image; }
int load_game(int show_all, char *title) // return 0 if the player escapes, else return the number of the game to load { int *save_buts=xres>320 ? big_save_buts : small_save_buts; int total_saved=0; int no_more=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[50]; sprintf(name,"save%04d.spe",start_num+1); int fail=0; 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(se,fp); if (thumb_nails[start_num]->width()>max_w) max_w=thumb_nails[start_num]->width(); if (thumb_nails[start_num]->height()>max_h) max_h=thumb_nails[start_num]->height(); if (!first) first=thumb_nails[start_num]; total_saved++; } else fail=1; } if (fail && show_all) { thumb_nails[start_num]=new image(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,ih=cash.img(save_buts[0])->height(); /* ico_button *buts[MAX_SAVE_GAMES]; int y=WINDOW_FRAME_TOP; for (i=0;i<total_saved;i++,y+=ih) { buts[i]=new ico_button(WINDOW_FRAME_LEFT,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,thumb_nails); int py=xres>320 ? l_win->y+l_win->h/2-135/2 : l_win->y; jwindow *preview=eh->new_window(l_win->x+l_win->l+5,py,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 { eh->flush_screen(); eh->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_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()); } if ((ev.type==EV_CLOSE_WINDOW) || (ev.type==EV_KEY && ev.key==JK_ESC)) quit=1; } while (!got_level && !quit); eh->close_window(l_win); eh->close_window(preview); for (i=0;i<total_saved;i++) if (thumb_nails[i]) delete thumb_nails[i]; return got_level; }
int get_inputs_from_server(unsigned char *buf) { if (idle_man) idle_man->idle_reset(); if (prot && base->input_state!=INPUT_PROCESSING) // if input is not here, wait on it { time_marker start; int total_retry=0; jwindow *abort=NULL; while (base->input_state!=INPUT_PROCESSING) { if (!prot) { base->input_state=INPUT_PROCESSING; return 1; } service_net_request(); time_marker now; // if this is taking to long, the packet was probably lost, ask for it to be resent if (now.diff_time(&start)>0.05) { if (idle_man) idle_man->idle(); if (prot->debug_level(net_protocol::DB_IMPORTANT_EVENT)) dprintf("(missed packet)"); if (game_face) game_face->input_missing(); start.get_time(); total_retry++; if (total_retry==12000) // 2 minutes and nothing { abort=eh->new_window(0,yres/2,-1,eh->font()->height()*4, new info_field(WINDOW_FRAME_LEFT, WINDOW_FRAME_TOP, 0,symbol_str("waiting"), new button(WINDOW_FRAME_LEFT, WINDOW_FRAME_TOP+eh->font()->height()+5,ID_NET_DISCONNECT, symbol_str("slack"),NULL)),symbol_str("Error")); eh->flush_screen(); } } if (abort) { if (eh->event_waiting()) { event ev; do { eh->get_event(ev); if (ev.type==EV_MESSAGE && ev.message.id==ID_NET_DISCONNECT) { kill_slackers(); base->input_state=INPUT_PROCESSING; } } while (eh->event_waiting()); eh->flush_screen(); } } } if (abort) { eh->close_window(abort); the_game->reset_keymap(); } } memcpy(base->last_packet.data,base->packet.data,base->packet.packet_size()+base->packet.packet_prefix_size()); int size=base->packet.packet_size(); memcpy(buf,base->packet.packet_data(),size); base->packet.packet_reset(); base->mem_lock=0; return size; }
int request_server_entry() { if (prot && main_net_cfg) { if (!net_server) return 0; if (game_sock) delete game_sock; dprintf("Joining game in progress, hang on....\n"); int game_port = main_net_cfg->game_port; game_sock=prot->create_listen_socket(game_port,net_socket::SOCKET_FAST); // this is used for fast game packet transmission if (!game_sock) { if (comm_sock) delete comm_sock; comm_sock=NULL; prot=NULL; return 0; } game_sock->read_selectable(); main_net_cfg->game_port = game_port; net_socket *sock=prot->connect_to_server(net_server,net_socket::SOCKET_SECURE); if (!sock) { dprintf("unable to connect to server\n"); return 0; } uchar ctype=CLIENT_ABUSE; ushort port=lstl(game_port),cnum; uchar reg; if (sock->write(&ctype,1)!=1 || // send server our game port sock->read(®,1)!=1) // is remote engine registered? { delete sock; return 0; } if (reg==2) // too many players { dprintf(symbol_str("max_players")); delete sock; return 0; } // maker sure the two games are both registered or unregistered or sync problems // will occur. if (reg && !registered) { dprintf(symbol_str("net_not_reg")); delete sock; return 0; } if (!reg && registered) { dprintf(symbol_str("server_not_reg")); delete sock; return 0; } char uname[256]; if (get_login()) strcpy(uname,get_login()); else strcpy(uname,"unknown"); uchar len=strlen(uname)+1; short nkills; if (sock->write(&len,1)!=1 || sock->write(uname,len)!=len || sock->write(&port,2)!=2 || // send server our game port sock->read(&port,2)!=2 || // read server's game port sock->read(&nkills,2)!=2 || sock->read(&cnum,2)!=2 || cnum==0 // read player number (cannot be 0 because 0 is server) ) { delete sock; return 0; } nkills=lstl(nkills); port=lstl(port); cnum=lstl(cnum); main_net_cfg->kills=nkills; net_address *addr=net_server->copy(); addr->set_port(port); if (game_face) delete game_face; game_face=new game_client(sock,addr); delete addr; local_client_number=cnum; return cnum; } else return 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; }