void Level_Clear(World* w) { for(int i = 0 ; i < Vector_Count(&w->monsters_vector) ; i++) { Entity* ent = Vector_Get(&w->monsters_vector, i); Entity_Destroy(ent); } for(int i = 0 ; i < Vector_Count(&w->bonus_vector) ; i++) { Entity* ent = Vector_Get(&w->bonus_vector, i); Entity_Destroy(ent); } for(int i = 0 ; i < Vector_Count(&w->bullets_vector) ; i++) { Entity* ent = Vector_Get(&w->bullets_vector, i); Entity_Destroy(ent); } for(int i = 0 ; i < Vector_Count(&w->explosions_vector) ; i++) { Entity* ent = Vector_Get(&w->explosions_vector, i); Entity_Destroy(ent); } Vector_Clear(&w->monsters_vector); Vector_Clear(&w->bonus_vector); Vector_Clear(&w->events_vector); Vector_Clear(&w->bullets_vector); Vector_Clear(&w->explosions_vector); Vector_Clear(&w->decals_vector); Vector_Clear(&w->props_vector); for(int i = 0 ; i < w->map_size ; i++) { free(w->map[i]); } for(int i = 0 ; i < w->map_size ; i++) { free(w->ground_map[i]); } }
void Player_Reset(Entity* player) { //destroy all the pointers Entity_Destroy(player); player->playerC = PlayerC_Create(); player->movementC = MovementC_Create(); player->movementC->speed = BASE_PLAYER_SPEED; player->hp = 10; player->weaponsC = WeaponsComponent_Create(false); WeaponsComponent_AddWeaponToInventory(player->weaponsC, Weapon_Create(Weapon_Handgun)); WeaponsComponent_ChangeWeapon(player->weaponsC, Weapon_Handgun); player->weaponsC->bullets[Weapon_Handgun] = 100; player->weaponsC->is_monster = false; }
void Inputs_ApplyInputsLevelEditor(Controls* controls, World* world, Window* level_editor, GameManager* gm) { rotate_timer += delta_g; if(pressedKeys[SDLK_F1] && SDL_GetTicks() - switch_timer > 200) { draw_grid_g = draw_grid_g? false : true; } if(pressedKeys[SDLK_F7] && SDL_GetTicks() - switch_timer > 2000) { switch_timer = SDL_GetTicks(); LevelEditor_QuickTry(world); } int position_in_array = controls->mouseTileY * world->map_width + controls->mouseTileX; if(controls->temp_object_to_create != NULL) { if(pressedKeys[SDLK_f] && !previousPressedKeys_g[SDLK_f]) { SDL_WarpMouseInWindow(Graphics_GetWindow(), (controls->mouseTileX * TILE_SIZE - world->player.playerC->cameraX), controls->mouseTileY * TILE_SIZE - world->player.playerC->cameraY); } if(pressedKeys[SDLK_RIGHT] && !previousPressedKeys_g[SDLK_RIGHT]) { SDL_WarpMouseInWindow(Graphics_GetWindow(), (controls->mouseX + 1 ), controls->mouseY); } if(pressedKeys[SDLK_LEFT] && !previousPressedKeys_g[SDLK_LEFT]) { SDL_WarpMouseInWindow(Graphics_GetWindow(), (controls->mouseX - 1 ), controls->mouseY); } if(pressedKeys[SDLK_UP] && !previousPressedKeys_g[SDLK_UP]) { SDL_WarpMouseInWindow(Graphics_GetWindow(), (controls->mouseX ), controls->mouseY - 1); } if(pressedKeys[SDLK_DOWN] && !previousPressedKeys_g[SDLK_DOWN]) { SDL_WarpMouseInWindow(Graphics_GetWindow(), (controls->mouseX), controls->mouseY + 1); } if(controls->mouseWheelPos < 0 && rotate_timer > 50) { if(controls->temp_object_to_create->angle == 0) { controls->temp_object_to_create->angle = HALF_PI; } else if(controls->temp_object_to_create->angle <= HALF_PI + 0.1f) { controls->temp_object_to_create->angle = HALF_PI * 2; } else if(controls->temp_object_to_create->angle <= HALF_PI * 2 + 0.1f) { controls->temp_object_to_create->angle = HALF_PI * 3; } else if(controls->temp_object_to_create->angle <= HALF_PI * 3 + 0.1f) { controls->temp_object_to_create->angle = 0; } rotate_timer = 0; } if(controls->mouseWheelPos > 0 && rotate_timer > 50) { if(controls->temp_object_to_create->angle == 0) { controls->temp_object_to_create->angle = HALF_PI * 3; } else if(controls->temp_object_to_create->angle >= HALF_PI * 3 - 0.1f) { controls->temp_object_to_create->angle = HALF_PI * 2; } else if(controls->temp_object_to_create->angle >= HALF_PI * 2 - 0.1f) { controls->temp_object_to_create->angle = HALF_PI; } else if(controls->temp_object_to_create->angle >= HALF_PI - 0.2f) { controls->temp_object_to_create->angle = 0; } rotate_timer = 0; } controls->temp_object_to_create->x = controls->mousePositionInWorldX; controls->temp_object_to_create->y = controls->mousePositionInWorldY; BoundingBox_Update(controls->temp_object_to_create); } Vector* monsters_vector = &world->monsters_vector; if(BoundingBox_CheckPointCollision(controls->mouseX, controls->mouseY, &level_editor->box)) { controls->hovering_on_window = true; //selecting button in level_editor if(controls->pressedMouseButtons[SDL_BUTTON_LEFT]) { for(int i = 0 ; i < level_editor->nb_of_buttons ; i++) { if(BoundingBox_CheckPointCollision(controls->mouseX, controls->mouseY, &level_editor->buttons[i].box)) { level_editor->active_button = &level_editor->buttons[i]; if(controls->temp_object_to_create != NULL) { Entity_Destroy(controls->temp_object_to_create); free(controls->temp_object_to_create); } controls->temp_object_to_create = Entity_Create(level_editor->active_button->main_category, level_editor->active_button->button_type, controls->mouseX, controls->mouseY, 0, world); } } } //showing window resizing cursor if((controls->mouseX > level_editor->box.right - 10 || controls->mouseX < level_editor->box.left + 10) && controls->active_window == NULL) { controls->cursor_resize_left_right = true; if(controls->pressedMouseButtons[SDL_BUTTON_LEFT] && controls->previousPressedMouseButtons[SDL_BUTTON_LEFT] && controls->mouseX > level_editor->box.right - 10) { controls->resizing_right = true; } if(controls->pressedMouseButtons[SDL_BUTTON_LEFT] && controls->previousPressedMouseButtons[SDL_BUTTON_LEFT] && controls->mouseX < level_editor->box.left + 10) { controls->resizing_left = true; } } else { controls->cursor_resize_left_right = false; } //clicking on the level editor window if(controls->pressedMouseButtons[SDL_BUTTON_LEFT] && controls->previousPressedMouseButtons[SDL_BUTTON_LEFT] && !controls->cursor_resize_left_right) { controls->active_window = level_editor; } } else //if not hovering on the window { controls->cursor_resize_left_right = false; controls->cursor_resize_up_down = false; controls->hovering_on_window = false; } //if you've clicked on the window and then stopped clicking, it's not "active" anymore if(controls->active_window != NULL && !controls->previousPressedMouseButtons[SDL_BUTTON_LEFT]) { controls->active_window = NULL; } //resizing window if(controls->resizing_right || controls->resizing_left) { controls->cursor_resize_left_right = true; if(!controls->pressedMouseButtons[SDL_BUTTON_LEFT] && !controls->previousPressedMouseButtons[SDL_BUTTON_LEFT]) { controls->resizing_right = false; controls->resizing_left = false; } if(controls->resizing_right) { Window_ResizeRight(level_editor, controls->mouseX - controls->previousMouseX); } else if(controls->resizing_left) { Window_ResizeLeft(level_editor, controls->mouseX - controls->previousMouseX); } } //moving window if(controls->active_window != NULL && controls->pressedMouseButtons[SDL_BUTTON_LEFT] && controls->previousPressedMouseButtons[SDL_BUTTON_LEFT] && !controls->resizing_left && !controls->resizing_right) { Window_Move(level_editor, controls->mouseX - controls->previousMouseX, controls->mouseY - controls->previousMouseY); } if(pressedKeys[SDLK_LCTRL]) { unlimited_creation = true; } else { unlimited_creation = false; } //if not hovering and not moving window //we can create/delete stuff on the map if(!controls->active_window && !controls->hovering_on_window) { if (level_editor->active_button != NULL) { Main_Category category = level_editor->active_button->main_category; int obj_type = level_editor->active_button->button_type; if(!rectangle_selection_create && (controls->pressedMouseButtons[SDL_BUTTON_RIGHT] || pressedKeys[SDLK_SPACE])) { if (controls->mouseTileX < world->map_width && controls->mouseTileX > 0 && controls->mouseTileY < world->map_height && controls->mouseTileY > 0) { //pressing shift activate the rectangle selection tool if((category == Cat_Wall || category == Cat_Ground) && pressedKeys[SDLK_LSHIFT]) { rectangle_selection_startX = controls->mousePositionInWorldX; rectangle_selection_startY = controls->mousePositionInWorldY; rectangle_selection_create = true; } LevelEditor_CreateObject(category, obj_type, controls->tileInPixelsX, controls->tileInPixelsY, position_in_array, controls->mousePositionInWorldX, controls->mousePositionInWorldY, world, unlimited_creation, controls->temp_object_to_create->angle); } else printf("out of bound!!!"); } //remove wall (replace it with empty entity) if(pressedKeys[SDLK_c]) { } //deleting monster if(pressedKeys[SDLK_x]) { if(pressedKeys[SDLK_LSHIFT] && !rectangle_selection_delete) { rectangle_selection_startX = controls->mousePositionInWorldX; rectangle_selection_startY = controls->mousePositionInWorldY; rectangle_selection_delete = true; } if(!rectangle_selection_delete) { LevelEditor_UpdateWallsCorners(position_in_array, world); free(world->map[position_in_array]); world->map[position_in_array] = NULL; } for(int i = 0 ; i < Vector_Count(&world->monsters_vector) ; i++) { Entity* mob = (Entity*)Vector_Get(&world->monsters_vector, i); if(BoundingBox_CheckPointCollision(controls->mousePositionInWorldX, controls->mousePositionInWorldY, &mob->box)) { Entity_Destroy(mob); Vector_Delete(&world->monsters_vector, i); } } for(int i = 0 ; i < Vector_Count(&world->bonus_vector) ; i++) { Entity* bonus = (Entity*)Vector_Get(&world->bonus_vector, i); if(BoundingBox_CheckPointCollision(controls->mousePositionInWorldX, controls->mousePositionInWorldY, &bonus->box)) { Entity_Destroy(bonus); Vector_Delete(&world->bonus_vector, i); } } for(int i = 0 ; i < Vector_Count(&world->props_vector) ; i++) { Entity* obj = (Entity*)Vector_Get(&world->props_vector, i); if(BoundingBox_CheckPointCollision(controls->mousePositionInWorldX, controls->mousePositionInWorldY, &obj->box)) { Entity_Destroy(obj); Vector_Delete(&world->props_vector, i); } } for(int i = 0 ; i < Vector_Count(&world->decals_vector) ; i++) { Entity* obj = (Entity*)Vector_Get(&world->decals_vector, i); if(BoundingBox_CheckPointCollision(controls->mousePositionInWorldX, controls->mousePositionInWorldY, &obj->box)) { Entity_Destroy(obj); Vector_Delete(&world->decals_vector, i); } } } /*stopping pressing left shift stop the selection and creates the selection tile in the selection (only if it's a tile and not a monster/object */ if((rectangle_selection_create || rectangle_selection_delete) && pressedKeys[SDLK_LSHIFT]) { rectangle_selection_endX = controls->mousePositionInWorldX; rectangle_selection_endY =controls->mousePositionInWorldY; int startX = rectangle_selection_startX; int endX = rectangle_selection_endX; int startY = rectangle_selection_startY; int endY = rectangle_selection_endY; if(rectangle_selection_endY <= rectangle_selection_startY) { startY = rectangle_selection_endY; endY = rectangle_selection_startY; } if(rectangle_selection_endX <= rectangle_selection_startX) { startX = rectangle_selection_endX; endX = rectangle_selection_startX; } int tileStartX = startX / TILE_SIZE; int tileStartY = startY / TILE_SIZE; int tileEndX = endX / TILE_SIZE; int tileEndY = endY / TILE_SIZE; for(int y = tileStartY ; y <= tileEndY ; y++) { for(int x = tileStartX ; x <= tileEndX ; x++) { position_in_array = y * world->map_width + x; if(rectangle_selection_create) { int obj_type = level_editor->active_button->button_type; LevelEditor_CreateObject(category, obj_type, x * TILE_SIZE, y * TILE_SIZE, position_in_array, controls->mousePositionInWorldX, controls->mousePositionInWorldY, world, unlimited_creation, controls->temp_object_to_create->angle); } else if(rectangle_selection_delete) { LevelEditor_UpdateWallsCorners(position_in_array, world); free(world->map[position_in_array]); world->map[position_in_array] = NULL; } } } if(rectangle_selection_delete) { for(int i = 0 ; i < Vector_Count(&world->monsters_vector) ; i++) { Entity* obj = (Entity*)Vector_Get(&world->monsters_vector, i); if(obj->box.right > startX && obj->box.left < endX && obj->box.bottom > startY && obj->box.top < endY) { Entity_Destroy(obj); Vector_Delete(&world->monsters_vector, i); } } for(int i = 0 ; i < Vector_Count(&world->bonus_vector) ; i++) { Entity* obj = (Entity*)Vector_Get(&world->bonus_vector, i); if(obj->box.right > startX && obj->box.left < endX && obj->box.bottom > startY && obj->box.top < endY) { Entity_Destroy(obj); Vector_Delete(&world->bonus_vector, i); } } for(int i = 0 ; i < Vector_Count(&world->props_vector) ; i++) { Entity* obj = (Entity*)Vector_Get(&world->props_vector, i); if(obj->box.right > startX && obj->box.left < endX && obj->box.bottom > startY && obj->box.top < endY) { Entity_Destroy(obj); Vector_Delete(&world->props_vector, i); } } for(int i = 0 ; i < Vector_Count(&world->decals_vector) ; i++) { Entity* obj = (Entity*)Vector_Get(&world->decals_vector, i); if(obj->box.right > startX && obj->box.left < endX && obj->box.bottom > startY && obj->box.top < endY) { Entity_Destroy(obj); Vector_Delete(&world->decals_vector, i); } } } } if((rectangle_selection_create || rectangle_selection_delete) && !pressedKeys[SDLK_LSHIFT]) { rectangle_selection_create = false; rectangle_selection_delete = false; } } //deleting every monster if(pressedKeys[SDLK_u]) { // Vector_Clear(&world->monsters_vector); leads to memory leak } //cancel current selected object /*if(pressedKeys[SDLK_e]) { level_editor->active_button = NULL; }*/ //switch mobs AI if(pressedKeys[SDLK_a] && SDL_GetTicks() - controls->last_ai_switch > 150) { if(gm->ai_on) { gm->ai_on = false; } else { gm->ai_on = true; } controls->last_ai_switch = SDL_GetTicks(); } } }
~EntityQ3API(){ Entity_Destroy(); }
void LevelEditor_CreateObject(Main_Category category, int obj_type, int x, int y, int position_in_array, float mousePositionInWorldX, float mousePositionInWorldY, World* world, bool unlimited, float angle) { if(category == Cat_Wall || category == Cat_Door) { free(world->map[position_in_array]); world->map[position_in_array] = Entity_Create(category, obj_type, x, y, angle, world); } else if(category == Cat_Ground) { Entity_Destroy(world->ground_map[position_in_array]); free(world->ground_map[position_in_array]); world->ground_map[position_in_array] = Entity_Create(category, obj_type, x, y, angle, world); } else if(category == Cat_Zombie && (SDL_GetTicks() - building_time > 150 || unlimited)) { Vector_Push(&world->monsters_vector, Entity_Create(category, obj_type, mousePositionInWorldX, mousePositionInWorldY, 0, world)); building_time = SDL_GetTicks(); } else if(category == Cat_Prop && (SDL_GetTicks() - building_time > 150 || unlimited)) { Vector_Push(&world->props_vector, Entity_Create(category, obj_type, mousePositionInWorldX, mousePositionInWorldY, angle, world)); building_time = SDL_GetTicks(); } else if(category == Cat_Decal && (SDL_GetTicks() - building_time > 150 || unlimited)) { Vector_Push(&world->decals_vector, Entity_Create(category, obj_type, mousePositionInWorldX, mousePositionInWorldY, angle, world)); building_time = SDL_GetTicks(); } else if(category == Cat_Event && (SDL_GetTicks() - building_time > 150)) { //there can be only 1 player start and end of level for(int i = 0 ; i < Vector_Count(&world->events_vector) ; i++) { Entity* map_event = (Entity*)Vector_Get(&world->events_vector, i); if((obj_type == Event_Player_Start || obj_type == Event_End_Level )&& obj_type == map_event->sub_category) { Vector_Delete(&world->events_vector, i); } } Vector_Push(&world->events_vector, Entity_Create(category, obj_type, x, y, 0, world)); building_time = SDL_GetTicks(); } else if(category == Cat_Bonus && (SDL_GetTicks() - building_time > 150 || unlimited)) { Vector_Push(&world->bonus_vector, Entity_Create(category, obj_type, mousePositionInWorldX, mousePositionInWorldY, 0, world)); building_time = SDL_GetTicks(); } }
void GameManage_UpdateWorldEntities(GameManager* gm, World* world) { Vector* bullets_vector = &world->bullets_vector; Vector* bonus_vector = &world->bonus_vector; Vector* monsters_vector = &world->monsters_vector; Vector* explosions_vector = &world->explosions_vector; Vector* decals_vector = &world->decals_vector; Vector* props_vector = &world->props_vector; for(int i = 0 ; i < world->map_size ; i++) { if(world->map[i] != NULL) { // Entity_CalculateVisibility(world->map[i], world); if(world->map[i]->t == Cat_Door) { Door_Update(world->map[i], world); } if(!world->map[i]->alive) { free(world->map[i]);//walls don't have any compotent, no need to destroy them world->map[i] = NULL; } } } for(int i = 0 ; i < Vector_Count(bullets_vector) ; i++) { if(Vector_Get(bullets_vector, i) != NULL) { Entity* projectile = (Entity*)Vector_Get(bullets_vector, i); Entity_CalculateVisibility(projectile, world); if(!bullet_time_g) { if(projectile->t == Cat_Bullet) { Bullet_Update(projectile, world); } else if(projectile->t == Cat_Grenade) { Grenade_Update(projectile, world); if(!projectile->alive) { Vector_Push(explosions_vector, Explosion_Create(projectile->x - 64, projectile->y - 64) ); } } if (projectile->alive == false) { Entity_Destroy(projectile); Vector_Delete(bullets_vector, i); } } } else { printf("Error during update of bullets vector : bullet = NULL"); } } if(gm->ai_on) { for(int i = 0 ; i < Vector_Count(monsters_vector) ; i++) { Entity* mob = (struct Entity*)Vector_Get(monsters_vector, i); if(Entity_CheckDistance(mob, &world->player, 800)) { Entity_CalculateVisibility(mob, world); } if(mob->zombieC->aggressive || Entity_CheckDistance(mob, &world->player, 400)) { Zombie_Update(mob, world); } if (mob->alive == false) { Zombie_Die(mob, bonus_vector, decals_vector); Entity_Destroy(mob); Vector_Delete(monsters_vector, i); } } } for(int i = 0 ; i < Vector_Count(bonus_vector) ; i++) { if(Vector_Get(bonus_vector, i) != NULL) { Entity* bonus = (Entity*)Vector_Get(bonus_vector, i); if(Entity_CheckDistance(bonus, &world->player, 800)) { if(!bullet_time_g) { Bonus_Update(bonus, &world->player); } Entity_CalculateVisibility(bonus, world); } if (bonus->alive == false) { Entity_Destroy(bonus); Vector_Delete(bonus_vector, i); } } else { printf("Error during update of bonus vector : bonus = NULL"); } } for(int i = 0 ; i < Vector_Count(decals_vector) ; i++) { Entity* decal = (Entity*)Vector_Get(decals_vector, i); if(Entity_CheckDistance(decal, &world->player, 800)) { Entity_CalculateVisibility(decal, world); } if(Vector_Count(decals_vector) > 200) { if(decal->is_ennemy) { Vector_Delete(decals_vector, i); } } } for(int i = 0 ; i < Vector_Count(props_vector) ; i++) { Entity* prop = (Entity*)Vector_Get(props_vector, i); if(Entity_CheckDistance(prop, &world->player, 800)) { Entity_CalculateVisibility(prop, world); } if (!prop->alive) { Entity_Destroy(prop); Vector_Delete(props_vector, i); } } for(int i = 0 ; i < Vector_Count(explosions_vector) ; i++) { Entity* exp = (Entity*)Vector_Get(explosions_vector, i); if(!bullet_time_g) { Explosion_Update(exp, world); } Entity_CalculateVisibility(exp, world); if (!exp->alive) { Entity_Destroy(exp); Vector_Delete(explosions_vector, i); } } }