parent
5ffa594200
commit
c3305a9522
@ -0,0 +1,124 @@ |
||||
#include "enemy.h" |
||||
#include "entity.h" |
||||
#include "scene.h" |
||||
#include "game.h" |
||||
#include "sound_source.h" |
||||
#include "../common/log.h" |
||||
#include "../common/hashmap.h" |
||||
#include "../common/parser.h" |
||||
|
||||
#include <string.h> |
||||
|
||||
void enemy_init(struct Enemy* enemy, int type) |
||||
{ |
||||
struct Game_State* game_state = game_state_get(); |
||||
struct Scene* scene = game_state->scene; |
||||
|
||||
enemy->base.type = ET_ENEMY; |
||||
enemy->type = type; |
||||
|
||||
char weapon_name_buffer[MAX_ENTITY_NAME_LEN]; |
||||
char mesh_name_buffer[MAX_ENTITY_NAME_LEN]; |
||||
memset(weapon_name_buffer, '\0', MAX_ENTITY_NAME_LEN); |
||||
memset(mesh_name_buffer, '\0', MAX_ENTITY_NAME_LEN); |
||||
|
||||
snprintf(weapon_name_buffer, MAX_ENTITY_NAME_LEN, "%s_Weapon_Sound", enemy->base.name); |
||||
snprintf(mesh_name_buffer, MAX_ENTITY_NAME_LEN, "%s_Mesh", enemy->base.name); |
||||
|
||||
struct Sound_Source* weapon_sound = NULL; |
||||
struct Static_Mesh* mesh = NULL; |
||||
|
||||
/* Initialization specific to each enemy type */ |
||||
switch(enemy->type) |
||||
{ |
||||
case ENEMY_TURRET: |
||||
{ |
||||
enemy->Turret.turn_speed = 10.f; |
||||
enemy->health = 100; |
||||
enemy->damage = 10; |
||||
weapon_sound = scene_sound_source_create(scene, weapon_name_buffer, enemy, "sounds/bullet_1.wav", ST_WAV, false, false); |
||||
mesh = scene_static_mesh_create(scene, mesh_name_buffer, enemy, "suzanne.symbres", MAT_BLINN); |
||||
break; |
||||
} |
||||
default: |
||||
log_error("enemy:init", "Unsupported Enemy Type"); |
||||
break; |
||||
} |
||||
|
||||
enemy->weapon_sound = weapon_sound ? weapon_sound : NULL; |
||||
if(!weapon_sound) |
||||
log_error("enemy:init", "Failed to add weapon sound for %s", enemy->base.name); |
||||
|
||||
enemy->mesh = mesh ? mesh : NULL; |
||||
if(!mesh) |
||||
log_error("enemy:init", "Failed to add mesh from file for %s", enemy->base.name); |
||||
|
||||
enemy->mesh->base.flags |= EF_TRANSIENT; |
||||
enemy->weapon_sound->base.flags |= EF_TRANSIENT; |
||||
} |
||||
|
||||
void enemy_update(struct Enemy* enemy, struct Scene* scene, float dt) |
||||
{ |
||||
static float enemy_update_interval = 1.f / 2.f; |
||||
static float time_elapsed_since_last_update = 0.f; |
||||
|
||||
time_elapsed_since_last_update += dt; |
||||
if(time_elapsed_since_last_update < enemy_update_interval) |
||||
return; |
||||
|
||||
time_elapsed_since_last_update = 0.f; |
||||
struct Game_State* game_state = game_state_get(); |
||||
|
||||
log_message("Enemy_update"); |
||||
sound_source_play(game_state->sound, enemy->weapon_sound); |
||||
} |
||||
|
||||
void enemy_reset(struct Enemy* enemy) |
||||
{ |
||||
entity_reset(enemy, enemy->base.id); |
||||
enemy->base.flags = EF_NONE; |
||||
} |
||||
|
||||
struct Enemy* enemy_read(struct Parser_Object* object, const char* name, struct Entity* parent_entity) |
||||
{ |
||||
int enemy_type = -1; |
||||
struct Enemy* new_enemy = NULL; |
||||
struct Scene* scene = game_state_get()->scene; |
||||
|
||||
if(hashmap_value_exists(object->data, "enemy_type")) enemy_type = hashmap_int_get(object->data, "enemy_type"); |
||||
|
||||
if(enemy_type != -1) |
||||
{ |
||||
new_enemy = scene_enemy_create(scene, name, parent_entity, enemy_type); |
||||
if(!new_enemy) |
||||
return new_enemy; |
||||
if(hashmap_value_exists(object->data, "health")) new_enemy->health = hashmap_int_get(object->data, "health"); |
||||
if(hashmap_value_exists(object->data, "damage")) new_enemy->damage = hashmap_int_get(object->data, "damage"); |
||||
|
||||
switch(new_enemy->type) |
||||
{ |
||||
case ENEMY_TURRET: |
||||
{ |
||||
if(hashmap_value_exists(object->data, "turn_speed")) new_enemy->Turret.turn_speed = hashmap_float_get(object->data, "turn_speed"); |
||||
} |
||||
break; |
||||
} |
||||
} |
||||
return new_enemy; |
||||
} |
||||
|
||||
void enemy_write(struct Enemy* enemy, struct Hashmap* entity_data) |
||||
{ |
||||
hashmap_int_set(entity_data, "enemy_type", enemy->type); |
||||
hashmap_int_set(entity_data, "health", enemy->health); |
||||
hashmap_int_set(entity_data, "damage", enemy->damage); |
||||
|
||||
switch(enemy->type) |
||||
{ |
||||
case ENEMY_TURRET: |
||||
{ |
||||
hashmap_float_set(entity_data, "turn_speed", enemy->Turret.turn_speed); |
||||
} |
||||
break; |
||||
} |
||||
} |
@ -0,0 +1,16 @@ |
||||
#ifndef ENEMY_H |
||||
#define ENEMY_H |
||||
|
||||
struct Enemy; |
||||
struct Scene; |
||||
struct Parser_Object; |
||||
struct Entity; |
||||
struct Hashmap; |
||||
|
||||
void enemy_init(struct Enemy* enemy, int type); |
||||
void enemy_update(struct Enemy* enemy, struct Scene* scene, float dt); |
||||
void enemy_reset(struct Enemy* enemy); |
||||
struct Enemy* enemy_read(struct Parser_Object* object, const char* name, struct Entity* parent_entity); |
||||
void enemy_write(struct Enemy* enemy, struct Hashmap* entity_data); |
||||
|
||||
#endif |
Loading…
Reference in new issue