Exemple #1
0
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();
}
Exemple #2
0
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;
}
Exemple #5
0
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;
}
Exemple #8
0
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(&reg,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;
}
Exemple #10
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;
}
Exemple #11
0
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;
}
Exemple #12
0
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;
}
Exemple #13
0
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(&reg,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;
}
Exemple #14
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;
}