Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
		}
	}
}
Exemplo n.º 3
0
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]++;
	}
}
Exemplo n.º 4
0
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;
		}
	}
}
Exemplo n.º 5
0
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);
		}
	}
}
Exemplo n.º 6
0
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);
		}
	}
}
Exemplo n.º 7
0
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);
}