static inline void reset_player_position( State * const state ) { init_entity( & state->player.entity , 0, state->map.height / 2 , PLAYER_SPEED ); }
void init_spawning(GameState* state) { if (!state->spells.frost_wave_active && state->wave.spawn_counter == state->wave.spawn_interval) { state->wave.spawn_counter = 0; if (state->wave.nr_of_spawned_enemies != state->wave.nr_of_enemies) { //nieuwe entity aanmaken en checken welk type vijand er moer gespawned worden Entity enemy; init_entity(&enemy, ENEMY, state->world.spawn->spawn_location.world_x, state->world.spawn->spawn_location.world_y, ENEMY_SIZE, ENEMY_SIZE); if (state->wave.nr_of_spawned_enemies % 5 == 1 && (state->wave.boss_wave && state->wave.nr_of_enemies - 1 != state->wave.nr_of_spawned_enemies)) { init_enemy(&enemy, ELITE); enemy.enemy.health_max = ENEMY_ELITE_HEALTH + (state->wave.wave_number * (state->wave.wave_number / 3) * (ENEMY_ELITE_HEALTH * 0.1)); } else if (state->wave.boss_wave == 1 && state->wave.nr_of_enemies - 1 == state->wave.nr_of_spawned_enemies) { init_enemy(&enemy, BOSS); enemy.enemy.health_max = ENEMY_BOSS_HEALTH + (state->wave.wave_number * (state->wave.wave_number / 3) * (ENEMY_BOSS_HEALTH * 0.1)); } else if (state->wave.wave_number >= 4) { int random = rand() % 100; if (state->wave.wave_number >= 8) { //5% kans op FAST if (random < 5) { init_enemy(&enemy, FAST); enemy.enemy.health_max = ENEMY_FAST_HEALTH + (state->wave.wave_number * (state->wave.wave_number / 3) * (ENEMY_FAST_HEALTH * 0.1)); } //Ook nog eens 10% kans op AIR else if (random < 15) { init_enemy(&enemy, AIR); enemy.enemy.health_max = ENEMY_AIR_HEALTH + (state->wave.wave_number * (state->wave.wave_number / 3) * (ENEMY_AIR_HEALTH * 0.1)); } else{ init_enemy(&enemy, NORMAL); enemy.enemy.health_max = ENEMY_NORMAL_HEALTH + (state->wave.wave_number * (state->wave.wave_number / 3) * (ENEMY_NORMAL_HEALTH * 0.1)); } } else { // 10% kans op AIR if (random < 10) { init_enemy(&enemy, AIR); enemy.enemy.health_max = ENEMY_AIR_HEALTH + (state->wave.wave_number * (state->wave.wave_number / 3) * (ENEMY_AIR_HEALTH * 0.1)); }else { init_enemy(&enemy, NORMAL); enemy.enemy.health_max = ENEMY_NORMAL_HEALTH + (state->wave.wave_number * (state->wave.wave_number / 3) * (ENEMY_NORMAL_HEALTH * 0.1)); } } } else { init_enemy(&enemy, NORMAL); enemy.enemy.health_max = ENEMY_NORMAL_HEALTH + (state->wave.wave_number * (state->wave.wave_number / 3) * (ENEMY_NORMAL_HEALTH * 0.1)); } //verdere algemene eigenschappen instellen enemy.enemy.health = enemy.enemy.health_max; state->enemies = (Entity*) realloc(state->enemies, (state->enemies_length + 1) * sizeof(Entity)); create_path(&enemy.enemy.path, &state->world, &enemy, state->world.castle, enemy.enemy.path.trajectory_type); state->enemies[state->enemies_length] = enemy; state->enemies[state->enemies_length].type = ENEMY; state->enemies_length++; state->wave.nr_of_spawned_enemies++; } } else if (!state->spells.frost_wave_active) { state->wave.spawn_counter++; } }
Entity* world_area_get_next_entity(World_Area* area) { if(area->entities_count + 1 >= area->entities_capacity) { Log_Error("Ran out of entities"); return NULL; } Entity* e = area->entities + area->entities_count++; init_entity(e); e->area = area; e->body = sim_get_next_body(&area->sim); e->body_id = e->body->id; e->id = area->next_entity_id++; e->body->entity = e; e->body->entity_id = e->id; return e; }
Entity * place_tower(World * world, TowerType type, float world_x, float world_y) { int tile_x = convert_world2tile_x(world_x); int tile_y = convert_world2tile_y(world_y); if (world->entities[tile_x][tile_y].type == EMPTY) { Path path; Entity* tower = (Entity*) malloc(sizeof(Entity)); init_entity(tower, TOWER, world_x, world_y, TILE_SIZE, TILE_SIZE); tower->tower.tower_type = type; switch (type) { case MACHINE_GUN: init_machine_gun(tower, world_x, world_y); break; case ROCKET_LAUNCHER: init_rocket_launcher(tower, world_x, world_y); break; case FLAK_CANNON: init_flak_cannon(tower, world_x, world_y); break; } tower->tower.target = NULL; tower->tower.projectiles = (Projectile*) calloc(tower->tower.ammo, sizeof(Projectile)); world->entities[tile_x][tile_y] = *tower; path.current_node_index = 0; path.length = 0; path.trajectory_type = OVER_LAND; path.nodes = (Node*) malloc(sizeof(Node)); if (create_path(&path, world, world->spawn, world->castle, OVER_LAND) != 0) { destroy_path(&path); return tower; } else { world->entities[convert_world2tile_x(tower->all.world_x)][convert_world2tile_y(tower->all.world_y)].type = EMPTY; destroy_tower(world, tower); destroy_path(&path); return NULL; } } return NULL; }