void init18N(int argc, char *argv[]) { int i; int languageId = -1; setlocale(LC_NUMERIC, ""); for (i = 1 ; i < argc ; i++) { if (strcmp(argv[i], "-language") == 0) { languageId = i + 1; if (languageId >= argc) { SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_ERROR, "You must specify a language to use with -language. Using default."); } } } setLanguage("tbftss", languageId == -1 ? NULL : argv[languageId]); SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Numeric is %s", setlocale(LC_NUMERIC, "C")); SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "atof(2.75) is %f", atof("2.75")); }
static void loadCapitalShipDef(char *filename) { cJSON *root; char *text; Entity *e; 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_CAPITAL_SHIP; e->active = 1; STRNCPY(e->name, cJSON_GetObjectItem(root, "name")->valuestring, MAX_NAME_LENGTH); STRNCPY(e->defName, e->name, MAX_NAME_LENGTH); e->shield = e->maxShield = cJSON_GetObjectItem(root, "shield")->valueint; e->shieldRechargeRate = cJSON_GetObjectItem(root, "shieldRechargeRate")->valueint; e->texture = getTexture(cJSON_GetObjectItem(root, "texture")->valuestring); e->speed = 1; e->systemPower = 3; e->flags = EF_NO_HEALTH_BAR; e->action = think; e->die = die; SDL_QueryTexture(e->texture, NULL, NULL, &e->w, &e->h); e->separationRadius = MAX(e->w, e->h); loadComponents(e, cJSON_GetObjectItem(root, "components")); loadGuns(e, cJSON_GetObjectItem(root, "guns")); loadEngines(e, cJSON_GetObjectItem(root, "engines")); cJSON_Delete(root); } else { SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN, "Failed to load '%s'", filename); } free(text); }
void initResources(void) { char **filenames; int i; numBackgrounds = numPlanets = numMusicFiles = 0; filenames = getFileList("gfx/backgrounds", &numBackgrounds); backgrounds = malloc(sizeof(char*) * numBackgrounds); for (i = 0 ; i < numBackgrounds ; i++) { backgrounds[i] = malloc(sizeof(char) * MAX_FILENAME_LENGTH); sprintf(backgrounds[i], "gfx/backgrounds/%s", filenames[i]); SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Adding AUTO %s", filenames[i]); free(filenames[i]); } free(filenames); filenames = getFileList("gfx/planets", &numPlanets); planets = malloc(sizeof(char*) * numPlanets); for (i = 0 ; i < numPlanets ; i++) { planets[i] = malloc(sizeof(char) * MAX_FILENAME_LENGTH); sprintf(planets[i], "gfx/planets/%s", filenames[i]); SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Adding AUTO %s", filenames[i]); free(filenames[i]); } free(filenames); filenames = getFileList("music/battle/", &numMusicFiles); musicFiles = malloc(sizeof(char*) * numMusicFiles); for (i = 0 ; i < numMusicFiles ; i++) { musicFiles[i] = malloc(sizeof(char) * MAX_FILENAME_LENGTH); sprintf(musicFiles[i], "music/battle/%s", filenames[i]); SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Adding AUTO %s", filenames[i]); free(filenames[i]); } free(filenames); }
void saveConfig(void) { int i; char *out, *configFilename; cJSON *root, *controlsJSON, *keysJSON, *mouseJSON, *gameplayJSON; configFilename = getSaveFilePath(CONFIG_FILENAME); SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Saving config ..."); root = cJSON_CreateObject(); cJSON_AddNumberToObject(root, "winWidth", app.winWidth); cJSON_AddNumberToObject(root, "winHeight", app.winHeight); cJSON_AddNumberToObject(root, "fullscreen", app.fullscreen); cJSON_AddNumberToObject(root, "musicVolume", app.musicVolume); cJSON_AddNumberToObject(root, "soundVolume", app.soundVolume); keysJSON = cJSON_CreateObject(); for (i = 0 ; i < CONTROL_MAX ; i++) { cJSON_AddNumberToObject(keysJSON, getLookupName("CONTROL_", i), app.keyControls[i]); } mouseJSON = cJSON_CreateObject(); for (i = 0 ; i < CONTROL_MAX ; i++) { cJSON_AddNumberToObject(mouseJSON, getLookupName("CONTROL_", i), app.mouseControls[i]); } controlsJSON = cJSON_CreateObject(); cJSON_AddItemToObject(controlsJSON, "keys", keysJSON); cJSON_AddItemToObject(controlsJSON, "mouse", mouseJSON); cJSON_AddItemToObject(root, "controls", controlsJSON); gameplayJSON = cJSON_CreateObject(); cJSON_AddNumberToObject(gameplayJSON, "friendlyFire", app.gameplay.friendlyFire); cJSON_AddNumberToObject(gameplayJSON, "autoSwitchPlayerTarget", app.gameplay.autoSwitchPlayerTarget); cJSON_AddNumberToObject(gameplayJSON, "missileReTarget", app.gameplay.missileReTarget); cJSON_AddNumberToObject(gameplayJSON, "healthBars", app.gameplay.healthBars); cJSON_AddItemToObject(root, "gameplay", gameplayJSON); out = cJSON_Print(root); if (!writeFile(configFilename, out)) { SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_ERROR, "Failed to save config"); } cJSON_Delete(root); free(out); }
static void loadTrophyData(char *filename) { cJSON *root, *node; char *text; Trophy *t, *tail; int count[TROPHY_MAX]; SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Loading %s", filename); text = readFile(filename); root = cJSON_Parse(text); tail = &game.trophyHead; memset(count, 0, sizeof(int) * TROPHY_MAX); for (node = root->child ; node != NULL ; node = node->next) { if (cJSON_GetObjectItem(node, "id")->valuestring[0] != '_') { t = malloc(sizeof(Trophy)); memset(t, 0, sizeof(Trophy)); STRNCPY(t->id, cJSON_GetObjectItem(node, "id")->valuestring, MAX_NAME_LENGTH); STRNCPY(t->title, _(cJSON_GetObjectItem(node, "title")->valuestring), MAX_DESCRIPTION_LENGTH); STRNCPY(t->description, _(cJSON_GetObjectItem(node, "description")->valuestring), MAX_DESCRIPTION_LENGTH); t->value = lookup(cJSON_GetObjectItem(node, "value")->valuestring); t->hidden = getJSONValue(node, "hidden", 0); t->stat = -1; /* can't use the getJSONValue here, as it could lead to false positives */ if (cJSON_GetObjectItem(node, "stat")) { t->stat = lookup(cJSON_GetObjectItem(node, "stat")->valuestring); t->statValue = cJSON_GetObjectItem(node, "statValue")->valueint; } count[t->value]++; count[TROPHY_UNEARNED]++; tail->next = t; tail = t; } } SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Trophies (%d) [Bronze=%d, Silver=%d, Gold=%d, Platinum=%d]", count[TROPHY_UNEARNED], count[TROPHY_BRONZE], count[TROPHY_SILVER], count[TROPHY_GOLD], count[TROPHY_PLATINUM]); cJSON_Delete(root); free(text); }
bool Texture::loadFromFile(const std::string& path, SDL_Renderer*& renderer, const double zoomX, const double zoomY) { destroy(); SDL_Texture* newTexture = nullptr; SDL_Surface* loadedSurface = IMG_Load( path.c_str() ); if( loadedSurface == nullptr ) { SDL_LogMessage(SDL_LOG_CATEGORY_VIDEO, SDL_LOG_PRIORITY_ERROR, "Unable to load image %s! SDL_image Error: %s\n", path.c_str(), IMG_GetError()); } else { if (zoomX != 1 && zoomY != 1) { SDL_Surface* zoomedSurface = zoomSurface( loadedSurface, zoomX, zoomY, SMOOTHING_OFF ); if (zoomedSurface != nullptr) { SDL_FreeSurface( loadedSurface ); loadedSurface = nullptr; loadedSurface = zoomedSurface; } else { SDL_LogMessage(SDL_LOG_CATEGORY_VIDEO, SDL_LOG_PRIORITY_WARN, "Unable to resize image %s! SDL_image Error: %s\n", path.c_str(), IMG_GetError()); } } if (SDL_SetColorKey( loadedSurface, SDL_TRUE, SDL_MapRGB( loadedSurface->format, transparentColor.r, transparentColor.g, transparentColor.b ) ) != 0) { SDL_LogMessage(SDL_LOG_CATEGORY_VIDEO, SDL_LOG_PRIORITY_WARN, "Unable to set transparent color."); } newTexture = SDL_CreateTextureFromSurface( renderer, loadedSurface ); if( newTexture == nullptr ) { SDL_LogMessage(SDL_LOG_CATEGORY_VIDEO, SDL_LOG_PRIORITY_ERROR, "Unable to create texture from %s! SDL Error: %s\n", path.c_str(), SDL_GetError() ); } else { pixelWidth = loadedSurface->w; pixelHeight = loadedSurface->h; } SDL_FreeSurface( loadedSurface ); loadedSurface = nullptr; } texture = newTexture; return texture != NULL; }
static void addFighterStat(char *key) { Tuple *t, *tail; tail = &game.fighterStatHead; for (t = game.fighterStatHead.next ; t != NULL ; t = t->next) { if (strcmp(t->key, key) == 0) { return; } tail = t; } t = malloc(sizeof(Tuple)); memset(t, 0, sizeof(Tuple)); STRNCPY(t->key, key, MAX_NAME_LENGTH); t->value = 0; tail->next = t; SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Added '%s' to fighter stats", key); }
void awardTrophy(char *id) { Trophy *t; int numRemaining; numRemaining = 0; for (t = game.trophyHead.next ; t != NULL ; t = t->next) { if (!t->awarded && strcmp(t->id, id) == 0) { t->awarded = 1; t->awardDate = time(NULL); t->notify = SDL_GetTicks(); /* prevent race condition */ SDL_Delay(1); SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Awarding trophy '%s'", t->id); app.saveGame = 1; } if (!t->awarded) { numRemaining++; } } /* the Platinum will always be the last trophy to unlock */ if (numRemaining == 1) { awardTrophy("PLATINUM"); } }
SDL2Logger::~SDL2Logger() { this->write( "\n" ); std::string out( this->output_stream().str() ); SDL_LogMessage( this->category(), SDL2Logger::SDL_priority( this->priority() ), "%s", out.c_str() ); }
void cleanup(void) { SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Cleaning up ..."); SDL_DestroyRenderer(app.renderer); SDL_DestroyWindow(app.window); destroyLookups(); destroyTextures(); expireTexts(1); destroyFonts(); destroySounds(); destroyGame(); destroyFighterDefs(); destroyCapitalShipDefs(); destroyBulletDefs(); destroyItemDefs(); destroyStarSystems(); destroyBattle(); destroyGalacticMap(); destroyWidgets(); destroyResources(); destroyCredits(); SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Done"); TTF_Quit(); SDL_Quit(); }
void Render::CreateRender(SDL_Renderer*& renderer, Physics* physicsWorld, Camera* camera, Text* texts) { if (renderer == nullptr) { SDL_LogMessage(SDL_LOG_CATEGORY_ERROR, SDL_LOG_PRIORITY_ERROR, "Render pointer is null"); throw error::RENDER_NULL; } if (physicsWorld == nullptr) { SDL_LogMessage(SDL_LOG_CATEGORY_ERROR, SDL_LOG_PRIORITY_ERROR, "Physics World pointer is null"); throw error::RENDER_NULL; } this->renderer = renderer; this->physicsWorld = physicsWorld; this->camera = camera; this->texts = texts; }
static void loadWidgetSet(char *filename) { cJSON *root, *node; char *text; Widget *w; SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Loading %s", filename); text = readFile(filename); root = cJSON_Parse(text); for (node = root->child ; node != NULL ; node = node->next) { w = malloc(sizeof(Widget)); memset(w, 0, sizeof(Widget)); w->type = lookup(cJSON_GetObjectItem(node, "type")->valuestring); STRNCPY(w->name, cJSON_GetObjectItem(node, "name")->valuestring, MAX_NAME_LENGTH); STRNCPY(w->group, cJSON_GetObjectItem(node, "group")->valuestring, MAX_NAME_LENGTH); w->rect.x = cJSON_GetObjectItem(node, "x")->valueint; w->rect.y = cJSON_GetObjectItem(node, "y")->valueint; w->rect.w = cJSON_GetObjectItem(node, "w")->valueint; w->rect.h = cJSON_GetObjectItem(node, "h")->valueint; w->enabled = 1; w->visible = 1; if (w->rect.x == -1) { w->rect.x = SCREEN_WIDTH / 2; } switch (w->type) { case WT_BUTTON: STRNCPY(w->text, cJSON_GetObjectItem(node, "text")->valuestring, MAX_NAME_LENGTH); w->rect.x -= w->rect.w / 2; w->rect.y -= (w->rect.h / 2) + 8; break; case WT_SELECT: STRNCPY(w->text, cJSON_GetObjectItem(node, "text")->valuestring, MAX_NAME_LENGTH); w->rect.x -= w->rect.w / 2; w->rect.y -= (w->rect.h / 2) + 8; createOptions(w, cJSON_GetObjectItem(node, "options")->valuestring); break; } tail->next = w; tail = w; } cJSON_Delete(root); free(text); }
static void resizeDrawList(void) { int n; n = drawCapacity + INITIAL_DEBRIS_DRAW_CAPACITY; SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_DEBUG, "Resizing debris draw capacity: %d -> %d", drawCapacity, n); debrisToDraw = resize(debrisToDraw, sizeof(Debris*) * drawCapacity, sizeof(Debris*) * n); drawCapacity = n; }
static void resizeDrawList(void) { int n; n = drawCapacity + INITIAL_EFFECT_DRAW_CAPACITY; SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_DEBUG, "Resizing effect draw capacity: %d -> %d", drawCapacity, n); effectsToDraw = resize(effectsToDraw, sizeof(Effect*) * drawCapacity, sizeof(Effect*) * n); drawCapacity = n; }
void Logger::LogMessage(std::string pMessage) { std::chrono::system_clock::time_point today = std::chrono::system_clock::now(); std::time_t tt = std::chrono::system_clock::to_time_t(today); std::string timeStr = ctime(&tt); timeStr.pop_back(); pMessage = timeStr + " : " + pMessage; SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, pMessage.c_str()); _ofs << pMessage << std::endl; }
/* * Prints given message with a timestamp in the TEST category and INFO priority. */ void SDLTest_Log(char *fmt, ...) { va_list list; char logMessage[SDLTEST_MAX_LOGMESSAGE_LENGTH]; // Print log message into a buffer memset(logMessage, 0, SDLTEST_MAX_LOGMESSAGE_LENGTH); va_start(list, fmt); SDL_vsnprintf(logMessage, SDLTEST_MAX_LOGMESSAGE_LENGTH - 1, fmt, list); va_end(list); // Log with timestamp and newline SDL_LogMessage(SDL_LOG_CATEGORY_TEST, SDL_LOG_PRIORITY_INFO, "%s: %s\n", SDLTest_TimestampToString(time(0)), logMessage); }
void countNumEnemies(void) { Entity *e; for (e = battle.entityHead.next ; e != NULL ; e = e->next) { if (e->side != SIDE_ALLIES && e->type == ET_FIGHTER) { battle.numInitialEnemies++; } } SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_DEBUG, "battle.numInitialEnemies=%d", battle.numInitialEnemies); }
/* * Prints given message with a timestamp in the TEST category and the ERROR priority. */ void SDLTest_LogError(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) { va_list list; char logMessage[SDLTEST_MAX_LOGMESSAGE_LENGTH]; /* Print log message into a buffer */ SDL_memset(logMessage, 0, SDLTEST_MAX_LOGMESSAGE_LENGTH); va_start(list, fmt); SDL_vsnprintf(logMessage, SDLTEST_MAX_LOGMESSAGE_LENGTH - 1, fmt, list); va_end(list); /* Log with timestamp and newline */ SDL_LogMessage(SDL_LOG_CATEGORY_TEST, SDL_LOG_PRIORITY_ERROR, "%s: %s", SDLTest_TimestampToString(time(0)), logMessage); }
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]++; } }
void createSaveFolder(void) { char *userHome; char dir[MAX_FILENAME_LENGTH]; userHome = getenv("HOME"); if (!userHome) { SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN, "Unable to determine user save folder. Will save to current dir."); return; } SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "User home = %s", userHome); sprintf(dir, "%s/.local/share/tbftss", userHome); if (mkdir(dir, S_IRWXU|S_IRWXG|S_IROTH|S_IXOTH) != 0 && errno != EEXIST) { SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN, "Failed to create save dir '%s'. Will save to current dir.", dir); return; } STRNCPY(app.saveDir, dir, MAX_FILENAME_LENGTH); }
void Render::drawBackGround(void) { auto itPlayer = physicsWorld->bodiesBySpriteType.find(entity::TypeOfSprite::SPRT_CHARACTER); if (itPlayer != physicsWorld->bodiesBySpriteType.end()) { camera->cameraFollowObj(utls::Conv::fullConversionCartesianPosToScreenPos(itPlayer->second->GetFixtureList(), itPlayer->second->GetWorldCenter(), itPlayer->second->GetAngle()), camera->cameraPosition); SDL_Rect origin = {camera->cameraPosition.x, camera->cameraPosition.y, measure::CAMERA_WIDTH_PX, measure::CAMERA_HEIGHT_PX}; SDL_Rect destination = {0, 0, measure::CAMERA_WIDTH_PX, measure::CAMERA_HEIGHT_PX}; SDL_RenderCopy(renderer, camera->backGround.getSDLTexture(), &origin, &destination); } else SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN, "Main Players not found"); }
Widget *getWidget(const char *name, const char *group) { Widget *w; for (w = head.next; w != NULL ; w = w->next) { if (strcmp(w->name, name) == 0 && strcmp(w->group, group) == 0) { return w; } } SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN, "No such widget ('%s', '%s')", name, group); return NULL; }
static void va_log_message(enum log_priority priority, const char *fmt, va_list args) { SDL_LogPriority sdl_priority; int size; char *buffer; va_list temp; if (priority >= LOG_PRIORITY_NUM_PRIORITIES) priority = LOG_PRIORITY_INFO; sdl_priority = priority_info[priority].sdl_priority; va_copy(temp, args); size = vsnprintf(NULL, 0, fmt, temp) + 1; va_end(temp); buffer = NULL; if (size) { buffer = malloc(size); if (!buffer) return; } va_copy(temp, args); vsnprintf(buffer, size, fmt, temp); va_end(temp); #if GUI_ENABLED if (gui_enabled && (priority == LOG_PRIORITY_ERROR)) { gui_error(buffer); } #endif SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, sdl_priority, buffer, ""); free(buffer); }
static void setPilotName(void) { int i, pos; pos = -1; for (i = 0 ; i < strlen(game.currentMission->pilot) ; i++) { if (game.currentMission->pilot[i] == ' ') { pos = i; } } memset(player->name, '\0', MAX_NAME_LENGTH); if (pos != -1) { memcpy(player->name, game.currentMission->pilot + pos + 1, strlen(game.currentMission->pilot) - pos - 1); } SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Pilot name = '%s'", player->name); }
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); } } }
bool Controller::handleGameState(SDL_Event* event) { bool quit = flag::CONTINUE_GAME; static Uint32 ms = 0; while( SDL_PollEvent( event ) != 0 ) { if( event->type == SDL_QUIT ) { quit = flag::QUIT_GAME; } else if ( event->type == SDL_KEYDOWN && event->key.keysym.sym == SDLK_ESCAPE) { quit = flag::QUIT_GAME; } else if( event->type == SDL_MOUSEBUTTONDOWN ) { SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_DEBUG, "Mouse click position: [%d, %d]", camera->cameraPosition.x + event->button.x, event->button.y); } else { if (event->type == SDL_WINDOWEVENT) { switch (event->window.event) { case SDL_WINDOWEVENT_SHOWN: SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_VERBOSE, "Window %d shown", event->window.windowID); ms = 0; break; case SDL_WINDOWEVENT_HIDDEN: SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_VERBOSE, "Window %d hidden", event->window.windowID); ms = measure::RESUME_STATE_DELAY_IN_MS; break; case SDL_WINDOWEVENT_EXPOSED: SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_VERBOSE, "Window %d exposed", event->window.windowID); ms = 0; break; case SDL_WINDOWEVENT_MOVED: SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_VERBOSE, "Window %d moved to %d,%d", event->window.windowID, event->window.data1, event->window.data2); ms = 0; break; case SDL_WINDOWEVENT_RESIZED: SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_VERBOSE, "Window %d resized to %dx%d", event->window.windowID, event->window.data1, event->window.data2); ms = 0; break; case SDL_WINDOWEVENT_MINIMIZED: SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_VERBOSE, "Window %d minimized", event->window.windowID); ms = measure::RESUME_STATE_DELAY_IN_MS; break; case SDL_WINDOWEVENT_MAXIMIZED: SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_VERBOSE,"Window %d maximized", event->window.windowID); ms = 0; break; case SDL_WINDOWEVENT_RESTORED: SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_VERBOSE, "Window %d restored", event->window.windowID); ms = 0;; break; case SDL_WINDOWEVENT_FOCUS_GAINED: SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_VERBOSE, "Window %d gained keyboard focus", event->window.windowID); ms = 0; break; case SDL_WINDOWEVENT_FOCUS_LOST: SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_VERBOSE, "Window %d lost keyboard focus", event->window.windowID); ms = measure::RESUME_STATE_DELAY_IN_MS; break; case SDL_WINDOWEVENT_CLOSE: SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_VERBOSE, "Window %d closed", event->window.windowID); ms = measure::RESUME_STATE_DELAY_IN_MS; break; default: SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN, "Window %d got unknown event %d", event->window.windowID, event->window.event); ms = 0; break; } } } } SDL_Delay(ms); return quit; }
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); } } }
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); }
void initSDL(void) { int rendererFlags, windowFlags; /* do this here, so we don't destroy the save dir stored in app */ memset(&app, 0, sizeof(App)); /* done in src/plat/ */ createSaveFolder(); rendererFlags = SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC; windowFlags = 0; loadConfig(); if (app.fullscreen) { windowFlags |= SDL_WINDOW_FULLSCREEN; } if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO) < 0) { printf("Couldn't initialize SDL: %s\n", SDL_GetError()); exit(1); } SDL_ShowCursor(0); if (Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 1024) == -1) { printf("Couldn't initialize SDL Mixer\n"); exit(1); } Mix_AllocateChannels(64); Mix_Volume(-1, app.soundVolume * MIX_MAX_VOLUME / 10); Mix_VolumeMusic(app.musicVolume * MIX_MAX_VOLUME / 10); app.window = SDL_CreateWindow("TBFTSS - The Pandoran War", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, app.winWidth, app.winHeight, windowFlags); SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear"); app.renderer = SDL_CreateRenderer(app.window, -1, rendererFlags); IMG_Init(IMG_INIT_PNG | IMG_INIT_JPG); if (TTF_Init() < 0) { printf("Couldn't initialize SDL TTF: %s\n", SDL_GetError()); exit(1); } app.backBuffer = SDL_CreateTexture(app.renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, SCREEN_WIDTH, SCREEN_HEIGHT); app.scaleX = SCREEN_WIDTH; app.scaleX /= app.winWidth; app.scaleY = SCREEN_HEIGHT; app.scaleY /= app.winHeight; SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Game scale factor: %.2f,%.2f\n", app.scaleX, app.scaleY); }
void Render::drawPhysicWorld(void) { b2Body* ptr = physicsWorld->getWorld()->GetBodyList(); b2Fixture* fixture = nullptr; b2Shape::Type shapeType; while(ptr) { fixture = ptr->GetFixtureList(); shapeType = fixture->GetType(); if (shapeType == b2Shape::e_polygon) { for (b2Fixture* fixtureElement = ptr->GetFixtureList(); fixtureElement; fixtureElement = fixtureElement->GetNext()) { SDL_SetRenderDrawColor( renderer, 0x00, 0x00, 0xFF, 0xFF ); b2Vec2 points[4]; for(int i=0;i<4;i++) { //points[i]=((b2PolygonShape*)ptr->GetFixtureList()->GetShape())->GetVertex(i); points[i]=((b2PolygonShape*)fixtureElement->GetShape())->GetVertex(i); utls::Conv::rotateTranslate(points[i], ptr->GetWorldCenter(), ptr->GetAngle()); } SDL_Point pointA = utls::Conv::convCartesianPosToScreennPos(points[0]); SDL_Point pointB = utls::Conv::convCartesianPosToScreennPos(points[1]); pointA.x = pointA.x - camera->cameraPosition.x; pointB.x = pointB.x - camera->cameraPosition.x; SDL_RenderDrawLine(renderer, pointA.x, pointA.y, pointB.x, pointB.y); pointA = utls::Conv::convCartesianPosToScreennPos(points[1]); pointB = utls::Conv::convCartesianPosToScreennPos(points[2]); pointA.x = pointA.x - camera->cameraPosition.x; pointB.x = pointB.x - camera->cameraPosition.x; SDL_RenderDrawLine(renderer, pointA.x, pointA.y, pointB.x, pointB.y); pointA = utls::Conv::convCartesianPosToScreennPos(points[2]); pointB = utls::Conv::convCartesianPosToScreennPos(points[3]); pointA.x = pointA.x - camera->cameraPosition.x; pointB.x = pointB.x - camera->cameraPosition.x; SDL_RenderDrawLine(renderer, pointA.x, pointA.y, pointB.x, pointB.y); pointA = utls::Conv::convCartesianPosToScreennPos(points[3]); pointB = utls::Conv::convCartesianPosToScreennPos(points[0]); pointA.x = pointA.x - camera->cameraPosition.x; pointB.x = pointB.x - camera->cameraPosition.x; SDL_RenderDrawLine(renderer, pointA.x, pointA.y, pointB.x, pointB.y); } } else if (shapeType == b2Shape::e_chain) { SDL_SetRenderDrawColor( renderer, 0x00, 0xFF, 0xFF, 0xFF ); b2Vec2 point; b2ChainShape* chain = (b2ChainShape*)ptr->GetFixtureList()->GetShape(); int numEdges = chain->GetChildCount(); //int numVertices = chain->m_hasNextVertex ? numEdges : numEdges + 1; b2EdgeShape edgeShape; for (int i = 0; i < numEdges; i++) { chain->GetChildEdge( &edgeShape, i ); SDL_Point pointA = utls::Conv::convCartesianPosToScreennPos(edgeShape.m_vertex0); SDL_Point pointB = utls::Conv::convCartesianPosToScreennPos(edgeShape.m_vertex1); pointA.x = pointA.x - camera->cameraPosition.x; pointB.x = pointB.x - camera->cameraPosition.x; SDL_RenderDrawLine(renderer, pointA.x, pointA.y, pointB.x, pointB.y); } } else if (shapeType == b2Shape::e_circle) { SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN, "Draw Physics: Circle is not implemented, yet"); } else { SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN, "Draw Physics: Shape no implemented"); } ptr = ptr->GetNext(); } }