/////////////////////////////////////////////////////////// ////// M.A.S.E text client ////// ////// Released under the GPL ////// see gpl.txt ////// Written by and copyrighted by: ////// Michael Gibson ////// (c)2003, 2004, 2006 /////////////////////////////////////////////////////////// // Because of the simplicity of this client // It works well for testing and speed of updating code. /////////////////////////////////////////////////////////// #include #include #include #include #include #include #include #include #include #include #define BUFF 251 #define LEN 1024 int debug=0; char my_ip[50]; char eth_card[50]; int sockfd, server2; struct sockaddr_in serv_addr, cli_addr; struct protoent *ppe; struct sockaddr_in sin; struct sockaddr_in cliAddr, servAddr;// UDP server structure int bind1; # define BUFFSIZE 1024 char buff[BUFFSIZE]="inet.h"; char systemtext[70]; char server_ip[30]; int server_port, ptype; int my_port=1112; char packet[1024]; char new_packet[1024]; int map[25]; //display map char player_move; //direction player is moving int player_gld=0; //player starts with none int player_slv=0; //player starts with none int player_cpr=0; //player starts with none int player_x=0; //player x location int player_y=0; //player y location int player_str; int player_dex; int player_exp; int player_rac; //1=human,2=elf,3=halfling,4=dwarf int player_sex; //1=male, 2=female char player_name[50]; char string_rac[25]; int player_num; int player_wep; //1=battleaxe, 2=sword, 3=dagger int player_head=1; //not currently used int player_hair=1; //not currently used int player_body=1; //not currently used int player_armor=0; //0=none, 1=leather, 2=chain, 3=breastplate int player_helmet=0; //0=none, 1=plate int total_armor; int wep_wear; int dex_adj; int true_dex; int startgame=0; //1 when game is started void Rsocket(); void Rconnect(); void ReadConf(); void udp_server(); void start_game(); void report_move_to_server(); void character_setup(); void text_display(); void tcp_logon(); void find_ip(); void command_loop(); ///////////////////////////////////////////////////// // ///////////////////////////////////////////////////// int main() { character_setup(); text_display(); ptype=1; Rsocket(); Rconnect(); find_ip(); tcp_logon(); ptype=2; Rsocket(); Rconnect(); command_loop(); return(0); } /////////////////////////////////////////// // /////////////////////////////////////////// void character_setup() { int temp_int; printf("Character and network setup\n\n"); printf("Step 1: Register character on server\n"); printf(" Please choose Race\n"); printf(" 1 for Human\n"); printf(" 2 for Elf \n"); printf(" 3 for Halfling\n"); printf(" 4 for Dwarf\n"); printf("> "); scanf("%d",&player_rac); printf("Please choose Weapon\n"); printf("1 for Battle Axe\n"); printf("2 for Sword\n"); printf("3 for Dagger\n"); printf("4 for Wooden Staff\n"); printf("5 for Mase\n"); printf("6 for Sling\n"); printf("> "); scanf("%d",&player_wep); printf("Please choose you sex\n"); printf("1 for Male\n"); printf("2 for Female\n"); printf("> "); scanf("%d",&player_sex); printf("\nStep 2: Server connections\n"); printf("IP of theServer you wish to connect:\n"); scanf("%s",server_ip); printf("Port of the Server you wish to connect: (You probably want to use 1111)\n"); scanf("%d",&server_port); printf("Use 0 for eth0 or 1 for eth1 as primary interface: (You probably want to use 0)\n"); printf("> "); scanf("%d",&temp_int); sprintf(eth_card,"eth%d",temp_int); } ///////////////////////////////////////////////// // ///////////////////////////////////////////////// void text_display() { printf("Character\n"); printf("-----------\n"); printf("I am a "); if(player_sex==1) printf("male "); if(player_sex==2) printf("female "); if(player_rac==1) printf("human."); if(player_rac==2) printf("elf."); if(player_rac==3) printf("halfling."); if(player_rac==4) printf("dwarf."); printf("\nMy Weapon is a "); if(player_wep==1) printf("Battle Axe.\n"); if(player_wep==2) printf("Sword.\n"); if(player_wep==3) printf("Dagger.\n"); if(player_wep==4) printf("Wooden Staff.\n"); if(player_wep==5) printf("Mase.\n"); if(player_wep==6) printf("Sling.\n"); } ////////////////////////////////////////////////// // open remote socket ////////////////////////////////////////////////// void Rsocket() { /* Opens a TCP socket (an Internet stream socket)*/ if(ptype==1){ if((sockfd = socket(AF_INET, SOCK_STREAM, 6)) < 0){ printf("\n-client: can't open stream socket"); exit(0); } else { if (debug==1){ printf("\n+client: opened stream socket ; socket id = %d" , sockfd); } } setbuf(stdout, NULL); } if(ptype==2){ if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0){ printf("\n-client: can't open stream socket"); exit(0); } else{ if(debug==1){ printf("\n+client: opened stream socket ; socket id = %d" , sockfd); } } setbuf(stdout, NULL); } } ////////////////////////////////////////////////// // Remote connect ////////////////////////////////////////////////// void Rconnect() { int result; /* Fill up the structure "serv_addr" with the address of the server that we want to connect with. */ bzero((char *) &serv_addr, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = inet_addr(server_ip); //printf("\nConnecting to '%s:%d'",server_ip,server_port); serv_addr.sin_port = htons(server_port); /* Connect to the server */ result = connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)); if(result < 0){ printf("\n-client: can't connect to server"); exit(0); } else{ //printf("\n+client: connected to server"); } } ////////////////////////////////////////////////// // ////////////////////////////////////////////////// void start_game() { char recvln[114]; char temp_string[10]; int mapnum,xx; if(startgame!=1){ ptype=1; Rsocket(); Rconnect(); memset(buff,'\0',BUFFSIZE); strcpy(buff,"PQ S"); if(debug==1)printf("\nClient: I am sending '%s' to server\n", buff); setbuf(stdout, NULL); write(sockfd, buff, strlen(buff)); /* Receive's first packet from client */ memset(buff,'\0',BUFFSIZE); alarm(15); read(sockfd,recvln,114) ; alarm(0); printf("recieved\n'%s'\n",recvln); printf("game start sent"); startgame=1; } else { printf("game is already started"); } } ////////////////////////////////////////////////// // ////////////////////////////////////////////////// void tcp_logon() { char recvln[114]; char temp_string[10]; int mapnum,xx; int trees_seen=0; int grass_seen=0; int water_seen=0; int mount_seen=0; int sand_seen=0; int mud_seen=0; int rocky_seen=0; int pit_seen=0; int charm_seen=0; int transport_seen=0; int treasure_seen=0; int coins_seen=0; int hatchet_seen; int tent_seen; memset(buff,'\0',BUFFSIZE); sprintf(buff,"PQ R %s ",my_ip); //printf("\nClient: I am sending '%s' to server\n", buff); setbuf(stdout, NULL); write(sockfd, buff, strlen(buff)); /* Receive's first packet from client */ memset(buff,'\0',BUFFSIZE); alarm(15); read(sockfd,recvln,114) ; alarm(0); //printf("recieved\n'%s'\n",recvln); sprintf(temp_string,"%c%c%c%c",recvln[ 2],recvln[ 3],recvln[ 4],recvln[ 5]); player_num=atoi(temp_string); printf("I am connected and registered on the game server!\n"); printf("I am player number %d\n",player_num); sprintf(temp_string,"%c%c%c%c",recvln[ 6],recvln[ 7],recvln[ 8],recvln[ 9]); player_x=atoi(temp_string); sprintf(temp_string,"%c%c%c%c",recvln[10],recvln[11],recvln[12],recvln[13]); player_y=atoi(temp_string); printf("I am standing at position %d %d on the game map\n",player_x,player_y); mapnum=14; for(xx=0;xx<25;xx++){ sprintf(temp_string,"%c%c%c%c",recvln[mapnum],recvln[mapnum+1],recvln[mapnum+2],recvln[mapnum+3]); map[xx]=atoi(temp_string); if(map[xx] == 1) grass_seen = 1; if(map[xx] == 2) mud_seen =1; if(map[xx] == 3) sand_seen=1; if(map[xx] == 4) rocky_seen=1; if(map[xx] == 12 ||map [xx] == 21 ) {grass_seen=1;mud_seen=1;} if(map[xx] == 100||map [xx] == 101||map [xx] == 102) trees_seen = 1; if(map[xx] == 200) mount_seen = 1; if(map[xx] == 300) water_seen = 1; if(map[xx] == 501) pit_seen = 1; if(map[xx] == 600) charm_seen = 1; if(map[xx] == 702 || map [xx] == 702) transport_seen =1; mapnum=mapnum+4; } printf("I see"); if(trees_seen == 1) printf(" trees "); if(mud_seen == 1) printf(" mud "); if(sand_seen == 1) printf(" sand "); if(grass_seen == 1) printf(" grass "); if(mount_seen == 1) printf(" mountains "); if(water_seen == 1) printf(" water "); if(pit_seen == 1) printf(" pit "); if(charm_seen == 1) printf(" charm "); if(transport_seen==1)printf(" transport "); printf("\n"); if(map[12]!= 300){ printf("I'm standing "); if(map[12] == 1) printf("on grass\n"); if(map[12] == 2) printf("in mud\n"); if(map[12] == 3) printf("on sand\n"); if(map[12] == 4) printf("on a rocky/cave floor\n"); if(map[12] == 12) printf("in grass and mud\n"); if(map[12] == 21) printf("in grass and mud\n"); if(map[12] == 13) printf("on grass and sand \n"); if(map[12] == 31) printf("on grass and sand \n"); if(map[12] == 100 || map[12] == 101 || map[12] == 102) printf("under a tree\n"); if(map[12] == 200) printf("on a mountain\n"); } else{ printf("I'm swiming in water"); } printf("My local surroundings:\n"); printf("%04d %04d %04d %04d %04d\n%04d %04d %04d %04d %04d\n%04d %04d %04d %04d %04d\n%04d %04d %04d %04d %04d\n%04d %04d %04d %04d %04d\n", map[ 0],map[ 1],map[ 2],map[ 3],map[ 4], map[ 5],map[ 6],map[ 7],map[ 8],map[ 9], map[10],map[11],map[12],map[13],map[14], map[15],map[16],map[17],map[18],map[19], map[20],map[21],map[22],map[23],map[24]); close(sockfd); Rsocket(); Rconnect(); sprintf(buff,"PP %04d %03d %03d %03d %03d %03d %03d %1d", player_num, player_rac, player_wep, player_head, player_hair, player_body, player_armor, player_sex); // printf("\nClient: I am sending '%s' to server\n", buff); setbuf(stdout, NULL); write(sockfd, buff, strlen(buff)); /* Receive's first packet from client */ memset(buff,'\0',BUFFSIZE); alarm(15); read(sockfd,recvln,114) ; alarm(0); // printf("recieved\n'%s'\n",recvln); sprintf(temp_string,"%c%c",recvln[ 3],recvln[ 4]); player_str=atoi(temp_string); sprintf(temp_string,"%c%c",recvln[ 6],recvln[ 7]); player_dex=atoi(temp_string); sprintf(temp_string,"%c%c",recvln[ 9],recvln[10]); player_exp=atoi(temp_string); sprintf(temp_string,"%c%c%c",recvln[12],recvln[13],recvln[14]); wep_wear=atoi(temp_string); sprintf(temp_string,"%c%c",recvln[16],recvln[17]); dex_adj=atoi(temp_string); close(sockfd); } //////////////////////////////////////// // find_ip //////////////////////////////////////// void find_ip() { int sock; char address[50]; struct ifreq ifr; struct sockaddr_in *sin = (struct sockaddr_in *)&ifr.ifr_ifru.ifru_addr; sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); strncpy (ifr.ifr_ifrn.ifrn_name, eth_card, IFNAMSIZ - 1); if (ioctl(sock, SIOCGIFADDR, (void *)&ifr) == -1) { printf("Error finding IP!\n "); close(sock); } strcpy(my_ip, inet_ntop(PF_INET, (const void *)&sin->sin_addr, address, 50)); close(sock); } /////////////////////////////////////////// // report_move_to_server ////////////////////////////////////////// void report_move_to_server() { char word_map[25][25]; char send_packet[10]; char recvln[150]; char number_of_players[7]; int num_of_players; int x,xxx; //loop variable char temp_string[10]; int mapnum,xx; char player[5],xcord[5],ycord[5],d_weapon[22],d_race[22],d_sex[22]; sprintf(send_packet, "MO %04d %c", player_num, player_move); //printf("report made\n"); ptype=2; Rsocket(); Rconnect(); udp_server(); //printf("\nClient: I am sending '%s' to server\n", send_packet); setbuf(stdout, NULL); write(sockfd, send_packet, strlen(send_packet)); close(sockfd); /* Receive's first packet from client */ memset(buff,'\0',BUFFSIZE); ///first I need to know how many players are there alarm(15); read(server2,number_of_players,6); alarm(0); number_of_players[0]=' '; number_of_players[1]=' '; num_of_players = atoi(number_of_players); printf("there are %d total players\n",num_of_players); //this reads in all the player info for(x=0; x < num_of_players; x++){ alarm(15); read(server2,recvln,150) ; alarm(0); //printf("player info recieved :'%s'\n",recvln); //player 3 xcord 3 ycord 3 strength 2 weapon 2 dexterity 2 gold 3 silver 3 copper 3 race 1 sex 1 Head Hair Body Armor //PI 000 000 000 00 00 00 000 000 000 0 0 sprintf(player,"%c%c%c", recvln[3], recvln[4], recvln[5]); sprintf(xcord, "%c%c%c", recvln[7], recvln[8], recvln[9]); sprintf(ycord, "%c%c%c", recvln[11], recvln[12], recvln[13]); if(recvln[18]=='0' && recvln[19]=='1') strcpy(d_weapon,"battle axe"); if(recvln[18]=='0' && recvln[19]=='2') strcpy(d_weapon,"sword"); if(recvln[18]=='0' && recvln[19]=='3') strcpy(d_weapon,"dagger"); if(recvln[18]=='0' && recvln[19]=='4') strcpy(d_weapon,"wooden staff"); if(recvln[18]=='0' && recvln[19]=='5') strcpy(d_weapon,"mase"); if(recvln[18]=='0' && recvln[19]=='6') strcpy(d_weapon,"sling"); if(recvln[36]=='0') strcpy(d_race,"unknown race"); if(recvln[36]=='1') strcpy(d_race,"human"); if(recvln[36]=='2') strcpy(d_race,"elf"); if(recvln[36]=='3') strcpy(d_race,"halfling"); if(recvln[36]=='4') strcpy(d_race,"dwarf"); if(recvln[36]=='5') strcpy(d_race,"orc"); if(recvln[36]=='6') strcpy(d_race,"troll"); if(recvln[36]==' ') strcpy(d_race,"[Error finding race]"); if(recvln[38]=='0') strcpy(d_sex,"unknown sex"); if(recvln[38]=='1') strcpy(d_sex,"male"); if(recvln[38]=='2') strcpy(d_sex,"female"); if(recvln[38]==' ') strcpy(d_sex,"[Error finding sex]"); printf("player %s (%s %s) is standing at %s,%s, with %s\n", player,d_sex,d_race,xcord,ycord,d_weapon); } alarm(15); read(server2,recvln,150) ; alarm(0); //printf("recieved\n'%s'\n",recvln); mapnum=2; //start at 2 or 3??? for(xx=0;xx<25;xx++){ sprintf(temp_string,"%c%c%c%c",recvln[mapnum],recvln[mapnum+1],recvln[mapnum+2],recvln[mapnum+3]); map[xx]=atoi(temp_string); mapnum=mapnum+4; } if(map[12]!= 300){ printf("I'm standing "); if(map[12] == 1) printf("on grass\n"); if(map[12] == 2) printf("in mud\n"); if(map[12] == 3) printf("on sand\n"); if(map[12] == 4) printf("on a rocky/cave floor\n"); if(map[12] == 12) printf("in grass and mud\n"); if(map[12] == 21) printf("in grass and mud\n"); if(map[12] == 13) printf("on grass and sand \n"); if(map[12] == 31) printf("on grass and sand \n"); if(map[12] == 100 || map[12] == 100 || map[12] == 100) printf("under a tree\n"); if(map[12] == 200) printf("on a mountain\n"); } else{ printf("I'm swiming in water"); } printf("\n"); printf("My local surroundings:\n"); for(xxx=0;xxx<25;xxx++){ if(map[xxx]==1 ) strcpy(word_map[xxx]," grass "); if(map[xxx]==2 ) strcpy(word_map[xxx]," mud "); if(map[xxx]==3 ) strcpy(word_map[xxx]," sand "); if(map[xxx]==4 ) strcpy(word_map[xxx]," rocky ground "); if(map[xxx]==12 ) strcpy(word_map[xxx]," grass & mud "); if(map[xxx]==21 ) strcpy(word_map[xxx]," mud & grass "); if(map[xxx]==100) strcpy(word_map[xxx]," small tree "); if(map[xxx]==101) strcpy(word_map[xxx]," medium tree "); if(map[xxx]==102) strcpy(word_map[xxx]," large tree "); if(map[xxx]==200) strcpy(word_map[xxx]," mountain "); if(map[xxx]==300) strcpy(word_map[xxx]," water "); if(map[xxx]==500) strcpy(word_map[xxx]," grass "); if(map[xxx]==501) strcpy(word_map[xxx]," pit(uncovered) "); if(map[xxx]==600) strcpy(word_map[xxx]," charm "); if(map[xxx]==701) strcpy(word_map[xxx]," red transport "); if(map[xxx]==702) strcpy(word_map[xxx]," blue transport "); if(map[xxx]==800) strcpy(word_map[xxx]," small treasure "); if(map[xxx]==801) strcpy(word_map[xxx]," med treasure "); if(map[xxx]==802) strcpy(word_map[xxx]," large treasure "); if(map[xxx]==803) strcpy(word_map[xxx]," copper coins "); if(map[xxx]==804) strcpy(word_map[xxx]," silver coins "); if(map[xxx]==805) strcpy(word_map[xxx]," gold coins "); if(map[xxx]==810) strcpy(word_map[xxx]," hatchet "); } printf("--------------------------------------------------------------------------------------\n|%s %s %s %s %s|\n| |\n|%s %s %s %s %s|\n| |\n|%s %s %s %s %s|\n| |\n|%s %s %s %s %s|\n| | \n|%s %s %s %s %s|\n", word_map[ 0],word_map[ 1],word_map[ 2],word_map[ 3],word_map[ 4], word_map[ 5],word_map[ 6],word_map[ 7],word_map[ 8],word_map[ 9], word_map[10],word_map[11],word_map[12],word_map[13],word_map[14], word_map[15],word_map[16],word_map[17],word_map[18],word_map[19], word_map[20],word_map[21],word_map[22],word_map[23],word_map[24]); close(server2); } ///////////////////////////////// // ///////////////////////////////// void command_loop() { char event[25]; char command1[12]; char command2[12]; printf("\nText M.A.S.E prompt start \n"); while (1) { // Loop forever, examining each event. fflush(stdin); fflush(stdout); strcpy(event," \0"); printf ("commands:\n"); if(startgame!=1){ printf("when all players are ready type 'start game'\n"); } else{ printf ("char stat, debug [on,off], move [north,south,east,west],\n"); printf ("use [hatchet,weapon], attack [number or name], ask name,\n"); printf ("talk [number or name] ['words'], buy [item]\n"); } printf("Enter command:"); scanf("%s%s",command1,command2); sprintf(event,"%s %s",command1,command2); printf("\ntyped command: %s\n", event); printf("\n"); if(strstr(event,"move west") != '\0') { player_move='7'; report_move_to_server(); } if(strstr(event,"move nort") != '\0') { player_move='1'; report_move_to_server(); } if(strstr(event,"move east") != '\0') { player_move='3'; report_move_to_server(); } if(strstr(event,"move sout") != '\0') { player_move='5'; report_move_to_server(); } if(strstr(event,"start game") != '\0' || strstr(event,"star game") != '\0') { printf("Atempting to start game.\n"); start_game(); } if(strstr(event,"debug on") != '\0'){ debug=1; } if(strstr(event,"debug off") != '\0'){ debug=0; } //write character text if(strstr(event,"char stat") != '\0'){ printf("Race: %s\n",string_rac); printf("Strength: %02d\n",player_str); printf("Dexterity: %02d\n",player_dex); printf("Dexterity Adj: -%02d\n",dex_adj); true_dex=player_dex - dex_adj; printf("True Dexterity: %02d\n",true_dex); printf("Experiance: %03d\n",player_exp); printf("Gold: %03d\n",player_gld); printf("Silver: %03d\n",player_slv); printf("Copper: %03d\n",player_cpr); printf("Player Number: %03d\n",player_num); //display weapon if(player_wep==1){ //if battleaxe printf("weapon is Battleaxe\n"); printf("Weapon Wear: %d/300\n",wep_wear); } if(player_wep==2){ //if sword printf("Weapon is Sword\n"); printf("Weapon Wear: %d/250",wep_wear); } }//end of if event is Character stats } } /////////////////////////// //udp server /////////////////////////// void udp_server(){ bzero((char *)&sin, sizeof(sin)); servAddr.sin_family = AF_INET; servAddr.sin_addr.s_addr = htonl(INADDR_ANY); //Load UDP server address servAddr.sin_port = htons(my_port); //Load and Convert UDP port to Little Ind ppe = getprotobyname("udp"); //Declare UPD setbuf(stdout, NULL); server2 = socket(PF_INET, SOCK_DGRAM, ppe->p_proto); //printf("\nvalue of UDP socket %d\n",server2); bind1 = bind(server2, (struct sockaddr *) &servAddr,sizeof(servAddr)); //printf("\n%d value of UDP bind\n", bind1); setbuf(stdout, NULL); }