Esempio n. 1
0
void do_moves(dungeon_t *d)
{
  pair_t next;
  character *c;

  /* Remove the PC when it is PC turn.  Replace on next call.  This allows *
   * use to completely uninit the heap when generating a new level without *
   * worrying about deleting the PC.                                       */

  if (pc_is_alive(d)) {
    heap_insert(&d->next_turn, d->pc);
  }

  while (pc_is_alive(d) && ((c = ((character *)
                                  heap_remove_min(&d->next_turn))) != d->pc)) {
    if (!character_is_alive(c)) {
      if (d->charmap[character_get_y(c)][character_get_x(c)] == c) {
        d->charmap[character_get_y(c)][character_get_x(c)] = NULL;
      }
      if (c != d->pc) {
        character_delete(c);
      }
      continue;
    }

    character_next_turn(c);

    npc_next_pos(d, c, next);
    move_character(d, c, next);

    heap_insert(&d->next_turn, c);
  }

  if (pc_is_alive(d) && c == d->pc) {
    character_next_turn(c);

    if(d->objmap[character_get_y(c)][character_get_x(c)]){
      if(add_to_inventory(d, d->objmap[character_get_y(c)][character_get_x(c)]) == 0){
        d->objmap[character_get_y(c)][character_get_x(c)] = NULL;
      }
    }

  }
}
Esempio n. 2
0
int main(){
		int s_ecoute, s_dial, cli_len;
		int option = 1;
		struct sockaddr_in serv_addr, cli_addr;
		fd_set readfds;
		/*buf contient le déplacement (compris entre 0 et 3)
		 * map contient la map (qu'il faudra renvoyer à chaque changement
		 * character contiendra les états des deux personnages, 0 sera le premier arrivé
		 */
		int buf[1] = {0};
		int map[20][15] = {(0,0)};
		int bufMapJoueur[310] ={0};
		int i,j,k;
		int continuer = 1;

		Character character[2];
		for(i=0;i<2;i++){
			character[i] = malloc(sizeof(struct character));
		}

		int so_reuseaddr = 1;

		int actualNumberClient = 0;
		int nb_client_aff = 0;
		int descmax = 0;
		int client[2];

		struct timeval compte_rebours;

		compte_rebours.tv_usec = 0;
		compte_rebours.tv_sec = 600;
		/*********/
		/*********/

		serv_addr.sin_family = AF_INET;
		serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
		serv_addr.sin_port = htons(31337);
		memset(&serv_addr.sin_zero, 0, sizeof(serv_addr.sin_zero));

		s_ecoute = socket(PF_INET, SOCK_STREAM, 0);
		setsockopt(s_ecoute, SOL_SOCKET, SO_REUSEADDR, &so_reuseaddr, sizeof so_reuseaddr);

		bind(s_ecoute, (struct sockaddr *)&serv_addr, sizeof serv_addr);

		while(1) {
		listen(s_ecoute, 5);

		actualNumberClient = 0;
		/*Premiere boucle afin de récupérer le bon nombre de joueur*/
		while(actualNumberClient < 2){
				FD_ZERO(&readfds);
				FD_SET(s_ecoute, &readfds);
				descmax = s_ecoute;
				for(i=0;i<actualNumberClient;i++){
						FD_SET(client[i], &readfds);
				}
				if(s_dial > descmax){
						descmax = s_dial;
				}

					nb_client_aff = select(descmax + 1, &readfds, NULL, NULL, &compte_rebours);

					/*Lorsque nb_client_aff > 0, un des descripteur surveillé a reçu quelque chose*/
					if(nb_client_aff){
								if(FD_ISSET(s_ecoute, &readfds)){
										cli_len = sizeof cli_addr;
										s_dial = accept(s_ecoute, (struct sockaddr *)&cli_addr,
														(socklen_t *)&cli_len);
										printf("Le client %s s'est connecte\n", inet_ntoa
														(cli_addr.sin_addr),
														ntohs(cli_addr.sin_port));
										client[actualNumberClient] = s_dial;
										actualNumberClient++;
								}
					}
		}
		/*Initialisation de la map et des joueurs
		 * A completer */
		initGame(character, map);
		k = 0;
		while(k < 300) {
			for(i=0;i<NB_BLOCS_LARGEUR;i++){
				for(j=0;j<NB_BLOCS_HAUTEUR;j++){
					bufMapJoueur[k] = map[i][j];
					k++;
				}
			}
		}
		bufMapJoueur[300] = character[0]->life;
		bufMapJoueur[301] = character[0]->key;
		bufMapJoueur[302] = character[0]->gold;
		bufMapJoueur[303] = character[0]->x;
		bufMapJoueur[304] = character[0]->y;

		bufMapJoueur[305] = character[1]->life;
		bufMapJoueur[306] = character[1]->key;
		bufMapJoueur[307] = character[1]->gold;
		bufMapJoueur[308] = character[1]->x;
		bufMapJoueur[309] = character[1]->y;

		printf("Envoi des données en cours\n");
		for(i=0;i<2;i++){
			write(client[i],bufMapJoueur,310*sizeof(int));
		}
		printf("Envoi des données fini\n");

		/*Tant que l'un des joueurs n'a pas gagné ou perdu...*/
		continuer = 1;
		while(continuer){

			printf("Waiting for client action\n");
			FD_ZERO(&readfds);
				FD_SET(s_ecoute, &readfds);
				descmax = s_ecoute;
				for(i=0;i<actualNumberClient;i++){
						FD_SET(client[i], &readfds);
				}
				if(s_dial > descmax){
						descmax = s_dial;
				}
					nb_client_aff = select(descmax + 1, &readfds, NULL, NULL, &compte_rebours);

					/*Lorsque nb_client_aff > 0, un des descripteur surveillé a reçu quelque chose*/
					if(nb_client_aff){
							printf("Received client action, proceding...\n");
							/*Lecture des touches */
							for(i = 0;i<actualNumberClient;i++){
									if(FD_ISSET(client[i], &readfds)){
											//printf("Un client est en train de parler\n");
											bzero(buf,1);
											if(read(client[i], buf, 1) == -1){
												perror("Erreur lors de la lecture du socket, client déconnecté\n");
											}
											/*Traitement des touches que l'on recoit
											 * i=J1 ou J2 (prendre i+1) */
											if(buf[0] == 5) {

												bufMapJoueur[0] = 30;
												bufMapJoueur[1] = 35;
												bufMapJoueur[3] = 0;

												write(client[i],bufMapJoueur,310*sizeof(int));

												bufMapJoueur[0] = 35;
												bufMapJoueur[1] = 30;
												bufMapJoueur[3] = 1;


												if(i == 0) {
													write(client[1],bufMapJoueur,310*sizeof(int));
												}
												else {
													write(client[0],bufMapJoueur,310*sizeof(int));
												}
												continuer = 0;
											}
											else if(buf[0] == 0 || buf[0] == 1 || buf[0] == 2 || buf[0] == 3 || buf[0] == 18 || buf[0] == 5){
												move_character(map, buf[0], character[i]);

												if(character[i]->life == 0 || character[i]->gold == 10) {

													bufMapJoueur[0] = 30;
													bufMapJoueur[1] = 35;
													bufMapJoueur[3] = 0;

													write(client[i],bufMapJoueur,310*sizeof(int));

													bufMapJoueur[3] = 1;

													if(i == 0) {
														write(client[1],bufMapJoueur,310*sizeof(int));
													}
													else {
														write(client[0],bufMapJoueur,310*sizeof(int));
													}
													continuer = 0;
												}
												else {
													k = 0;
													while(k < 300) {
														for(i=0;i<NB_BLOCS_LARGEUR;i++){
															for(j=0;j<NB_BLOCS_HAUTEUR;j++){
																bufMapJoueur[k] = map[i][j];
																k++;
															}
														}
													}
													bufMapJoueur[300] = character[0]->life;
													bufMapJoueur[301] = character[0]->key;
													bufMapJoueur[302] = character[0]->gold;
													bufMapJoueur[303] = character[0]->x;
													bufMapJoueur[304] = character[0]->y;

													bufMapJoueur[305] = character[1]->life;
													bufMapJoueur[306] = character[1]->key;
													bufMapJoueur[307] = character[1]->gold;
													bufMapJoueur[308] = character[1]->x;
													bufMapJoueur[309] = character[1]->y;
												}

												printf("Envoi des données en cours\n");
												for(i=0;i<2;i++){
													if(write(client[i],bufMapJoueur,310*sizeof(int)) == -1) {
														bufMapJoueur[0] = 30;
														bufMapJoueur[1] = 35;
														bufMapJoueur[3] = 0;
														printf("L'un des deux joueurs s'est déconnecté, arrêt de la partie.\n");
														if(i == 0) {
															write(client[1],bufMapJoueur,310*sizeof(int));
														}
														else {
															write(client[0],bufMapJoueur,310*sizeof(int));
														}
														continuer = 0;
													}
												}
												printf("Envoi des données fini\n");
											}
									}
							}
					}
					/*Il faut renvoyer les données de la map, les données des deux joueurs
					 * (life/key/gold/position
					 * aux deux joueurs
					 * Ou renvoyer une indication de fin de jeu si l'un des personnages
					 * a gagné et mettre continuer à 0 */
		}
		close(client[0]);
		printf("Deconnexion premier client.\n");
		close(client[1]);
		printf("Deconnexion second client.\n");
	}
		close(s_ecoute);
		printf("Deconnexion du serveur.\n");

		return 0;
}
Esempio n. 3
0
uint32_t move_pc(dungeon_t *d, uint32_t dir)
{
  pair_t next;
  uint32_t was_stairs = 0;

  next[dim_y] = character_get_y(d->pc);
  next[dim_x] = character_get_x(d->pc);

  switch (dir) {
  case 1:
  case 2:
  case 3:
    next[dim_y]++;
    break;
  case 4:
  case 5:
  case 6:
    break;
  case 7:
  case 8:
  case 9:
    next[dim_y]--;
    break;
  }
  switch (dir) {
  case 1:
  case 4:
  case 7:
    next[dim_x]--;
    break;
  case 2:
  case 5:
  case 8:
    break;
  case 3:
  case 6:
  case 9:
    next[dim_x]++;
    break;
  case '<':
    if (mappair(character_get_pos(d->pc)) == ter_stairs_up) {
      was_stairs = 1;
      new_dungeon_level(d, '<');
    }
    break;
  case '>':
    if (mappair(character_get_pos(d->pc)) == ter_stairs_down) {
      was_stairs = 1;
      new_dungeon_level(d, '>');
    }
    break;
  }

  if (was_stairs) {
    return 0;
  }

  if ((dir != '>') && (dir != '<') && (mappair(next) >= ter_floor)) {
    move_character(d, d->pc, next);
    dijkstra(d);
    dijkstra_tunnel(d);

    return 0;
  }


  return 1;
}