/* Create the player */ Player * New_Player(ObjectType *ot, int x, int y) { Player *ret = malloc(sizeof(Player)); ret->ctype = New_CharacterType(ot, NULL); /* Add the player character */ CharacterType_AddCharacter(ret->ctype, x, y, 0, 0); /* shortcut to the objecttype, not sure why */ ret->otype = ret->ctype->object_type; /* shortcut to the physical object */ ret->object = ret->otype->instances; return ret; }
//Looks through the level and adds every object and character from the level into the world World * World_LoadWorldFromLevel(Level * level, Container *container) { World *ret = malloc(sizeof(World)); char *player_texture; char *brick_texture; char *melee_enemy_texture; char *ranged_enemy_texture; char *flying_enemy_texture; ret->size.h = level->height * TILE_SCALE; ret->size.w = level->width * TILE_SCALE; ret->theme = level->theme; ret->is_complete = false; //Depending on the theme of the level, different textures are loaded switch (level->theme) { case LAVA: ret->background.still = New_Texture(container->renderer, "../assets/img/Lava/background_tiled.png"); player_texture = "../assets/img/Lava/player.png"; brick_texture = "../assets/img/Lava/brick.png"; melee_enemy_texture = "../assets/img/Lava/melee_enemy.png"; ranged_enemy_texture = "../assets/img/Lava/ranged_enemy.png"; flying_enemy_texture = "../assets/img/Lava/flying_enemy.png"; break; case MEDIEVAL: ret->background.still = New_Texture(container->renderer, "../assets/img/Medieval/background_still.png"); player_texture = "../assets/img/Medieval/player.png"; brick_texture = "../assets/img/Medieval/brick.png"; melee_enemy_texture = "../assets/img/Medieval/melee_enemy.png"; ranged_enemy_texture = "../assets/img/Medieval/ranged_enemy.png"; flying_enemy_texture = "../assets/img/Medieval/flying_enemy.png"; break; case ICE: ret->background.still = New_Texture(container->renderer, "../assets/img/Ice/background_tiled.png"); player_texture = "../assets/img/Ice/player.png"; brick_texture = "../assets/img/Ice/brick.png"; melee_enemy_texture = "../assets/img/Ice/melee_enemy.png"; ranged_enemy_texture = "../assets/img/Ice/ranged_enemy.png"; flying_enemy_texture = "../assets/img/Ice/flying_enemy.png"; break; case SPOOKY: ret->background.still = New_Texture(container->renderer, "../assets/img/Spooky/background_still.png"); player_texture = "../assets/img/Spooky/player.png"; brick_texture = "../assets/img/Spooky/brick.png"; melee_enemy_texture = "../assets/img/Spooky/melee_enemy.png"; ranged_enemy_texture = "../assets/img/Spooky/ranged_enemy.png"; flying_enemy_texture = "../assets/img/Spook/flying_enemy.png"; break; } //Loads in a player, which contains an objecttype and other variables ret->player = New_Player( New_ObjectType( New_Spritesheet( New_Texture( container->renderer, player_texture ), 10, 8, 8, 4, 4, 3, 3, 2, 2, 1, 1 ), 26, 36 ), 0, 0, level->theme ); //Adds an objecttype for the goalposts ret->goalpost = New_ObjectType( New_Spritesheet( New_Texture(container->renderer, "../assets/img/goalpost.png"), 1, 1 ), 32, 32 ); ret->EnemyTypeCount = 3; ret->EnemyTypes = malloc(ret->EnemyTypeCount * sizeof(CharacterType *)); /* Create Melee enemy type */ ret->EnemyTypes[0] = New_CharacterType( New_ObjectType( New_Spritesheet( New_Texture(container->renderer, melee_enemy_texture), 10, 8, 8, 4, 4, 3, 3, 2, 2, 1, 1 ), 31, 33 ), NULL, 1, 100, 5 ); debug_msg("Melee enemy CharacterType: %p\tObjectType: %p\n", ret->EnemyTypes[0], ret->EnemyTypes[0]->object_type); ret->EnemyTypes[1] = New_CharacterType( New_ObjectType( New_Spritesheet( New_Texture(container->renderer, ranged_enemy_texture), 10, 8, 8, 4, 4, 3, 3, 2, 2, 1, 1 ), 31, 33 ), NULL, 1, 100, 1 ); debug_msg("Ranged enemy CharacterType: %p\tObjectType: %p\tTexture: %p\n", ret->EnemyTypes[1], ret->EnemyTypes[1]->object_type, ret->EnemyTypes[1]->object_type->spritesheet->texture); ret->EnemyTypes[2] = New_CharacterType( New_ObjectType( New_Spritesheet( New_Texture(container->renderer, flying_enemy_texture), 6, 4, 4, 3, 3, 2, 2 ), 34, 33 ), NULL, /* behavior */ 2, 100, 1 ); debug_msg("Flying enemy CharacterType: %p\tObjectType: %p\n", ret->EnemyTypes[2], ret->EnemyTypes[2]->object_type); ret->ObjectTypeCount = 1; ret->ObjectTypes = malloc(ret->ObjectTypeCount * sizeof(ObjectType *)); ret->ObjectTypes[0] = New_ObjectType( New_Spritesheet( New_Texture(container->renderer, brick_texture), 1, 16 ), TILE_SCALE, TILE_SCALE /* width, height */ ); /* Collect and load instances from level tiles */ for (int y = 0; y < level->height; y++) { for (int x = 0; x < level->width; x++) { //Add whatever object you need to add switch (level->tileArray[y][x]) { case BRICK: ObjectType_AddObject(ret->ObjectTypes[OBJECT_BRICK], x * TILE_SCALE, y * TILE_SCALE); ret->ObjectTypes[OBJECT_BRICK]->instances[ret->ObjectTypes[OBJECT_BRICK]->instance_count - 1].sprite_index[0] = Level_GetBrickChoice(level, x, y); break; case PLAYER: ret->player->object->dstrect.x = x * TILE_SCALE; ret->player->object->dstrect.y = y * TILE_SCALE; break; case GOALPOST: ObjectType_AddObject(ret->goalpost, x * TILE_SCALE, y * TILE_SCALE); break; case MELEE: CharacterType_AddCharacter(ret->EnemyTypes[0], x * TILE_SCALE, y * TILE_SCALE); break; case RANGED: CharacterType_AddCharacter(ret->EnemyTypes[1], x * TILE_SCALE, y * TILE_SCALE); break; case FLYING: CharacterType_AddCharacter(ret->EnemyTypes[2], x * TILE_SCALE, y * TILE_SCALE); // case BOSS: // ret->boss->object->dstrect.x = x * TILE_SCALE; // ret->boss->object->dstrect.y = y * TILE_SCALE; // break; default: break; } } } return ret; }