Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make saves backward- and forward- compatable. #40

Closed
kevingranade opened this issue Feb 6, 2013 · 10 comments
Closed

Make saves backward- and forward- compatable. #40

kevingranade opened this issue Feb 6, 2013 · 10 comments
Labels
<Enhancement / Feature> New features, or enhancements on existing

Comments

@kevingranade
Copy link
Member

This is a really long-term issue. Currently data is pushed out to the save file by exporting the value of various enums, and some data is position-dependent, e.g. a certain point in the save file there is a list of skill values, and which values is associated with which skill depends on its order in the list. Similarly items are stored as the value of their enum, and if the enum changes between builds items will be read back from the save as a different item.

In order to make saves backward and forward compatible, all data in the save file must be labelled or positioned in a way that is stable across builds. The simplest way to do this is to label each value with a string indicating its type, but this might be prohibitive for some aspects of the save, such as map data. Since serialization is handled separately by each class, each class can be updated independently to handle this so we can slowly proceed toward supporting full save compatibility.

In addition, to make saves backwards-compatible, the code reading in the save will have to either ignore or interpolate unknown values. So with a new skill, the code would discard unknown skills, but with e.g. guns, the game might substitute a different gun that exists in the current version.

@aawilson
Copy link

It seems like handling this for real would require kind of a "migrations" file for versions that keeps note of save file format changes. One consideration for making that easier might be to think about going into a lightweight database system (like sqlite) to let it handle most of the garbage around labeling and positioning data.

@ZwodahS
Copy link
Contributor

ZwodahS commented Mar 14, 2013

actually making it backward compatible is not important. Most player will want to play a new updated version. Making it forward compatible is more important, so new version don't break the save that the player already have.

@aawilson
Copy link

I think you are confused. Do you mean to say that rather than writing future versions of the executable to accept older versions of the save files, the save file format should be written in such a way that it can handle all versions of the executable? That would be both insanely difficult and limiting compared to the other way around, since it's impossible to see into the future to know what requirements a particular version will require of its save files, but it's (relatively) easy to look into the past to see what needs to be made up for for an old save file to work with a new executable. The only benefit of trying to design for forward-compatibility would be for someone to use a new savefile with an old executable, which is hardly an interesting use case.

@ZwodahS
Copy link
Contributor

ZwodahS commented Mar 14, 2013

no. I probably phrase it in a wrong way. I meant that all executable should be able to handle all past save files.
It depends on how you see backward compatible. I am saying that savefile being backward compatible is not necessary, as in, the save file being compatible with older executable. However, if you see it in that the executable should be backward compatible, then yes, that is what i meant.

@aawilson
Copy link

Haha, yeah, the English language is terrible like that

@kevingranade
Copy link
Member Author

Foward-compatability is nice because it means people can try out new versions with their existing saves, and then fall back to a previous version if there is some problem. There are various ways to support this, but what I'm mostly thinking of is that if a particular entity in a save is not recognized, the game substitutes a valid fallback. The key really is that future content might be lost, but the game as a whole would still be playable.

As I outlined in the original issue, it requires two things. The format of the save file must to be locked down, and the values used for entities within the save file must be stable. We can achieve the second by writing out unique strings of some kind rather than raw integer values like we do now.

I'm not super familiar with integrating programs with sqlite, but I'm skeptical that doing so will solve our labelling problems. It seems very likely that they'll just move to the internals of a SQL statement instead of the source code.

@ZwodahS
Copy link
Contributor

ZwodahS commented Mar 16, 2013

ambiguity in language is what makes NLP hard :P.

Anyway, I doubt SQLite will do much either, since it is just a way to read/write data. Like what kevin say, it is just about how we want to handle it in code. I think forward compatibility will be useful if we are releasing daily snapshot.

But here is the problem, how can a old exe know what a string means and find a replacement for it ? Like say we want to add chicken into the game, so we may have MRE - chicken. Due to problem, we want to change all MRE - chicken to MRE - beef, but the old exe do not have MRE - chicken in the unique string, let alone knowing what that means.

@jjs2
Copy link
Contributor

jjs2 commented Jun 23, 2013

Here's how to do it:

Have a table of integer-string mappings...

e.g. 0: "nothing", 1: "door", 2: "door/locked", etc....

You can generate this mapping during program startup as well... every time you load a new symbolic json id for an object or creature or terrain type (or when creating the first instance of a compound object or terrain type, e.g. "arrow/fletched+field_tipped+flammable" or "bear/hibernating" or "door/locked+boarded"), you append it to the in-memory table. (e.g. a vector of strings. but you also want a hashmap for the reverse lookups...)

Then when writing the save file, you just serialize this table, and then spit out integers as before. When loading a save, first create an integer->integer mapping from the old save file's integer ids to the currently running program's integer ids for the same keys.

@kevingranade
Copy link
Member Author

We're maintaining backwards compat from 0.8 until further notice, but forward compat is still a bit off. Should have made two issues.

@kevingranade
Copy link
Member Author

This is just baked into the system and development as a whole. We're not totally there yet, but such a broad issue isn't productive.

lispcoc pushed a commit to lispcoc/Cataclysm-DDA that referenced this issue Jun 1, 2020
kevingranade pushed a commit that referenced this issue Apr 7, 2023
sonphantrung added a commit to sonphantrung/Cataclysm-DDA that referenced this issue Nov 2, 2024
# This is the 1st commit message:

ios build

# This is the commit message #2:

Add legacy handling and overmapbuffer::is_in_city

# This is the commit message #3:

Correct doc example

# This is the commit message #4:

Correct distance calc

Not sure why I were checking 2 thick circles?

# This is the commit message #5:

Appease our clang overlords

# This is the commit message #6:

It helps if you add save/load handling

# This is the commit message CleverRaven#7:

Remove unnecessary project

Co-authored-by: ehughsbaird <44244083+ehughsbaird@users.noreply.github.com>
# This is the commit message CleverRaven#8:

Fix minor typos in keybdings.json
# This is the commit message CleverRaven#9:

Update data/raw/keybindings.json
# This is the commit message CleverRaven#10:

Added imgui_freetype.cpp to vcxproj to fix broken build.

# This is the commit message CleverRaven#11:

Fixing compile error related to map::get_field usage

# This is the commit message CleverRaven#12:

Adding a welding store (CleverRaven#77279)

* First draft

* Add the store

* Make it spawn

* Final touches
# This is the commit message CleverRaven#13:

fix NPCs stealing player default name

# This is the commit message CleverRaven#14:

Update materials.json

# This is the commit message CleverRaven#15:

Update dreamer_procgen.json (CleverRaven#77179)


# This is the commit message CleverRaven#16:

Fix the Dream magick hobbies (CleverRaven#76912)


# This is the commit message CleverRaven#17:

cody shows her math skills (CleverRaven#77303)


# This is the commit message CleverRaven#18:

Set `last_item` after the end of picking up

Also remoced mention of zombie spawning in `"LESSON_GOT_WEAPON` snippet.

# This is the commit message CleverRaven#19:

Normalize body stats on start of the tutorial

# This is the commit message CleverRaven#20:

fix zoo scenario spawn (CleverRaven#77237)

* zoo ZONE_START_POINT

* Update start_locations.json

* Update scenarios.json

* fix DinoMod

* fix Xedra

* Fix Limb WIP mod

* Fix deadly bites mod

* Update scenarios.json
# This is the commit message CleverRaven#21:

Unify all run_eocs in a single eoc function (CleverRaven#77000)

* Unify all run_eocs in a single eoc function

* add test suite

* fix typo

* handle condition better

* Simplify code, move few big stuff into it's own functions

* fix incorrect return

* fix mistakes that prevent eoc from firing

* rename iteration to iterations

* reflect changes in documentation

* change iteration to iterations in json

* please clang
# This is the commit message CleverRaven#22:

fix recent regression of CleverRaven#77191

Fixes CleverRaven#77191

# This is the commit message CleverRaven#23:

remove migo_bio_tech from spawns (CleverRaven#76940)


# This is the commit message CleverRaven#24:

Introduced untyped coordinate operations to typed ones (CleverRaven#77098)

* Introduced untyped coordinate operations to typed ones

* Missed rotate usages

* demanded changes
# This is the commit message CleverRaven#25:

fix 5 round magazine having 20 rounds
# This is the commit message CleverRaven#26:

Fix edges

# This is the commit message CleverRaven#27:

Allow debug revealing any OM

# This is the commit message CleverRaven#28:

Swap the order of the bind labels to a guess at most used -> least used

# This is the commit message CleverRaven#29:

Add ability to place terrain/special without exiting placement

# This is the commit message CleverRaven#30:

Revert "Swap the order of the bind labels to a guess at most used -> least used"

This reverts commit 05cf094.

# This is the commit message CleverRaven#31:

Revert "Allow debug revealing any OM"

This reverts commit 5d1fc0a.

# This is the commit message CleverRaven#32:

"all" option for distraction manager (CleverRaven#77342)

* distraction manager option for toggling all

* Update src/distraction_manager.cpp

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
# This is the commit message CleverRaven#33:

Beaver audit (CleverRaven#77283)

* beavere big

* baby creature

* feaver

* dambreaker

* reproduction

* butchery

* monstergroups

* factions

* Update mammal.json

* Update monster_factions.json

* Update monster_factions.json
# This is the commit message CleverRaven#34:

Update electronic_parts.json

# This is the commit message CleverRaven#35:

Add a new widget to display weight with the format "##.#/##.#[unit]" (CleverRaven#77212)

* Add two new widgets to display weight with the format "##.#/##.# kg" and "##.#/##.# lb", and add the widgets to the legacy labels sidebar

* Apply suggestions from code review

I don't format goodly

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* Remove imperial version of the feature, and modify the metric version to read users mass setting and adjust the display accordingly

* Apply suggestions from code review

Formatting

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* Updated per IdleSol suggestion

* I think I forgot to pull before pushing and I don't understand git so I think it ate this space in the merge :(

* I'll get it right one day

* Update to use functions I didn't know existed, removing a few lines of code.

* Update src/display.cpp

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
# This is the commit message CleverRaven#36:

Add Vitamin C Supplements (CleverRaven#77363)

* Add VitC Supplement

* Create Drug Spawn Groups

* Add VitC to softdrugs itemgroup

* Full vitC bottle Added to Doctor shopkeep

* Add VitC to vitamin_shop itemgroup

* Add VitC to SUS bathroom vitamins

* I really fucked up that last copy paste, fixed?
# This is the commit message CleverRaven#37:

Fixed broken Android build due to missing FreeType library

# This is the commit message CleverRaven#38:

wrap long text in the menu for choosing the type of faction camp to create

# This is the commit message CleverRaven#39:

[ Aftershock ] Make Flesh Golem heart a mission item 


# This is the commit message CleverRaven#40:

Routine i18n updates on 26 October 2024

# This is the commit message CleverRaven#41:

Fix cotton patch being unusable to stop bleeding

# This is the commit message CleverRaven#42:

First Draft

Update en.credits

# This is the commit message CleverRaven#43:

Update data/credits/en.credits
# This is the commit message CleverRaven#44:

Update data/credits/en.credits

Co-authored-by: David Seguin <davidseguin@live.ca>
# This is the commit message CleverRaven#45:

Update data/credits/en.credits
# This is the commit message CleverRaven#46:

Update data/credits/en.credits

Co-authored-by: Binrui Dong <brett.browning.dong@gmail.com>
# This is the commit message CleverRaven#47:

Apply suggestions from code review

Co-authored-by: RenechCDDA <84619419+RenechCDDA@users.noreply.github.com>
# This is the commit message CleverRaven#48:

Update en.credits

Overhauled the Main Developers section.
Reordered special thanks alphabetically.
# This is the commit message CleverRaven#49:

Add links to tileset contributor lists.
# This is the commit message CleverRaven#50:

Removed heating elements drop from smashing the fume hood

# This is the commit message CleverRaven#51:

Add freetype, clean up 3rd-party CMake file

# This is the commit message CleverRaven#52:

[MoM/Magiclysm interaction] Synchronize anti-Stare powers, Thought Shield spell protects from telepathy (CleverRaven#77277)

* Create miscellaneous.json

* Create flags.json

* Acount for TEEPSHIELD

* Create eoc_misc.json

* Add MAGICAL_MIND_PROTECTION to thought shield

* Add mind protection to thought shields

* TEEPSHIELD effect

* Update data/mods/MindOverMatter/mod_interactions/magiclysm/item_overrides.json

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* Fixes

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
# This is the commit message CleverRaven#53:

Decrement spawn quantity when no monster is selected in sub group

# This is the commit message CleverRaven#54:

Set mon_found properly when select monster from subgroup

# This is the commit message CleverRaven#55:

Update src/mongroup.cpp

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
# This is the commit message CleverRaven#56:

Update ballistic_armor.json

# This is the commit message CleverRaven#57:

Factions don't mind the player smashing zombie corpses

# This is the commit message CleverRaven#58:

[Xedra Evolve] Add Ruach counter to sidebars (CleverRaven#77422)

* Update sidebar.json

* Create ruach_counter.json

* Initial commit

* Add to sidebars
# This is the commit message CleverRaven#59:

Forbid drinking liquids underwater for characters with `WATERSLEEP` and `UNDINE_SLEEP_WATER` mutations

# This is the commit message CleverRaven#60:

Characters with `UNDINE_SLEEP_WATER` mutation sleep less in water

# This is the commit message CleverRaven#61:

Fix recent clang-tidy errors.

# This is the commit message CleverRaven#62:

Set owner for new appliances (CleverRaven#77211)


# This is the commit message CleverRaven#63:

Lever action rifles (CleverRaven#77409)

* Add Rio Bravo

* Henry Golden Boy

* Add .44 R92

* Adds Uberti 1873

* Added sources

* 357 R92

* Minor fixes

* fix in ammo count for nested r92

* Spelling fixes

* Apply suggestions from code review

Co-authored-by: TheShadowFerret <99621099+TheShadowFerret@users.noreply.github.com>

* Apply suggestions from code review

Co-authored-by: Anton Burmistrov <Night_Pryanik@mail.ru>

---------

Co-authored-by: TheShadowFerret <99621099+TheShadowFerret@users.noreply.github.com>
Co-authored-by: Anton Burmistrov <Night_Pryanik@mail.ru>
# This is the commit message CleverRaven#64:

Add myself
# This is the commit message CleverRaven#65:

Initial commit (CleverRaven#77414)


# This is the commit message CleverRaven#66:

Minor gun fixes

# This is the commit message CleverRaven#67:

Update spells.json
# This is the commit message CleverRaven#68:

Feral Agent fix and loot update (CleverRaven#77421)

* Feral Agent fix and loot update

Co-Authored-By: gettingusedto <78019001+gettingusedto@users.noreply.github.com>

* Update data/mods/Xedra_Evolved/itemgroups/monster_drops.json

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

---------

Co-authored-by: gettingusedto <78019001+gettingusedto@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
# This is the commit message CleverRaven#69:

Apply copy-from to mod scenarios (CleverRaven#77417)

* Apply copy-from to mod scensarios

* apply to Limb_WIP

* Mind Over Matter

* Xedra

* Update scenarios.json

* document
# This is the commit message CleverRaven#70:

Mutations can have a custom activation message

# This is the commit message CleverRaven#71:

Changed implementation of battery chargers to make them work outside the reality bubble.

# This is the commit message CleverRaven#72:

Added last_charged to serialize and deserialize

# This is the commit message CleverRaven#73:

Prevent overflow

# This is the commit message CleverRaven#74:

Moved dischargeable check earlier to catch situations when dischargeable is 0 from the beginning

# This is the commit message CleverRaven#75:

[MoM] Move Mirror-mask bonus to effect, obsolete mutations (CleverRaven#72370)

* Obsolete old mutations

* Obsolete switcher EoC

* Move switcher EoC

* Move effect to enchantment

* Remove rather than obsolete mutations

* lint

* Fixes + documentation

* Linting
# This is the commit message CleverRaven#76:

Reworked check for flammability

# This is the commit message CleverRaven#77:

Changed text to mention a non-lit cig

# This is the commit message CleverRaven#78:

Refactoring armor ordering

# This is the commit message CleverRaven#79:

migo sideplates

# This is the commit message CleverRaven#80:

[Xedra Evolved] Require Traverse the Wilds to target a tree as the endpoint (CleverRaven#72655)

* Require teleporting to a tree

* Edit description

* Update data/mods/Xedra_Evolved/mutations/paraclesians/arvore_eocs.json

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* Update EoC for map_run_eocs

* Update spell

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
# This is the commit message CleverRaven#81:

[Xedra Evolved] More Lilin powers (CleverRaven#77269)

* Initial commit

* Add more powers

* Fix n_vitamin

* Add the Evil Eye

* Duration edits, increase ruach cost of Reap the Whirlwind

* Fix math

* Cry of the Night Bird reduces speed by percentage, not flat number

* Those who have the evil eye are immune to the evil eye

* Add Owl's Wisdom

* Update xe_lilin.json

* Add The Pestilence that Stalks in Darkness

* Add Stand Before the Cold

* Add more abilities

* Various updates

* Increase cost of Neither Sleep nor Slumber

* Add strix to dictionary

* Fix typos

* Fix ruach cost
# This is the commit message CleverRaven#82:

modify random NPC starting equipment based on time passed

-some very basic item groups for now, needs to be expanded on later
-add_profession_items(): replace raw inv with i_add()
-very minor edits to some professions

# This is the commit message CleverRaven#83:

[DinoMod] mountable and harnessable audit (CleverRaven#77391)

* [DinoMod] riding and harness audit

* juvenile fixes

* rem harnessable

* Remove harnessable

* juvenile fixes

* flag spellcheck
# This is the commit message CleverRaven#84:

Use corner symbols for vehicle Corner variations
# This is the commit message CleverRaven#85:

Removing and/or using some unused itemgroup IDs (CleverRaven#77356)

* ``accessory_ring``

* unused

* Update drugs.json

* I told you to remove them

* cinnamon groups

* yeast

* seasoning salt

* flour bags

* Update druid_tower.json
# This is the commit message CleverRaven#86:

Use parametrized carpets where appropriate (CleverRaven#77287)

* Add the carpet palette

* Nested basements

* Make the carpet not fallback

* Fix oopsie

* Fix oopsie

* Switch palette name to be clearer

* Carpets in nests

* First few buildings

* Most of the maps

* bungalow08

* Use correct palette name

* Last few touch-ups

* Remove old palette

* Use correct palette name
# This is the commit message CleverRaven#87:

Update urban_20_house.json

# This is the commit message CleverRaven#88:

Initial commit

# This is the commit message CleverRaven#89:

add terminal punctuation to bulletin board examination message

# This is the commit message CleverRaven#90:

Allowed throwing items while piloting mechs

# This is the commit message CleverRaven#91:

Fix CleverRaven#77179 and a Book in Magiclysm (CleverRaven#77408)

* Update dreamer_procgen.json

* Update recipe_books.json

* Update data/mods/Xedra_Evolved/procgen/dreamer_procgen.json

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
# This is the commit message CleverRaven#92:

eoc: clear deferred math on error

# This is the commit message CleverRaven#93:

fix scenario spawns (CleverRaven#77451)

* fix scenario spawns

* road mayhem start

* wild party

* update sloc hospital entry

* revert road sloc terrain

* simplify road terrain

* Try TYPE for crash sloc
# This is the commit message CleverRaven#94:

Add recommended palettes

# This is the commit message CleverRaven#95:

Stop 20x Melatonin Spawns (CleverRaven#77347)

* Fix Up Melatonin

* Woops, too much deleted
# This is the commit message CleverRaven#96:

Refugee center cleanups (CleverRaven#77331)

* dino dave

* door position

* lobby cleanup
# This is the commit message CleverRaven#97:

Remove Calcium from Rare Drugs (CleverRaven#77349)


# This is the commit message CleverRaven#98:

eoc: clean up run_eocs

# This is the commit message CleverRaven#99:

eoc/run_eocs: don't allow queue+loop in one invocation

# This is the commit message CleverRaven#100:

eoc/run_eocs: add test for talker mixes

# This is the commit message CleverRaven#101:

Allow any grade of steel ofr the metal axe head

# This is the commit message CleverRaven#102:

Switch relationship to enum class

# This is the commit message CleverRaven#103:

Faction relationships can be modiifed through dialogue

# This is the commit message CleverRaven#104:

Asking for a bed gives you permission to sleep there

# This is the commit message CleverRaven#105:

Update lumbermill map+dialogue
-Outer fence is no longer permalocked with no way in
-You can ask for a gate to be opened.

# This is the commit message CleverRaven#106:

Appease clang, the one true overlord

# This is the commit message CleverRaven#107:

Fix food calcs for items with non-food components

# This is the commit message CleverRaven#108:

Flush debug log writes immediately
# This is the commit message CleverRaven#109:

fix two supressors in m4_cqbr
# This is the commit message CleverRaven#110:

magus.json description change

This is my first contribution/change. I apologize if it isn't formatted or done correctly.

I noticed that magus_slow had the same description as magus_haste.

Slow should indicate that it slows the target's speed.

# This is the commit message CleverRaven#111:

less loopy conversation loops

# This is the commit message CleverRaven#112:

found another

# This is the commit message CleverRaven#113:

math: improve diag_value constructors

# This is the commit message CleverRaven#114:

math: add monostate to diag_value

# This is the commit message CleverRaven#115:

math: add kwarg_or helper function

# This is the commit message CleverRaven#116:

Repeat survey missions without leaving interface

# This is the commit message CleverRaven#117:

Made game recognize burst fire mode as well as full auto when pressing 'Burst fire wielded weapon'

# This is the commit message CleverRaven#118:

simple knife spear quest options (CleverRaven#77335)

* options

and random word choice

* just spears then
# This is the commit message CleverRaven#119:

Rejecting some area threats near safe locations

# This is the commit message CleverRaven#120:

Globally unique -> prio 1 and SAFE_AT_WORLDGEN

# This is the commit message CleverRaven#121:

Use global coordinates in global calls...

# This is the commit message CleverRaven#122:

Removed remaining development variable

# This is the commit message CleverRaven#123:

fix: -Werror=range-loop-construct (CleverRaven#77302)


# This is the commit message CleverRaven#124:

some mistake fixing
# This is the commit message CleverRaven#125:

:pray:
# This is the commit message CleverRaven#126:

idk
# This is the commit message CleverRaven#127:

heh
# This is the commit message CleverRaven#128:

cmon do something
# This is the commit message CleverRaven#129:

astyle

# This is the commit message CleverRaven#130:

try to deal with undefined type
# This is the commit message CleverRaven#131:

i'm desperate
# This is the commit message CleverRaven#132:

resorting
# This is the commit message CleverRaven#133:

idk what's happening
# This is the commit message CleverRaven#134:

dunno
# This is the commit message CleverRaven#135:

stupid resorting
# This is the commit message CleverRaven#136:

Update input_context.h
# This is the commit message CleverRaven#137:

attempt to workaround 'inaccessible member'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
<Enhancement / Feature> New features, or enhancements on existing
Projects
None yet
Development

No branches or pull requests

4 participants