static void Scenario_Load_Structure(const char *key, char *settings) { uint8 index, houseType, structureType; uint16 hitpoints, position; char *split; /* 'GEN' marked keys are Slabs and Walls, where the number following indicates the position on the map */ if (strncasecmp(key, "GEN", 3) == 0) { /* Position on the map is in the key */ position = atoi(key + 3); /* The value should have two values separated by a ',' */ split = strchr(settings, ','); if (split == NULL) return; *split = '\0'; /* First value is the House type */ houseType = House_StringToType(settings); if (houseType == HOUSE_INVALID) return; /* Second value is the Structure type */ settings = split + 1; structureType = Structure_StringToType(settings); if (structureType == STRUCTURE_INVALID) return; Structure_Create(STRUCTURE_INDEX_INVALID, structureType, houseType, position); return; } /* The key should start with 'ID', followed by the index */ index = atoi(key + 2); /* The value should have four values separated by a ',' */ split = strchr(settings, ','); if (split == NULL) return; *split = '\0'; /* First value is the House type */ houseType = House_StringToType(settings); if (houseType == HOUSE_INVALID) return; /* Find the next value in the ',' separated list */ settings = split + 1; split = strchr(settings, ','); if (split == NULL) return; *split = '\0'; /* Second value is the Structure type */ structureType = Structure_StringToType(settings); if (structureType == STRUCTURE_INVALID) return; /* Find the next value in the ',' separated list */ settings = split + 1; split = strchr(settings, ','); if (split == NULL) return; *split = '\0'; /* Third value is the Hitpoints in percent (in base 256) */ hitpoints = atoi(settings); /* ENHANCEMENT -- Dune2 ignores the % hitpoints read from the scenario */ if (!g_dune2_enhanced) hitpoints = 256; /* Fourth value is the position of the structure */ settings = split + 1; position = atoi(settings); /* Ensure nothing is already on the tile */ /* XXX -- DUNE2 BUG? -- This only checks the top-left corner? Not really a safety, is it? */ if (Structure_Get_ByPackedTile(position) != NULL) return; { Structure *s; s = Structure_Create(index, structureType, houseType, position); if (s == NULL) return; s->o.hitpoints = hitpoints * g_table_structureInfo[s->o.type].o.hitpoints / 256; s->o.flags.s.degrades = false; s->state = STRUCTURE_STATE_IDLE; } }
static void ReadProfileIni(const char *filename) { char *source; char *key; char *keys; char buffer[120]; uint16 locsi; if (filename == NULL) return; if (!File_Exists(filename)) return; source = GFX_Screen_Get_ByIndex(SCREEN_1); memset(source, 0, 32000); File_ReadBlockFile(filename, source, GFX_Screen_GetSize_ByIndex(SCREEN_1)); keys = source + strlen(source) + 5000; *keys = '\0'; Ini_GetString("construct", NULL, keys, keys, 2000, source); for (key = keys; *key != '\0'; key += strlen(key) + 1) { ObjectInfo *oi = NULL; uint16 count; uint8 type; uint16 buildCredits; uint16 buildTime; uint16 fogUncoverRadius; uint16 availableCampaign; uint16 sortPriority; uint16 priorityBuild; uint16 priorityTarget; uint16 hitpoints; type = Unit_StringToType(key); if (type != UNIT_INVALID) { oi = &g_table_unitInfo[type].o; } else { type = Structure_StringToType(key); if (type != STRUCTURE_INVALID) oi = &g_table_structureInfo[type].o; } if (oi == NULL) continue; Ini_GetString("construct", key, buffer, buffer, 120, source); count = sscanf(buffer, "%hu,%hu,%hu,%hu,%hu,%hu,%hu,%hu", &buildCredits, &buildTime, &hitpoints, &fogUncoverRadius, &availableCampaign, &priorityBuild, &priorityTarget, &sortPriority); oi->buildCredits = buildCredits; oi->buildTime = buildTime; oi->hitpoints = hitpoints; oi->fogUncoverRadius = fogUncoverRadius; oi->availableCampaign = availableCampaign; oi->priorityBuild = priorityBuild; oi->priorityTarget = priorityTarget; if (count <= 7) continue; oi->sortPriority = (uint8)sortPriority; } if (g_debugGame) { for (locsi = 0; locsi < UNIT_MAX; locsi++) { ObjectInfo *oi = &g_table_unitInfo[locsi].o; sprintf(buffer, "%*s%4d,%4d,%4d,%4d,%4d,%4d,%4d,%4d", 15 - (int)strlen(oi->name), "", oi->buildCredits, oi->buildTime, oi->hitpoints, oi->fogUncoverRadius, oi->availableCampaign, oi->priorityBuild, oi->priorityTarget, oi->sortPriority); Ini_SetString("construct", oi->name, buffer, source); } for (locsi = 0; locsi < STRUCTURE_MAX; locsi++) { ObjectInfo *oi = &g_table_unitInfo[locsi].o; sprintf(buffer, "%*s%4d,%4d,%4d,%4d,%4d,%4d,%4d,%4d", 15 - (int)strlen(oi->name), "", oi->buildCredits, oi->buildTime, oi->hitpoints, oi->fogUncoverRadius, oi->availableCampaign, oi->priorityBuild, oi->priorityTarget, oi->sortPriority); Ini_SetString("construct", oi->name, buffer, source); } } *keys = '\0'; Ini_GetString("combat", NULL, keys, keys, 2000, source); for (key = keys; *key != '\0'; key += strlen(key) + 1) { uint16 damage; uint16 movingSpeedFactor; uint16 fireDelay; uint16 fireDistance; Ini_GetString("combat", key, buffer, buffer, 120, source); String_Trim(buffer); if (sscanf(buffer, "%hu,%hu,%hu,%hu", &fireDistance, &damage, &fireDelay, &movingSpeedFactor) < 4) continue; for (locsi = 0; locsi < UNIT_MAX; locsi++) { UnitInfo *ui = &g_table_unitInfo[locsi]; if (strcasecmp(ui->o.name, key) != 0) continue; ui->damage = damage; ui->movingSpeedFactor = movingSpeedFactor; ui->fireDelay = fireDelay; ui->fireDistance = fireDistance; break; } } if (!g_debugGame) return; for (locsi = 0; locsi < UNIT_MAX; locsi++) { const UnitInfo *ui = &g_table_unitInfo[locsi]; sprintf(buffer, "%*s%4d,%4d,%4d,%4d", 15 - (int)strlen(ui->o.name), "", ui->fireDistance, ui->damage, ui->fireDelay, ui->movingSpeedFactor); Ini_SetString("combat", ui->o.name, buffer, source); } }