static void loadComponents(Entity *parent, cJSON *components) { Entity *e; cJSON *component; parent->health = 0; if (components) { component = components->child; while (component) { e = malloc(sizeof(Entity)); memset(e, 0, sizeof(Entity)); defTail->next = e; defTail = e; e->active = 1; e->type = ET_COMPONENT; e->health = e->maxHealth = cJSON_GetObjectItem(component, "health")->valueint; e->offsetX = cJSON_GetObjectItem(component, "x")->valueint; e->offsetY = cJSON_GetObjectItem(component, "y")->valueint; e->texture = getTexture(cJSON_GetObjectItem(component, "texture")->valuestring); SDL_QueryTexture(e->texture, NULL, NULL, &e->w, &e->h); if (cJSON_GetObjectItem(component, "flags")) { e->flags = flagsToLong(cJSON_GetObjectItem(component, "flags")->valuestring, NULL); } if (cJSON_GetObjectItem(component, "aiFlags")) { e->aiFlags = flagsToLong(cJSON_GetObjectItem(component, "aiFlags")->valuestring, NULL); } e->systemPower = MAX_SYSTEM_POWER; e->die = componentDie; e->owner = parent; component = component->next; parent->health++; } } parent->maxHealth = parent->health; }
static void loadGuns(Entity *parent, cJSON *guns) { Entity *e; cJSON *gun; if (guns) { gun = guns->child; while (gun) { e = malloc(sizeof(Entity)); memset(e, 0, sizeof(Entity)); defTail->next = e; defTail = e; e->active = 1; e->type = ET_COMPONENT_GUN; e->health = e->maxHealth = cJSON_GetObjectItem(gun, "health")->valueint; e->reloadTime = cJSON_GetObjectItem(gun, "reloadTime")->valueint; e->offsetX = cJSON_GetObjectItem(gun, "x")->valueint; e->offsetY = cJSON_GetObjectItem(gun, "y")->valueint; e->texture = getTexture(cJSON_GetObjectItem(gun, "texture")->valuestring); e->guns[0].type = lookup(cJSON_GetObjectItem(gun, "type")->valuestring); e->missiles = getJSONValue(gun, "missiles", 0); if (cJSON_GetObjectItem(gun, "flags")) { e->flags = flagsToLong(cJSON_GetObjectItem(gun, "flags")->valuestring, NULL); } if (cJSON_GetObjectItem(gun, "aiFlags")) { e->aiFlags = flagsToLong(cJSON_GetObjectItem(gun, "aiFlags")->valuestring, NULL); } SDL_QueryTexture(e->texture, NULL, NULL, &e->w, &e->h); e->systemPower = MAX_SYSTEM_POWER; e->action = gunThink; e->die = gunDie; e->owner = parent; gun = gun->next; } } }
void loadPlayer(cJSON *node) { char *type; int side, addFlags; long flags; type = cJSON_GetObjectItem(node, "type")->valuestring; side = lookup(cJSON_GetObjectItem(node, "side")->valuestring); flags = -1; player = spawnFighter(type, 0, 0, side); player->x = BATTLE_AREA_WIDTH / 2; player->y = BATTLE_AREA_HEIGHT / 2; if (cJSON_GetObjectItem(node, "x")) { player->x = (cJSON_GetObjectItem(node, "x")->valuedouble / BATTLE_AREA_CELLS) * BATTLE_AREA_WIDTH; player->y = (cJSON_GetObjectItem(node, "y")->valuedouble / BATTLE_AREA_CELLS) * BATTLE_AREA_HEIGHT; } if (cJSON_GetObjectItem(node, "flags")) { flags = flagsToLong(cJSON_GetObjectItem(node, "flags")->valuestring, &addFlags); } if (flags != -1) { if (addFlags) { player->flags |= flags; } else { player->flags = flags; SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN, "Flags for Player replaced"); } } if (strcmp(type, "Tug") == 0) { battle.stats[STAT_TUG]++; } if (strcmp(type, "Shuttle") == 0) { battle.stats[STAT_SHUTTLE]++; } }
static void loadEngines(Entity *parent, cJSON *engines) { Entity *e; cJSON *engine; if (engines) { engine = engines->child; while (engine) { e = malloc(sizeof(Entity)); memset(e, 0, sizeof(Entity)); defTail->next = e; defTail = e; e->active = 1; e->type = ET_COMPONENT_ENGINE; e->health = e->maxHealth = cJSON_GetObjectItem(engine, "health")->valueint; e->offsetX = cJSON_GetObjectItem(engine, "x")->valueint; e->offsetY = cJSON_GetObjectItem(engine, "y")->valueint; e->texture = getTexture(cJSON_GetObjectItem(engine, "texture")->valuestring); if (cJSON_GetObjectItem(engine, "flags")) { e->flags = flagsToLong(cJSON_GetObjectItem(engine, "flags")->valuestring, NULL); } SDL_QueryTexture(e->texture, NULL, NULL, &e->w, &e->h); e->systemPower = MAX_SYSTEM_POWER; e->action = engineThink; e->die = engineDie; e->owner = parent; engine = engine->next; } } }
void loadCapitalShips(cJSON *node) { Entity *e; char **types, *name, *groupName, *type; int side, scatter, number, active; int i, numTypes, addFlags; long flags; float x, y; if (node) { node = node->child; while (node) { name = NULL; groupName = NULL; flags = -1; types = toTypeArray(cJSON_GetObjectItem(node, "types")->valuestring, &numTypes); side = lookup(cJSON_GetObjectItem(node, "side")->valuestring); x = (cJSON_GetObjectItem(node, "x")->valuedouble / BATTLE_AREA_CELLS) * BATTLE_AREA_WIDTH; y = (cJSON_GetObjectItem(node, "y")->valuedouble / BATTLE_AREA_CELLS) * BATTLE_AREA_HEIGHT; name = getJSONValueStr(node, "name", NULL); groupName = getJSONValueStr(node, "groupName", NULL); number = getJSONValue(node, "number", 1); scatter = getJSONValue(node, "scatter", 1); active = getJSONValue(node, "active", 1); if (cJSON_GetObjectItem(node, "flags")) { flags = flagsToLong(cJSON_GetObjectItem(node, "flags")->valuestring, &addFlags); } for (i = 0 ; i < number ; i++) { type = types[rand() % numTypes]; e = spawnCapitalShip(type, x, y, side); if (scatter > 1) { e->x += (rand() % scatter) - (rand() % scatter); e->y += (rand() % scatter) - (rand() % scatter); } e->active = active; if (name) { STRNCPY(e->name, name, MAX_NAME_LENGTH); } if (groupName) { STRNCPY(e->groupName, groupName, MAX_NAME_LENGTH); } if (flags != -1) { if (addFlags) { e->flags |= flags; } else { e->flags = flags; SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN, "Flags for '%s' (%s) replaced", e->name, e->defName); } } updateCapitalShipComponentProperties(e, flags); SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_DEBUG, "%s (%d / %d)", e->name, e->health, e->maxHealth); } node = node->next; for (i = 0 ; i < numTypes ; i++) { free(types[i]); } free(types); } } }
void loadFighters(cJSON *node) { Entity *e; char **types, *name, *groupName, *type, *strpos; int side, scatter, number, active; int i, numTypes, addFlags, addAIFlags, id; long flags, aiFlags; float x, y; if (node) { id = 0; node = node->child; while (node) { name = NULL; groupName = NULL; flags = -1; aiFlags = -1; types = toTypeArray(cJSON_GetObjectItem(node, "types")->valuestring, &numTypes); side = lookup(cJSON_GetObjectItem(node, "side")->valuestring); x = (cJSON_GetObjectItem(node, "x")->valuedouble / BATTLE_AREA_CELLS) * BATTLE_AREA_WIDTH; y = (cJSON_GetObjectItem(node, "y")->valuedouble / BATTLE_AREA_CELLS) * BATTLE_AREA_HEIGHT; name = getJSONValueStr(node, "name", NULL); groupName = getJSONValueStr(node, "groupName", NULL); number = getJSONValue(node, "number", 1); scatter = getJSONValue(node, "scatter", 1); active = getJSONValue(node, "active", 1); if (cJSON_GetObjectItem(node, "flags")) { flags = flagsToLong(cJSON_GetObjectItem(node, "flags")->valuestring, &addFlags); } if (cJSON_GetObjectItem(node, "aiFlags")) { aiFlags = flagsToLong(cJSON_GetObjectItem(node, "aiFlags")->valuestring, &addAIFlags); } for (i = 0 ; i < number ; i++) { type = types[rand() % numTypes]; e = spawnFighter(type, x, y, side); if (scatter > 1) { e->x += (rand() % scatter) - (rand() % scatter); e->y += (rand() % scatter) - (rand() % scatter); } e->active = active; if (flags != -1) { if (addFlags) { e->flags |= flags; } else { e->flags = flags; SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN, "Flags for '%s' (%s) replaced", e->name, e->defName); } if (e->flags & EF_DISABLED) { e->speed = 0; } } if (aiFlags != -1) { if (addAIFlags) { e->aiFlags |= aiFlags; } else { e->aiFlags = aiFlags; SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN, "AI Flags for '%s' (%s) replaced", e->name, e->defName); } } if (name) { STRNCPY(e->name, name, MAX_NAME_LENGTH); /* update 'name #?' to 'name #1', etc. */ strpos = strstr(e->name, "#?"); if (strpos) { *(++strpos) = ('0' + ++id); } } if (groupName) { STRNCPY(e->groupName, groupName, MAX_NAME_LENGTH); } } node = node->next; for (i = 0 ; i < numTypes ; i++) { free(types[i]); } free(types); } } }
static void loadFighterDef(char *filename) { cJSON *root, *node; char *text; Entity *e; int i; SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Loading %s", filename); text = readFile(filename); root = cJSON_Parse(text); if (root) { e = malloc(sizeof(Entity)); memset(e, 0, sizeof(Entity)); defTail->next = e; defTail = e; e->type = ET_FIGHTER; e->active = 1; STRNCPY(e->name, cJSON_GetObjectItem(root, "name")->valuestring, MAX_NAME_LENGTH); STRNCPY(e->defName, e->name, MAX_NAME_LENGTH); e->health = e->maxHealth = cJSON_GetObjectItem(root, "health")->valueint; e->shield = e->maxShield = getJSONValue(root, "shield", 0); e->speed = cJSON_GetObjectItem(root, "speed")->valuedouble; e->reloadTime = getJSONValue(root, "reloadTime", 0); e->shieldRechargeRate = getJSONValue(root, "shieldRechargeRate", 0); e->texture = getTexture(cJSON_GetObjectItem(root, "texture")->valuestring); SDL_QueryTexture(e->texture, NULL, NULL, &e->w, &e->h); if (cJSON_GetObjectItem(root, "guns")) { i = 0; for (node = cJSON_GetObjectItem(root, "guns")->child ; node != NULL ; node = node->next) { e->guns[i].type = lookup(cJSON_GetObjectItem(node, "type")->valuestring); e->guns[i].x = cJSON_GetObjectItem(node, "x")->valueint; e->guns[i].y = cJSON_GetObjectItem(node, "y")->valueint; i++; if (i >= MAX_FIGHTER_GUNS) { printf("ERROR: cannot assign more than %d guns to a fighter\n", MAX_FIGHTER_GUNS); exit(1); } } e->combinedGuns = getJSONValue(root, "combinedGuns", 0); } e->selectedGunType = e->guns[0].type; e->missiles = getJSONValue(root, "missiles", 0); if (cJSON_GetObjectItem(root, "flags")) { e->flags = flagsToLong(cJSON_GetObjectItem(root, "flags")->valuestring, NULL); } if (cJSON_GetObjectItem(root, "aiFlags")) { e->aiFlags = flagsToLong(cJSON_GetObjectItem(root, "aiFlags")->valuestring, NULL); } if (cJSON_GetObjectItem(root, "deathType")) { e->deathType = lookup(cJSON_GetObjectItem(root, "deathType")->valuestring); } if (e->flags & EF_COMMON_FIGHTER) { addFighterStat(e->name); } e->separationRadius = MAX(e->w, e->h) * 3; e->systemPower = MAX_SYSTEM_POWER; cJSON_Delete(root); } else { SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN, "Failed to load '%s'", filename); } free(text); }