#include "netcfg.hpp" #include "input.hpp" #include "cache.hpp" #include "sock.hpp" #include "timing.hpp" #include "light.hpp" #include "key_cfg.hpp" extern char *get_login(); extern window_manager *eh; net_configuration *main_net_cfg=NULL; extern char lsf[256]; char *symbol_str(char *name); extern net_protocol *prot; net_configuration::net_configuration() { strcpy(name,get_login()); strcpy(server_name,"My Netgame"); min_players=2; max_players=8; kills=25; port=20202; server_port=20202; game_port=20203; state=SINGLE_PLAYER; } extern void get_zone(); extern char game_name[50]; enum { NET_OK=1, NET_CANCEL, NET_SERVER_NAME, NET_NAME, NET_PORT, NET_SERVER_PORT, NET_MAX, NET_MIN, NET_KILLS, CFG_ERR_OK, NET_SERVER, NET_CLIENT, NET_SINGLE, NET_GAME=400, MIN_1,MIN_2,MIN_3,MIN_4,MIN_5,MIN_6,MIN_7,MIN_8, MAX_2,MAX_3,MAX_4,MAX_5,MAX_6,MAX_7,MAX_8, LVL_2,LVL_4,LVL_8,LEVEL_BOX, ZONE_SELECT } ; void net_configuration::cfg_error(char *msg) { jwindow *j=eh->new_window(-1,0,-1,-1,new info_field(WINDOW_FRAME_LEFT,WINDOW_FRAME_TOP,0,msg, new button(WINDOW_FRAME_LEFT,WINDOW_FRAME_TOP+30,CFG_ERR_OK,symbol_str("ok_button"),NULL)),symbol_str("input_error")); event ev; do { eh->flush_screen(); do { eh->get_event(ev); } while (ev.type==EV_MOUSE_MOVE && eh->event_waiting()); } while (ev.type!=EV_MESSAGE || ev.message.id!=CFG_ERR_OK || ev.type==EV_CLOSE_WINDOW || (ev.type==EV_KEY && ev.key==JK_ESC)); eh->close_window(j); eh->flush_screen(); } int net_configuration::restart_state() { switch (state) { case RESTART_SERVER : case RESTART_CLIENT : case RESTART_SINGLE : return 1; } return 0; } int net_configuration::notify_reset() { switch (state) { case RESTART_SERVER : { state=SERVER; } break; case RESTART_CLIENT : { state=CLIENT; } break; case RESTART_SINGLE : { state=SINGLE_PLAYER; } break; } return 1; } int net_configuration::confirm_inputs(input_manager *i, int server) { if (server) { int mx,mn,pt,kl; if (sscanf(i->get(NET_KILLS)->read(),"%d",&kl)!=1 || kl<1 || kl>99) { error(symbol_str("kill_error")); return 0; } char *nm=i->get(NET_NAME)->read(); if (strstr(nm,"\"")) { error(symbol_str("name_error")); return 0; } strcpy(name,nm); min_players=((ifield *)(i->get(NET_MIN)->read()))->id-MIN_1+1; max_players=((ifield *)(i->get(NET_MAX)->read()))->id-MAX_2+2; if (max_playersget(NET_SERVER_NAME)->read(); if (strstr(s_nm,"\"")) { error(symbol_str("game_error")); return 0; } strcpy(game_name,s_nm); bFILE *fp=open_file("addon/deathmat/gamename.lsp","wb"); if (!fp->open_failure()) { char str[100]; sprintf(str,"(setq gamename \"%s\")\n",game_name); fp->write(str,strlen(str)+1); } delete fp; strcpy(lsf,"addon/deathmat/deathmat.lsp"); fp=open_file("addon/deathmat/levelset.lsp","wb"); if (!fp->open_failure()) { char str[100]; if (((ifield *)(i->get(LEVEL_BOX)->read()))->id==LVL_2) sprintf(str,"(load \"addon/deathmat/small.lsp\")\n"); else if (((ifield *)(i->get(LEVEL_BOX)->read()))->id==LVL_4) sprintf(str,"(load \"addon/deathmat/medium.lsp\")\n"); else sprintf(str,"(load \"addon/deathmat/large.lsp\")\n"); fp->write(str,strlen(str)+1); } delete fp; kills=kl; } else { int mx,mn,pt,s_pt,kl; char *nm=i->get(NET_NAME)->read(); if (strstr(nm,"\"")) { error(symbol_str("name_error")); return 0; } strcpy(name,nm); } bFILE *fp=open_file("addon/deathmat/username.lsp","wb"); if (!fp->open_failure()) { char str[100]; sprintf(str,"(setq username \"%s\")\n",name); fp->write(str,strlen(str)+1); } delete fp; return 1; } extern int start_running,demo_start,start_edit; /*int net_configuration::input() // pulls up dialog box and input fileds { ifield *ilist=NULL; int x=WINDOW_FRAME_LEFT,y=WINDOW_FRAME_TOP; jwindow *sv=eh->new_window(50,80,-1,-1,new button(WINDOW_FRAME_LEFT,WINDOW_FRAME_TOP,NET_SERVER,symbol_str("server"), new button(WINDOW_FRAME_LEFT,WINDOW_FRAME_TOP+eh->font()->height()*2,NET_CLIENT,symbol_str("client"), new button(WINDOW_FRAME_LEFT,WINDOW_FRAME_TOP+eh->font()->height()*4,NET_SINGLE,symbol_str("single_play"), new button(WINDOW_FRAME_LEFT,WINDOW_FRAME_TOP+eh->font()->height()*6,NET_CANCEL,symbol_str("cancel_net"), NULL)))),symbol_str("Networking")); event ev; int done=0; do { eh->flush_screen(); do { eh->get_event(ev); } while (ev.type==EV_MOUSE_MOVE && eh->event_waiting()); if (ev.type==EV_MESSAGE) { if (ev.message.id==NET_SERVER) { done=1; state=RESTART_SERVER; start_edit=0; demo_start=0; start_running=1; } else if (ev.message.id==NET_CLIENT) { done=1; state=RESTART_CLIENT; start_edit=0; demo_start=0; start_running=1; } else if (ev.message.id==NET_SINGLE) { done=1; state=RESTART_SINGLE; start_edit=0; demo_start=0; start_running=0; } else if (ev.message.id==NET_CANCEL) { done=1; } } else if (ev.type==EV_CLOSE_WINDOW || (ev.type==EV_KEY & ev.key==JK_ESC)) done=1; } while (!done); eh->close_window(sv); eh->flush_screen(); if (state==RESTART_SINGLE) { strcpy(lsf,"abuse.lsp"); return 1; } if (ev.message.id==NET_CANCEL || state==RESTART_SINGLE) return 0; if (state==RESTART_SERVER) { ilist=new button(x,y,NET_CANCEL,symbol_str("cancel_button"),ilist); ilist=new button(x,y,NET_OK, symbol_str("server"),ilist); ilist=new text_field(x,y,NET_KILLS,symbol_str("kills_to_win"),"******",kills,ilist); ilist=new text_field(x,y,NET_MAX,symbol_str("max_play"),"******",max_players,ilist); ilist=new text_field(x,y,NET_MIN,symbol_str("min_play"),"******",min_players,ilist); ilist=new text_field(x,y,NET_PORT,symbol_str("use_port"),"******",port,ilist); ilist=new text_field(x,y,NET_NAME,symbol_str("your_name"),"****************",name,ilist); } else { ilist=new button(x,y,NET_CANCEL,symbol_str("cancel_button"),ilist); ilist=new button(x,y,NET_OK,symbol_str("client"),ilist); // ilist=new text_field(x,y,NET_PORT,symbol_str("use_port"),"******",port,ilist); ilist=new text_field(x,y,NET_SERVER_PORT,symbol_str("server_port"),"******",server_port,ilist); ilist=new text_field(x,y,NET_SERVER_NAME,symbol_str("server_name"),"*********************************",game_name,ilist); ilist=new text_field(x,y,NET_NAME,symbol_str("your_name"),"****************",name,ilist); } ifield *i=ilist; for (;i;i=i->next) { i->y=y; int x1,y1,x2,y2; i->area(x1,y1,x2,y2,eh); y=y2+2; } jwindow *nw=eh->new_window(0,0,-1,-1,ilist,symbol_str("Networking")); done=0; do { eh->flush_screen(); do { eh->get_event(ev); } while (ev.type==EV_MOUSE_MOVE && eh->event_waiting()); if (ev.type==EV_MESSAGE && ev.message.id==NET_OK && confirm_inputs(nw,state==RESTART_SERVER)) done=1; if (ev.type==EV_MESSAGE && (ev.message.id==NET_CANCEL || ev.message.id==NET_SINGLE)) done=1; if (ev.type==EV_CLOSE_WINDOW || (ev.type==EV_KEY && ev.key==JK_ESC)) done=1; } while (!done); eh->close_window(nw); eh->flush_screen(); return ev.message.id==NET_OK; } */ void net_configuration::error(char *message) { image *screen_backup=screen->copy(); image *ns=cash.img(cash.reg("art/frame.spe","net_screen",SPEC_IMAGE,1)); int ns_w=ns->width(),ns_h=ns->height(); int x=(xres+1)/2-ns_w/2,y=(yres+1)/2-ns_h/2; ns->put_image(screen,x,y); JCFont *fnt=eh->font(); uchar *remap=white_light+30*256; uchar *sl=screen->scan_line(0); int xx=screen->width()*screen->height(); for (;xx;xx--,sl++) *sl=remap[*sl]; int fx=x+ns_w/2-strlen(message)*fnt->width()/2, fy=y+ns_h/2-fnt->height(); fnt->put_string(screen,fx+1,fy+1,message,eh->black()); fnt->put_string(screen,fx,fy,message,eh->bright_color()); { char *ok=symbol_str("ok_button"); int bx=x+ns_w/2-strlen(ok)*fnt->width()/2-3, by=y+ns_h/2+fnt->height()*3; button *sb=new button(bx,by,NET_SERVER,ok,NULL); input_manager inm(screen,eh,sb); inm.allow_no_selections(); inm.clear_current(); int done=0; event ev; do { eh->flush_screen(); do { eh->get_event(ev); } while (ev.type==EV_MOUSE_MOVE && eh->event_waiting()); inm.handle_event(ev,NULL,eh); if ((ev.type==EV_KEY && (ev.key==JK_ESC || ev.key==JK_ENTER)) || ev.type==EV_MESSAGE) done=1; } while (!done); } screen_backup->put_image(screen,0,0); eh->flush_screen(); delete screen_backup; } ifield *net_configuration::center_ifield(ifield *i,int x1, int x2, ifield *place_below) { int X1,Y1,X2,Y2; i->area(X1,Y1,X2,Y2,eh); i->x=(x1+x2)/2-(X2-X1)/2; if (place_below) { place_below->area(X1,Y1,X2,Y2,eh); i->y=Y2+10; } return i; } int net_configuration::get_options(int server) { image *ns=cash.img(cash.reg("art/frame.spe","net_screen",SPEC_IMAGE,1)); int ns_w=ns->width(),ns_h=ns->height(); int x=(xres+1)/2-ns_w/2,y=(yres/2)-480/2+85; ns->put_image(screen,x,yres/2-480/2); JCFont *fnt=eh->font(); image *ok_image=cash.img(cash.reg("art/frame.spe","dev_ok",SPEC_IMAGE,1))->copy(), *cancel_image=cash.img(cash.reg("art/frame.spe","cancel",SPEC_IMAGE,1))->copy(); ifield *list=NULL; char *nw_s=symbol_str("Networking"); fnt->put_string(screen,x+ns_w/2-strlen(nw_s)*fnt->width()/2,yres/2-480/2+5, nw_s,eh->medium_color()); if (server) { list=center_ifield(new text_field(x,y+30,NET_NAME,symbol_str("your_name"),"************************",name,list),x,x+ns_w,NULL); list=center_ifield(new text_field(0,0,NET_SERVER_NAME,symbol_str("server_name"),"************************",game_name,list),x,x+ns_w,list); list=center_ifield(new info_field(0,0,0,symbol_str("min_play"),list),x,x+ns_w,list); button_box *b=new button_box(0,0,NET_MIN,1,NULL,list); b->add_button(new button(0,0,MIN_8,"8",NULL)); b->add_button(new button(0,0,MIN_7,"7",NULL)); b->add_button(new button(0,0,MIN_6,"6",NULL)); b->add_button(new button(0,0,MIN_5,"5",NULL)); b->add_button(new button(0,0,MIN_4,"4",NULL)); b->add_button(new button(0,0,MIN_3,"3",NULL)); button *r=new button(0,0,MIN_2,"2",NULL); r->push(); b->add_button(r); b->add_button(new button(0,0,MIN_1,"1",NULL)); b->arrange_left_right(eh); center_ifield(b,x,x+ns_w,list); b->arrange_left_right(eh); list=b; list=center_ifield(new info_field(0,0,0,symbol_str("max_play"),list),x,x+ns_w,list); b=new button_box(0,0,NET_MAX,1,NULL,list); button *q=new button(0,0,MAX_8,"8",NULL); q->push(); b->add_button(q); b->add_button(new button(0,0,MAX_7,"7",NULL)); b->add_button(new button(0,0,MAX_6,"6",NULL)); b->add_button(new button(0,0,MAX_5,"5",NULL)); b->add_button(new button(0,0,MAX_4,"4",NULL)); b->add_button(new button(0,0,MAX_3,"3",NULL)); b->add_button(new button(0,0,MAX_2,"2",NULL)); b->arrange_left_right(eh); center_ifield(b,x,x+ns_w,list); b->arrange_left_right(eh); list=b; list=center_ifield(new info_field(0,0,0,symbol_str("level_size"),list),x,x+ns_w,list); b=new button_box(0,0,LEVEL_BOX,1,NULL,list); b->add_button(new button(0,0,LVL_8,symbol_str("lvl_8"),NULL)); b->add_button(new button(0,0,LVL_4,symbol_str("lvl_4"),NULL)); q=new button(0,0,LVL_2,symbol_str("lvl_2"),NULL); q->push(); b->add_button(q); b->arrange_left_right(eh); center_ifield(b,x,x+ns_w,list); b->arrange_left_right(eh); list=b; list=center_ifield(new text_field(0,0,NET_KILLS,symbol_str("kills_to_win"),"***","25",list),x,x+ns_w,list); } else { list=center_ifield(new text_field(x,y+80,NET_NAME,symbol_str("your_name"),"************************",name,list),x,x+ns_w,NULL); } list=new button(x+308-17,yres/2+480/2-45-fnt->height(),NET_OK,ok_image,list); list=new button(x+308+17,yres/2+480/2-45-fnt->height(),NET_CANCEL,cancel_image,list); int ret=0; { input_manager inm(screen,eh,list); inm.allow_no_selections(); inm.clear_current(); int done=0; event ev; do { eh->flush_screen(); do { eh->get_event(ev); } while (ev.type==EV_MOUSE_MOVE && eh->event_waiting()); inm.handle_event(ev,NULL,eh); if (ev.type==EV_MESSAGE) { switch (ev.message.id) { case NET_OK : { if (confirm_inputs(&inm,server)) { ret=1; done=1; } else { ((button *)inm.get(NET_OK))->push(); inm.redraw(); } } break; case NET_CANCEL : done=1; } } if (ev.type==EV_KEY && ev.key==JK_ESC) done=1; } while (!done); } delete ok_image; delete cancel_image; return ret; } int net_configuration::input() // pulls up dialog box and input fileds { int ret=0; screen->clear(); image *ns=cash.img(cash.reg("art/frame.spe","net_screen",SPEC_IMAGE,1)); int ns_w=ns->width(),ns_h=ns->height(); int x=(xres+1)/2-ns_w/2,y=(yres+1)/2-ns_h/2; ns->put_image(screen,x,y); char *nw_s=symbol_str("Networking"); JCFont *fnt=eh->font(); eh->font()->put_string(screen,x+ns_w/2-strlen(nw_s)*fnt->width()/2,y+21/2-fnt->height()/2, nw_s,eh->medium_color()); { button *first,**last; last=&first; char *server_str=symbol_str("server"); button *sb=new button(x+40,y+ns_h-28-fnt->height(),NET_SERVER,server_str,NULL); *last=sb; last=(button **)(&(*last)->next); button *zb; if (!strcmp(prot->name(),"AppleTalk")) { char *zone_str="Select Zone"; zb=new button(xres/2+320-strlen(zone_str)*eh->font()->width()-10, y+ns_h-28-fnt->height(), ZONE_SELECT,zone_str,0); *last=zb; last=(button **)(&(*last)->next); } if (main_net_cfg && (main_net_cfg->state==CLIENT || main_net_cfg->state==SERVER)) { sb=new button(x+40,y+ns_h-9-fnt->height(),NET_SINGLE,symbol_str("single_play"),0); *last=sb; last=(button **)(&(*last)->next); } input_manager inm(screen,eh,first); inm.allow_no_selections(); inm.clear_current(); event ev; int done=0; int button_y=25,total_games=0; enum { MAX_GAMES=9 }; net_address *game_addr[MAX_GAMES+1]; int join_game=-1; time_marker start,now; do { if (eh->event_waiting()) { do { eh->get_event(ev); } while (ev.type==EV_MOUSE_MOVE && eh->event_waiting()); inm.handle_event(ev,NULL,eh); if (ev.type==EV_MESSAGE) { switch (ev.message.id) { case ZONE_SELECT : { zb->push(); inm.redraw(); get_zone(); } break; case NET_CANCEL : done=1; break; case NET_SERVER : done=1; break; case NET_SINGLE : done=1; break; default : if (ev.message.id>=NET_GAME && ev.message.idflush_screen(); char name[256]; now.get_time(); if (total_games0.5) { start.get_time(); net_address *find=prot->find_address(0x9090,name); // was server_port if (find) { int bw=strlen(name)*fnt->width(); inm.add(new button(x+ns_w/2-bw/2,y+button_y,NET_GAME+total_games,name,NULL)); if (find->protocol_type() != net_address::ATALK) find->set_port(server_port); game_addr[total_games]=find; total_games++; button_y+=fnt->height()+10; inm.redraw(); } } } while (!done); prot->reset_find_list(); if (join_game>=0) { if (get_options(0)) { int still_there=1; // change this back to 0, to check if games are stil alive time_marker start,now; do { now.get_time(); char name[256]; net_address *find=prot->find_address(0x9090,name); // was server_port if (find) { if (find->equal(game_addr[join_game])) still_there=1; delete find; } } while (now.diff_time(&start)<3 && !still_there); if (still_there) { game_addr[join_game]->store_string(server_name,sizeof(server_name)); addr = game_addr[join_game]->copy(); state=RESTART_CLIENT; ret=1; } else error(symbol_str("not_there")); prot->reset_find_list(); int i; for (i=0;i