int player_hit(struct player *p, struct game *g) { if (player_remove(p, g)) { ERR_TRACE(); return -1; } if (!p->lives) { player_respawn(p); if (player_add(p, g)) { ERR_TRACE(); return -1; } } else { if (!--p->lives) { SDLNet_TCP_Send(p->client->s, "\11", 1); player_free(p); } else { player_respawn(p); if (player_add(p, g)) { ERR_TRACE(); return -1; } } } return 0; }
/** Stop the server. * @param game A game * @return TRUE if the game changed from running to stopped */ gboolean server_stop(Game * game) { GList *current; if (!server_is_running(game)) return FALSE; meta_unregister(); game->is_running = FALSE; if (game->accept_tag) { driver->input_remove(game->accept_tag); game->accept_tag = 0; } if (game->accept_fd >= 0) { close(game->accept_fd); game->accept_fd = -1; } playerlist_inc_use_count(game); current = game->player_list; while (current != NULL) { Player *player = current->data; player_remove(player); player_free(player); current = g_list_next(current); } playerlist_dec_use_count(game); return TRUE; }
void game_free(struct game* game) { assert(game); for(int i=0; i<game->nb_player; i++) player_free(game->players[i]); level_free(game->curr_level); free(game); }
void client_food_dead(t_client *client) { logger_message("[CLIENT] Client %i starved ... dead!", CLP_ID(client)); player_free(client->player); client->player = NULL; client_send(client, "mort"); client_unconnect(client); }
void world_free(World *w){ int i; assert(w!=NULL); for(i=0; i<numobj(w);i++) object_free(obj(w)[i]); free(obj(w)); for(i=0; i<numspaces(w);i++) space_free(spaces(w)[i]); player_free(player(w)); free(spaces(w)); free(w); return; }
/** Frees the object and all resources attached to it (even the animation, if it is owned by the object) * \param obj Object handle */ void object_free(object *obj) { if(obj->free != NULL) { obj->free(obj); } player_free(obj); if(obj->cur_animation_own == OWNER_OBJECT) { animation_free(obj->cur_animation); free(obj->cur_animation); } if (obj->custom_str) { free(obj->custom_str); } obj->cur_surface = NULL; obj->cur_animation = NULL; }
/* * This function needs to be very safe as it can be called on a * half-initialized connection structure if something went wrong. */ void connection_free(struct connection *conn) { if (!conn) return; pthread_mutex_destroy(&conn->worker_lock); if (conn->peerfd) close(conn->peerfd); if (conn->rbuf) free(conn->rbuf); if (conn->sbuf) free(conn->sbuf); if (conn->pl) player_free(conn->pl); }
/** * Clean all data * * @param pGame The game's context * @return GFMRV_OK, GFMRV_ARGUMENTS_BAD, ... */ gfmRV intro_clean(gameCtx *pGame) { gfmRV rv; introCtx *pIntro; // Sanitize arguments ASSERT(pGame, GFMRV_ARGUMENTS_BAD); ASSERT(pGame->pState, GFMRV_ARGUMENTS_BAD); // Get the current state pIntro = (introCtx*)(pGame->pState); // Free the tilemap gfmSprite_free(&(pIntro->pBullet1)); gfmSprite_free(&(pIntro->pBullet2)); gfmTilemap_free(&(pIntro->pFlashFx)); gfmTilemap_free(&(pIntro->pMachineFx)); player_free(pIntro->pPl); doc_free(pIntro->pDoc); rv = GFMRV_OK; __ret: return rv; }
/* * Not present in the official library * XXX - Might not be thread safe? * */ SP_LIBEXPORT(sp_error) sp_session_release (sp_session *session) { /* Unregister channels */ DSFYDEBUG("Unregistering any active channels\n"); channel_fail_and_unregister_all(session); /* Kill player thread */ player_free(session); /* Kill networking thread */ DSFYDEBUG("Terminating network thread\n"); #ifdef _WIN32 TerminateThread(session->thread_io, 0); session->thread_io = (HANDLE)0; CloseHandle(session->idle_wakeup); CloseHandle(session->request_mutex); #else pthread_cancel(session->thread_io); pthread_join(session->thread_io, NULL); session->thread_io = (pthread_t)0; pthread_mutex_destroy(&session->request_mutex); pthread_cond_destroy(&session->idle_wakeup); #endif if(session->packet) buf_free(session->packet); if(session->login) login_release(session->login); playlistcontainer_release(session); if(session->hashtable_albums) hashtable_free(session->hashtable_albums); if(session->hashtable_artists) hashtable_free(session->hashtable_artists); if(session->hashtable_images) hashtable_free(session->hashtable_images); if(session->hashtable_tracks) hashtable_free(session->hashtable_tracks); if(session->user) user_release(session->user); if(session->hashtable_users) hashtable_free(session->hashtable_users); free(session->callbacks); /* Helper function for sp_link_create_from_string() */ libopenspotify_link_release(); free(session); DSFYDEBUG("Session released\n"); return SP_ERROR_OK; }
int main (int argc, char **argv) { // variables SDL_Surface *screen; // pantalla SDL_Event event; // para los eventos de SDL (teclado y/o mouse) Uint8 *keystates = SDL_GetKeyState(NULL); // para detectar teclas mantenidas presionadas Uint8 salir = 0; // para determinar cuando se cierra la ventana int mouse_x=0, mouse_y=0; // coordenadas del mouse char info1[100]; // texto para mostrar informacion variada linea 1 char info2[100]; // texto para mostrar informacion variada linea 2 short int time; // variable para la hora short int ticks; // variable para mover elementos independiente de los FPS // cargar configuracion struct conf *conf = conf_load(); if (!conf) return EXIT_FAILURE; // verificar a donde nos queremos conectar // se indicó el servidor como 1er parametro if(argc>=2) { free(conf->SERVER); conf->SERVER = malloc(strlen(argv[1])); strcpy(conf->SERVER, argv[1]); } // se indicó el puerto como 2do parametro if(argc>=3) { conf->PORT = atoi(argv[2]); } // conectar al servidor int connection = client_init(conf); if (!connection) return EXIT_FAILURE; // buffer para transferencia entre servidor y cliente char buffer[BUFFER_SIZE]; // obtener id del jugador int playerID = atoi(query("get;id", connection)); // recibir y actualizar configuraciones desde el servidor conf_update(conf, query("get;conf", connection)); // inicializar sistema sdl_init(&screen); // cargar fuente TTF_Font *fuente = ttf_load(FONT_NAME, FONT_SIZE, FONT_STYLE); // cargar todos los posibles objetos de un mapa MapObject *mapobjects = mapobjects_load(screen); if (!mapobjects) return EXIT_FAILURE; // cargar mapa char **map = map_open(conf->MAP); if (!map) return EXIT_FAILURE; // cargar armas Weapon *weapons = weapons_load(); if (!weapons) return EXIT_FAILURE; // crear personaje jugador Player *pj = player_create(playerID, conf->PLAYER_NAME, conf->PLAYER_CHARACTER, screen, weapons, conf); // asignar armas al personaje player_change_weapon(&pj, conf->WEAPON_PRIMARY, 1); player_change_weapon(&pj, conf->WEAPON_SECONDARY, 2); // ubicar personaje en el mapa player_set_position(&pj, map, -1, -1, mapobjects); // informar estado del usuario bzero(buffer, sizeof(buffer)); sprintf(buffer, "info;%s;%s", conf->PLAYER_CHARACTER, conf->PLAYER_NAME); write(connection, buffer, strlen(buffer)); // crear bots y ubicar en el mapa Player *bots = bots_create(screen, weapons, conf); int i; for(i=0; i<conf->BOTS; ++i) { Player *aux = &bots[i]; player_set_position(&aux, map, -1, -1, mapobjects); } // guardar ticks ticks = SDL_GetTicks(); // ciclo infinito para refrescar la imagen de la pantalla while (!salir) { // solicitar informacion de todos los jugadores (menos el mio) char *enemies = query("get;players", connection); // enviar posicion del jugador al servidor sprintf(buffer, "position;%d;%d", (int)(pj->y), (int)(pj->x)); write(connection, buffer, strlen(buffer)); // time time = SDL_GetTicks()/1000; // dibujar mapa map_draw(screen, map, mapobjects, conf->BACKGROUND); // revisar si existen eventos de SDL while (SDL_PollEvent(&event)) { // salir del programa if(event.type==SDL_QUIT) salir = 1; // si se presiona una tecla else if(event.type==SDL_KEYDOWN) { // cambiar a pantalla completa if(event.key.keysym.sym==SDLK_f) SDL_WM_ToggleFullScreen(screen); // salir del juego else if(event.key.keysym.sym==SDLK_ESCAPE) salir = 1; // cambiar arma primaria else if(event.key.keysym.sym>=48&&event.key.keysym.sym<=57) player_change_weapon(&pj, event.key.keysym.sym-48, 1); } // si se mueve el mouse else if(event.type==SDL_MOUSEMOTION) { // guardar coordenadas del mouse mouse_x = event.motion.x; mouse_y = event.motion.y; } // si se presiona el mouse else if(event.type == SDL_MOUSEBUTTONDOWN ) { // guardar coordenadas del mouse mouse_x = event.button.x; mouse_y = event.button.y; // resetear flag de armas disparadas pj->primary->fired = 0; pj->secondary->fired = 0; // si se presiono el boton izquierdo if(event.button.button==SDL_BUTTON_LEFT && pj->primary->ammo) { Mix_PlayChannel(-1, pj->primary->sound, 0); pj->primary->fired = pj->primary->ammo--; } // si se presiono el boton derecho else if(event.button.button==SDL_BUTTON_RIGHT && pj->secondary->ammo) { Mix_PlayChannel(-1, pj->secondary->sound, 0); pj->secondary->fired = pj->secondary->ammo--; } // si se mueve el scroll se cambia el arma principal else if (event.button.button==SDL_BUTTON_WHEELUP) { player_change_weapon(&pj, WEAPON_PREV, 1); } else if (event.button.button==SDL_BUTTON_WHEELDOWN) { player_change_weapon(&pj, WEAPON_NEXT, 1); } // determinar si personaje fue herido if(mouse_x >= pj->x && mouse_x <= pj->x+SPRITE_SIZE && mouse_y >= pj->y && mouse_y <= pj->y+SPRITE_SIZE) { // hacer daño al personaje if(event.button.button==SDL_BUTTON_LEFT && pj->primary->fired) { pj->health -= pj->primary->damage; // reproducir sonido de dolor Mix_PlayChannel(-1, pj->sounds[PLAYER_SOUND_DAMAGED], 0); } else if(event.button.button==SDL_BUTTON_RIGHT && pj->secondary->fired) { pj->health -= pj->secondary->damage; // reproducir sonido de dolor Mix_PlayChannel(-1, pj->sounds[PLAYER_SOUND_DAMAGED], 0); } // si la salud quedo menor o igual a 0 el personaje muere if(pj->health<1) { // incrementar contador de muerte ++pj->dead; pj->health = conf->PLAYER_HEALTH; // descontar vida if(conf->PLAYER_LIFE!=0) { --pj->life; if(pj->life==0) { // GAME OVER } } // reposicionar personaje muerto player_set_position(&pj, map, -1, -1, mapobjects); } } } // si se suelta el mouse else if(event.type==SDL_MOUSEBUTTONUP) { // guardar coordenadas del mouse mouse_x = event.button.x; mouse_y = event.button.y; // si se solto el boton izquierdo if(event.button.button==SDL_BUTTON_LEFT) { } // si se solto el boton derecho else if(event.button.button==SDL_BUTTON_RIGHT) { } } } // mover jugador player_move(&pj, keystates, map, mapobjects, conf, SDL_GetTicks()-ticks); player_get_object(&pj, map, conf); // primera linea informacion sprintf(info1, "time: %02d:%02d, mouse: (%04d,%04d)", time/60, time%60, mouse_x, mouse_y); SDL_Surface *s_info1 = TTF_RenderText_Blended(fuente, info1, (SDL_Color) {255,255,255,255}); SDL_Rect rect = (SDL_Rect) { 10, 0, 100, 20 }; SDL_BlitSurface(s_info1, NULL, screen, &rect); SDL_FreeSurface(s_info1); // segunda linea informacion sprintf(info2, "[%s] +%03d, life: %02d, dead: %02d, weapon: [%d/%03d/%03d] [%d/%03d/%03d]", conf->PLAYER_NAME, pj->health, pj->life, pj->dead, pj->primary->id, pj->primary->damage, pj->primary->ammo, pj->secondary->id, pj->secondary->damage, pj->secondary->ammo); SDL_Surface *s_info2 = TTF_RenderText_Blended(fuente, info2, (SDL_Color) {255,255,255,255}); rect.y += 12; SDL_BlitSurface(s_info2, NULL, screen, &rect); SDL_FreeSurface(s_info2); // dibujar enemigos enemies_draw(screen, enemies); // dibujar bots /*for(i=0; i<conf->BOTS; ++i) { Player *aux = &bots[i]; SDL_BlitSurface(aux->images[PLAYER_IMAGE_SPRITE], &aux->src, screen, &aux->sprite); }*/ // dibujar jugador SDL_BlitSurface(pj->images[PLAYER_IMAGE_SPRITE], &pj->src, screen, &pj->sprite); // actualizar screen sdl SDL_Flip(screen); SDL_Delay(1000/FPS); // resetear ticks ticks = SDL_GetTicks(); } // cerrar conexion al servidor close(connection); // liberar jugador player_free(&pj); // liberar armas weapons_free(&weapons); // libear objetos del mapa mapobjects_free(&mapobjects); // cerrar fuentes TTF_CloseFont(fuente); TTF_Quit(); // cerrar SDL SDL_FreeSurface(screen); SDL_Quit(); // retorno del sistema return EXIT_SUCCESS; }
World *worldfromfile(char *file){ assert(file!=NULL); FILE *f; int i,j; int numspaces, numobjects; Space **spaces; Player *player; Object **objects; World *w; f=fopen(file,"r"); if(f==NULL) return NULL; fscanf(f,"%d\n",&numspaces); spaces=(Space **)malloc(sizeof(Space *)*numspaces); if(spaces==NULL){ fclose(f); return NULL; } for(i=0;i<numspaces;i++){ spaces[i]=spacefromfile(f); if(spaces[i]==NULL){ for(j=i;j>=0;j--){ space_free(spaces[j]); } free(spaces); fclose(f); return NULL; } } player=playerfromfile(f); if(player==NULL){/*if theres no memory free everything and return NULL*/ for(j=0;j<numspaces;j++){ space_free(spaces[j]); } free(spaces); fclose(f); return NULL; } fscanf(f,"%d\n",&numobjects); objects=(Object **)malloc(sizeof(Object *)*numobjects); if(objects==NULL){ for(j=0;j<numspaces;j++){ space_free(spaces[j]); } free(spaces); player_free(player); fclose(f); return NULL; } for(i=0;i<numobjects;i++){ objects[i]=objectfromfile(f); if(objects[i]==NULL){ for(j=0;j<numspaces;j++){ space_free(spaces[j]); } free(spaces); player_free(player); for(j=i-1;j>=0;j--){ object_free(objects[i]); } free(objects); fclose(f); return NULL; } } w=world_ini(objects,player,spaces,numobjects,numspaces); if(w==NULL){ for(j=0;j<numspaces;j++){ space_free(spaces[j]); } free(spaces); player_free(player); for(j=0;j<numobjects;j++){ object_free(objects[i]); } fclose(f); free(objects); return NULL; } fclose(f); return w; }