| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- /*
- * This file is part of RuneOptimizer.
- *
- * RuneOptimizer is free software: you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the Free
- * Software Foundation, either version 3 of the License, or (at your option)
- * any later version.
- *
- * RuneOptimizer is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * RuneOptimizer. If not, see <https://www.gnu.org/licenses/>.
- */
- /**
- * @file update_efficiency.c
- *
- * Implementation of {@link update_efficiency}.
- *
- * This file implements the funciton {@link update_efficiency} declared in
- * {@link update.h}.
- */
- #include <stdio.h>
- #include <sqlite3.h>
- #include "../error/error.h"
- #include "../db/db.h"
- #include "../runeoptimizer.h"
- extern int update_efficiency(char *id, float *efficiency, float *max_efficiency){
- *efficiency = 0.0f;
- *max_efficiency = 0.0f;
- float eff[5] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f};
- sqlite3_stmt *stmt_rune;
- sqlite3_stmt *stmt_stats;
- char *parameters[1] = {id};
- db_query(
- &stmt_rune, "SELECT stars, level FROM runes WHERE id = ?", parameters
- );
- if (SQLITE_ROW != sqlite3_step(stmt_rune)) {
- fprintf(stderr, "Rune not found: %s\n", sqlite3_errmsg(db));
- sqlite3_finalize(stmt_rune);
- return(ERROR_DB_SELECT_RUNE);
- }
- int stars = sqlite3_column_int(stmt_rune, 0);
- int level = sqlite3_column_int(stmt_rune, 1);
- db_query(
- &stmt_stats,
- "SELECT slot, stat, value FROM rune_stats WHERE rune = ? AND slot != -1",
- parameters
- );
- // Calculate efficiency for each slot.
- // Main slot is excluded from the calculation.
- while (SQLITE_ROW == sqlite3_step(stmt_stats)){
- int slot = sqlite3_column_int(stmt_stats, 0);
- int stat = sqlite3_column_int(stmt_stats, 1);
- int value = sqlite3_column_int(stmt_stats, 2);
- int max_roll_value = STAT_ROLL_MAX[stat][stars];
- eff[slot] += (((float) value) / ((float) max_roll_value));
- }
- sqlite3_finalize(stmt_stats);
- sqlite3_finalize(stmt_rune);
- // Sum each slot efficiency.
- // Each roll contributes only 1/9 to the total efficiency.
- for (int i = 0; i < 5; i ++){
- eff[i] = eff[i] / 9.0f;
- *efficiency += eff[i];
- }
- // Calculate max efficiency. For each power up remaining, add 1/9.
- *max_efficiency = *efficiency;
- if (level < 12) *max_efficiency += (1.0f / 9.0f);
- if (level < 9) *max_efficiency += (1.0f / 9.0f);
- if (level < 6) *max_efficiency += (1.0f / 9.0f);
- if (level < 3) *max_efficiency += (1.0f / 9.0f);
- // Multiply by 100 to get a percent value
- *efficiency *= 100.0f;
- *max_efficiency *= 100.0f;
- return(SUCCESS);
- }
|