Project

General

Profile

Feature #77 ยป 0011-Store-activity-triggering-actions-to-savegame.patch

Marko Lindqvist, 12/25/2023 01:09 PM

View differences:

server/savegame/savecompat.c
free(savemod);
}
}
/* Add actions for unit activities */
if (format_class == SAVEGAME_3) {
loading->activities.size
= secfile_lookup_int_default(loading->file, 0,
"savefile.activities_size");
if (loading->activities.size) {
loading->activities.order
= secfile_lookup_str_vec(loading->file, &loading->activities.size,
"savefile.activities_vector");
sg_failure_ret(loading->activities.size != 0,
"Failed to load activity order: %s",
secfile_error());
}
loading->action.size = secfile_lookup_int_default(loading->file, 0,
"savefile.action_size");
sg_failure_ret(loading->action.size > 0,
"Failed to load action order: %s",
secfile_error());
if (loading->action.size) {
const char **modname;
int j;
modname = secfile_lookup_str_vec(loading->file, &loading->action.size,
"savefile.action_vector");
loading->action.order = fc_calloc(loading->action.size,
sizeof(*loading->action.order));
for (j = 0; j < loading->action.size; j++) {
struct action *real_action = action_by_rule_name(modname[j]);
if (real_action) {
loading->action.order[j] = real_action->id;
} else {
log_sg("Unknown action \'%s\'", modname[j]);
loading->action.order[j] = ACTION_NONE;
}
}
free(modname);
}
player_slots_iterate(pslot) {
int plrno = player_slot_index(pslot);
int nunits;
int unro;
if (secfile_section_lookup(loading->file, "player%d", plrno) == nullptr) {
continue;
}
nunits = secfile_lookup_int_default(loading->file, 0,
"player%d.nunits", plrno);
for (unro = 0; unro < nunits; unro++) {
int ei;
int i;
enum unit_activity activity;
enum gen_action act;
ei = secfile_lookup_int_default(loading->file, -1,
"player%d.u%d.activity", plrno, unro);
if (ei >= 0 && ei < loading->activities.size) {
activity = unit_activity_by_name(loading->activities.order[ei],
fc_strcasecmp);
act = activity_default_action(activity);
for (i = 0; i < loading->action.size; i++) {
if (act == loading->action.order[i]) {
secfile_insert_int(loading->file, i, "player%d.u%d.action",
plrno, unro);
break;
}
}
}
}
} player_slots_iterate_end;
}
}
/************************************************************************//**
......
secfile_insert_bool(loading->file, FALSE, "map.altitude");
/* Add actions for unit activities */
loading->activities.size
= secfile_lookup_int_default(loading->file, 0,
"savefile.activities_size");
if (loading->activities.size) {
loading->activities.order
= secfile_lookup_str_vec(loading->file, &loading->activities.size,
"savefile.activities_vector");
sg_failure_ret(loading->activities.size != 0,
"Failed to load activity order: %s",
secfile_error());
}
loading->action.size = secfile_lookup_int_default(loading->file, 0,
"savefile.action_size");
sg_failure_ret(loading->action.size > 0,
"Failed to load action order: %s",
secfile_error());
if (loading->action.size) {
const char **modname;
int j;
modname = secfile_lookup_str_vec(loading->file, &loading->action.size,
"savefile.action_vector");
loading->action.order = fc_calloc(loading->action.size,
sizeof(*loading->action.order));
for (j = 0; j < loading->action.size; j++) {
struct action *real_action = action_by_rule_name(modname[j]);
if (real_action) {
loading->action.order[j] = real_action->id;
} else {
log_sg("Unknown action \'%s\'", modname[j]);
loading->action.order[j] = ACTION_NONE;
}
}
free(modname);
}
player_slots_iterate(pslot) {
int plrno = player_slot_index(pslot);
int nunits;
int unro;
if (secfile_section_lookup(loading->file, "player%d", plrno) == nullptr) {
continue;
}
nunits = secfile_lookup_int_default(loading->file, 0,
"player%d.nunits", plrno);
for (unro = 0; unro < nunits; unro++) {
int ei;
int i;
enum unit_activity activity;
enum gen_action act;
ei = secfile_lookup_int_default(loading->file, -1,
"player%d.u%d.activity", plrno, unro);
if (ei >= 0 && ei < loading->activities.size) {
activity = unit_activity_by_name(loading->activities.order[ei],
fc_strcasecmp);
act = activity_default_action(activity);
for (i = 0; i < loading->action.size; i++) {
if (act == loading->action.order[i]) {
secfile_insert_int(loading->file, i, "player%d.u%d.action",
plrno, unro);
break;
}
}
}
}
} player_slots_iterate_end;
} /* Version < 3.2.92 */
#endif /* FREECIV_DEV_SAVE_COMPAT_3_3 */
server/savegame/savegame3.c
int natnbr;
int unconverted;
const char *str;
enum gen_action action;
sg_warn_ret_val(secfile_lookup_int(loading->file, &punit->id, "%s.id",
unitstr), FALSE, "%s", secfile_error());
......
"%s", secfile_error());
activity = unit_activity_by_name(loading->activities.order[ei],
fc_strcasecmp);
sg_warn_ret_val(secfile_lookup_int(loading->file, &ei,
"%s.action", unitstr), FALSE,
"%s", secfile_error());
action = loading->action.order[ei];
punit->server.birth_turn
= secfile_lookup_int_default(loading->file, game.info.turn,
......
if (extra_id != -2) {
if (extra_id >= 0 && extra_id < loading->extra.size) {
pextra = loading->extra.order[extra_id];
/* FIXME: Correct action from the savegame */
set_unit_activity_targeted(punit, activity, pextra,
activity_default_action(activity));
set_unit_activity_targeted(punit, activity, pextra, action);
} else if (activity == ACTIVITY_IRRIGATE) {
struct extra_type *tgt = next_extra_for_tile(unit_tile(punit),
EC_IRRIGATION,
unit_owner(punit),
punit);
if (tgt != NULL) {
/* FIXME: Correct action from the savegame */
set_unit_activity_targeted(punit, ACTIVITY_IRRIGATE, tgt,
activity_default_action(ACTIVITY_IRRIGATE));
set_unit_activity_targeted(punit, ACTIVITY_IRRIGATE, tgt, action);
} else {
/* FIXME: Correct action from the savegame */
set_unit_activity(punit, ACTIVITY_CULTIVATE,
activity_default_action(ACTIVITY_CULTIVATE));
set_unit_activity(punit, ACTIVITY_CULTIVATE, action);
}
} else if (activity == ACTIVITY_MINE) {
struct extra_type *tgt = next_extra_for_tile(unit_tile(punit),
......
unit_owner(punit),
punit);
if (tgt != NULL) {
/* FIXME: Correct action from the savegame */
set_unit_activity_targeted(punit, ACTIVITY_MINE, tgt,
activity_default_action(ACTIVITY_MINE));
set_unit_activity_targeted(punit, ACTIVITY_MINE, tgt, action);
} else {
/* FIXME: Correct action from the savegame */
set_unit_activity(punit, ACTIVITY_PLANT,
activity_default_action(ACTIVITY_PLANT));
set_unit_activity(punit, ACTIVITY_PLANT, action);
}
} else {
/* FIXME: Correct action from the savegame */
set_unit_activity(punit, activity,
activity_default_action(activity));
set_unit_activity(punit, activity, action);
}
} else {
/* FIXME: Correct action from the savegame */
set_unit_activity_targeted(punit, activity, NULL,
activity_default_action(activity));
set_unit_activity_targeted(punit, activity, NULL, action);
} /* activity_tgt == NULL */
sg_warn_ret_val(secfile_lookup_int(loading->file, &punit->activity_count,
......
secfile_insert_int(saving->file, punit->activity, "%s.activity", buf);
secfile_insert_int(saving->file, punit->activity_count,
"%s.activity_count", buf);
secfile_insert_int(saving->file, punit->action, "%s.action", buf);
if (punit->activity_target == NULL) {
secfile_insert_int(saving->file, -1, "%s.activity_tgt", buf);
} else {
    (1-1/1)