forked from github/server
repair spellbooks that broke in E3 and E4 (temporary measure, remember to remove this code).
This commit is contained in:
parent
ff38d8bf4c
commit
8716e5fdc5
|
@ -100,6 +100,7 @@
|
|||
<param name="magic.power" value="0.5"/>
|
||||
<param name="resource.factor" value="0.25"/>
|
||||
|
||||
<param name="fix.spells" value="319"/>
|
||||
<param name="skills.cost.tactics" value="500"/>
|
||||
<param name="entertain.base" value="0"/>
|
||||
<param name="entertain.perlevel" value="20"/>
|
||||
|
|
|
@ -101,6 +101,7 @@
|
|||
<param name="magic.power" value="0.5"/>
|
||||
<param name="resource.factor" value="0.25"/>
|
||||
|
||||
<param name="fix.spells" value="67"/>
|
||||
<param name="skills.cost.tactics" value="500"/>
|
||||
<param name="entertain.base" value="0"/>
|
||||
<param name="entertain.perlevel" value="20"/>
|
||||
|
|
|
@ -64,6 +64,7 @@ ENDIF()
|
|||
|
||||
set (ERESSEA_SRC
|
||||
move.c
|
||||
repair.c
|
||||
spells.c
|
||||
battle.c
|
||||
alchemy.c
|
||||
|
|
|
@ -48,6 +48,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|||
#include "unit.h"
|
||||
#include "lighthouse.h"
|
||||
#include "version.h"
|
||||
#include "repair.h"
|
||||
|
||||
/* attributes includes */
|
||||
#include <attributes/key.h>
|
||||
|
@ -1695,6 +1696,11 @@ int readgame(const char *filename, int backup)
|
|||
remove_empty_factions();
|
||||
}
|
||||
log_printf(stdout, "Done loading turn %d.\n", turn);
|
||||
|
||||
n = get_param_int(global.parameters, "fix.spells", -1);
|
||||
if (n>=turn) {
|
||||
repair_spells("spells.txt");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,86 @@
|
|||
#include <platform.h>
|
||||
#include <kernel/config.h>
|
||||
|
||||
#include "repair.h"
|
||||
#include <kernel/faction.h>
|
||||
#include <kernel/spellbook.h>
|
||||
|
||||
#include <util/log.h>
|
||||
#include <util/base36.h>
|
||||
|
||||
#include <quicklist.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
static void write_spellbook_states(FILE *F) {
|
||||
faction *f;
|
||||
for (f = factions; f; f = f->next) {
|
||||
spellbook *sb = f->spellbook;
|
||||
int len = sb ? ql_length(sb->spells) : 0;
|
||||
fprintf(F, "%s %d %d\n", itoa36(f->no), f->subscription, len);
|
||||
}
|
||||
}
|
||||
|
||||
static void limit_spellbook(faction *f, int num) {
|
||||
spellbook *sb = f->spellbook;
|
||||
int len = sb ? ql_length(sb->spells) : 0;
|
||||
if (len < num) {
|
||||
log_error("limit_spellbook: spellbook is shorter than expected, %d < %d", len, num);
|
||||
}
|
||||
// delete spells backwards from the end:
|
||||
while (len > num) {
|
||||
ql_delete(&sb->spells, len--);
|
||||
}
|
||||
}
|
||||
|
||||
void repair_spells(const char *filename) {
|
||||
FILE *F = fopen(filename, "r");
|
||||
if (F) {
|
||||
char id[32];
|
||||
int numspells, sub;
|
||||
faction *f;
|
||||
while (fscanf(F, "%s %d %d", id, &sub, &numspells) != EOF) {
|
||||
int no = atoi36(id);
|
||||
|
||||
f = findfaction(no);
|
||||
if (!f) {
|
||||
for (f = factions; f; f = f->next) {
|
||||
if (f->subscription == sub) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (f) {
|
||||
log_info("repair_spells: faction %s renamed to %s, located by subscription %d", id, itoa36(f->no), sub);
|
||||
}
|
||||
else {
|
||||
log_warning("repair_spells: cannot fix faction %s, no such subscription: %d (%d spells)", id, sub, numspells);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (f->subscription != sub) {
|
||||
log_warning("repair_spells: subscription mismatch for faction %s, %d!=%d (%d spells)", id, f->subscription, sub, numspells);
|
||||
}
|
||||
else {
|
||||
limit_spellbook(f, numspells);
|
||||
fset(f, FFL_MARK);
|
||||
}
|
||||
}
|
||||
for (f = factions; f; f = f->next) {
|
||||
if (!fval(f, FFL_MARK)) {
|
||||
numspells = ql_length(f->spellbook->spells);
|
||||
log_warning("repair_spells: faction %s did not get a spellbook fix (%d spells at level)", itoa36(f->no), numspells, f->max_spelllevel);
|
||||
}
|
||||
freset(f, FFL_MARK);
|
||||
}
|
||||
}
|
||||
else {
|
||||
F = fopen(filename, "w");
|
||||
if (!F) {
|
||||
perror("repair_spells");
|
||||
abort();
|
||||
}
|
||||
write_spellbook_state(F);
|
||||
}
|
||||
fclose(F);
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
|
||||
#ifndef H_REPAIR
|
||||
#define H_REPAIR
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
void repair_spells(const char *filename); // one-time reduction of E3/E4 spellbooks (called at the end of readgame)
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
Loading…
Reference in New Issue