From a87376314c6019d4d22bc471425d64f36ea4de46 Mon Sep 17 00:00:00 2001
From: martinxyz <>
Date: Sat, 9 Aug 2003 19:08:39 +0000
Subject: [PATCH] reverting save/load simplifications

---
 doc/ChangeLog.html          |   1 -
 src/game/loadgame.cpp       |  57 +--------
 src/game/savegame.cpp       |   6 +
 src/include/depend.h        |   2 +
 src/include/icons.h         |   1 +
 src/include/missile.h       |   2 +
 src/include/tileset.h       |   1 +
 src/include/unit.h          |   2 +
 src/map/tileset.cpp         | 227 ++++++++++++++++++++++++++++++++++++
 src/stratagus/construct.cpp |  18 +++
 src/stratagus/missile.cpp   |  69 +++++++++++
 src/stratagus/player.cpp    |  18 +++
 src/ui/icons.cpp            |  52 +++++++++
 src/ui/ui.cpp               | 207 ++++++++++++++++++++++++++++++++
 src/unit/depend.cpp         |  63 ++++++++++
 src/unit/unit.cpp           |   4 -
 src/unit/unit_draw.cpp      |  63 ++++++++++
 src/unit/unittype.cpp       |   3 -
 src/unit/upgrade.cpp        |  15 ++-
 src/video/cursor.cpp        |   6 -
 src/video/graphic.cpp       |   4 +
 21 files changed, 753 insertions(+), 68 deletions(-)

diff --git a/doc/ChangeLog.html b/doc/ChangeLog.html
index 17e1fa2ed..012598a66 100644
--- a/doc/ChangeLog.html
+++ b/doc/ChangeLog.html
@@ -38,7 +38,6 @@
     <li>++
     <li>A lot of progress in resource configurability (from Crestez Dan Leonard).
     <li>Minimap panel can have its own palette now (from Martin Renold).
-    <li>Simplified save/load, fewer things are now saved (from Martin Renold).
     <li>NEW_UI: Dropped of displaying the current unit action with the buttons (from Martin Renold).
     <li>NEW_UI: Dropped Alt-Buttons support (did anybody use this?) (from Martin Renold).
     <li>NEW_UI: Button actions are now custom scheme scripts (from Martin Renold).
diff --git a/src/game/loadgame.cpp b/src/game/loadgame.cpp
index 369e0504e..2c2d82adc 100644
--- a/src/game/loadgame.cpp
+++ b/src/game/loadgame.cpp
@@ -121,7 +121,7 @@ global void CleanModules(void)
 /**
 **	Initialize all modules.
 **
-**	Call each module to initialize (for LoadGame).
+**	Call each module to initialize.
 */
 global void InitModules(void)
 {
@@ -217,57 +217,8 @@ global void LoadGame(char* filename)
     int old_siod_verbose_level;
     unsigned long game_cycle;
 
-    // protect from hooks
-    
-    //LoadCcl();                      // Reload the main config file
-    { // maxy: added instead of CleanModules(); untested
-	// FIXME: those things should be somehow either in InitModules
-	// or be cleaned implicitely when things get overriden from
-	// the savegame
+    CleanModules();
 
-	EndReplayLog();
-	CleanMessages();
-
-	DestroyCursorBackground();
-	CursorBuilding=0;
-	GameCursor=0;
-	UnitUnderCursor=NoUnitP;
-	CleanAi();
-	{ //CleanPlayers(); //?
-	    int p;
-	    
-	    for( p=0; p<PlayerMax; ++p ) {
-		if( Players[p].Name ) {
-		    free(Players[p].Name);
-		}
-		if( Players[p].Units ) {
-		    free(Players[p].Units);
-		}
-	    }
-	    ThisPlayer=NULL;
-	    memset(Players,0,sizeof(Players));
-	    NumPlayers=0;
-	    // ? NoRescueCheck=0;
-	}
-
-	CleanUnits();
-	CleanSelections();
-	CleanGroups();
-	// CleanUpgrades() ?
-	// CleanDependencies() ?
-	// should not be necessary: CleanButtons()
-	CleanMissiles();
-	CleanMap();
-	CleanReplayLog();
-#ifdef HIERARCHIC_PATHFINDER
-	PfHierClean ();
-#endif
-	if (AStarOn) {
-	    FreeAStar();
-	}
-    }
-
-    // collect garbage, then eval the savegame
     old_siod_verbose_level=siod_verbose_level;
     siod_verbose_level=4;
     user_gc(SCM_BOOL_F);
@@ -285,8 +236,8 @@ global void LoadGame(char* filename)
     GameCycle=game_cycle;
     //GameCursor=TheUI.Point.Cursor;	// FIXME: just a default.
     GameCursor=CursorTypeByIdent("cursor-point");	// TheUI not cleaned
-    SelectionChanged();
-    MustRedraw=RedrawEverything;
+    UpdateButtonPanel();
+    MustRedraw=RedrawEverything;	// redraw everything
 }
 
 /**
diff --git a/src/game/savegame.cpp b/src/game/savegame.cpp
index b763ef8ee..a97b59fe2 100644
--- a/src/game/savegame.cpp
+++ b/src/game/savegame.cpp
@@ -127,11 +127,17 @@ global void SaveGame(const char* filename)
     fprintf(file,"(set-game-cycle! %lu)\n",GameCycle);
 
     SaveCcl(file);
+    SaveIcons(file);
+    SaveCursors(file);
     SaveUserInterface(file);
+    SaveTilesets(file);
     SaveConstructions(file);
+    SaveDecorations(file);
     SaveUnitTypes(file);
     SaveUpgrades(file);
+    SaveDependencies(file);
     SaveButtons(file);
+    SaveMissileTypes(file);
     SavePlayers(file);
     SaveMap(file);
     SaveUnits(file);
diff --git a/src/include/depend.h b/src/include/depend.h
index 8453c40e8..916e05096 100644
--- a/src/include/depend.h
+++ b/src/include/depend.h
@@ -137,6 +137,8 @@ extern void DependenciesCclRegister(void);
 extern void InitDependencies(void);
     /// Load the dependencies
 extern void LoadDependencies(FILE* file);
+    /// Save the dependencies
+extern void SaveDependencies(FILE* file);
     /// Cleanup dependencies module
 extern void CleanDependencies();
 
diff --git a/src/include/icons.h b/src/include/icons.h
index 75b37a5fa..7301c4c41 100644
--- a/src/include/icons.h
+++ b/src/include/icons.h
@@ -219,6 +219,7 @@ extern void DrawIcon(const Player*,Icon*,int,int);
     /// Draw icon of an unit
 extern void DrawUnitIcon(const Player*,Icon*,unsigned,int,int);
 
+extern void SaveIcons(FILE*);		/// Save icons
 extern void IconCclRegister(void);	/// Register CCL features
 
 //@}
diff --git a/src/include/missile.h b/src/include/missile.h
index 133454d5c..833c242f5 100644
--- a/src/include/missile.h
+++ b/src/include/missile.h
@@ -529,6 +529,8 @@ extern void MissileActions(void);
     /// distance from view point to missile
 extern int ViewPointDistanceToMissile(const Missile*);
 
+    /// Save missile-types
+extern void SaveMissileTypes(FILE*);
     /// Save missiles
 extern void SaveMissiles(FILE*);
 
diff --git a/src/include/tileset.h b/src/include/tileset.h
index 3915fa80e..e74601eab 100644
--- a/src/include/tileset.h
+++ b/src/include/tileset.h
@@ -334,6 +334,7 @@ extern Tileset** Tilesets;		/// Tileset information
 ----------------------------------------------------------------------------*/
 
 extern void LoadTileset(void);		/// Load tileset definition
+extern void SaveTilesets(FILE*);	/// Save the tileset configuration
 extern void CleanTilesets(void);	/// Cleanup the tileset module
 
 extern void TilesetCclRegister(void);	/// Register CCL features for tileset
diff --git a/src/include/unit.h b/src/include/unit.h
index 661c2cd76..176e35de5 100644
--- a/src/include/unit.h
+++ b/src/include/unit.h
@@ -942,6 +942,8 @@ extern void DrawSelectionCorners(const Unit* unit,const UnitType* type
 extern void DecorationCclRegister(void);
     /// Load the decorations (health,mana) of units
 extern void LoadDecorations(void);
+    /// Save the decorations (health,mana) of units
+extern void SaveDecorations(FILE* file);
     /// Clean the decorations (health,mana) of units
 extern void CleanDecorations(void);
 
diff --git a/src/map/tileset.cpp b/src/map/tileset.cpp
index 6a2786ba1..08a94b1e6 100644
--- a/src/map/tileset.cpp
+++ b/src/map/tileset.cpp
@@ -518,6 +518,233 @@ global void LoadTileset(void)
     }
 };
 
+/**
+**	Save flag part of tileset.
+**
+**	@param file	File handle for the saved flags.
+**	@param flags	Bit field of the flags.
+*/
+local void SaveTilesetFlags(FILE* file, unsigned flags)
+{
+    if (flags & MapFieldWaterAllowed) {
+	fprintf(file, " 'water");
+    }
+    if (flags & MapFieldLandAllowed) {
+	fprintf(file, " 'land");
+    }
+    if (flags & MapFieldCoastAllowed) {
+	fprintf(file, " 'coast");
+    }
+    if (flags & MapFieldNoBuilding) {
+	fprintf(file, " 'no-building");
+    }
+    if (flags & MapFieldUnpassable) {
+	fprintf(file, " 'unpassable");
+    }
+    if (flags & MapFieldWall) {
+	fprintf(file, " 'wall");
+    }
+    if (flags & MapFieldRocks) {
+	fprintf(file, " 'rock");
+    }
+    if (flags & MapFieldForest) {
+	fprintf(file, " 'forest");
+    }
+    if (flags & MapFieldLandUnit) {
+	fprintf(file, " 'land-unit");
+    }
+    if (flags & MapFieldAirUnit) {
+	fprintf(file, " 'air-unit");
+    }
+    if (flags & MapFieldSeaUnit) {
+	fprintf(file, " 'sea-unit");
+    }
+    if (flags & MapFieldBuilding) {
+	fprintf(file, " 'building");
+    }
+    if (flags & MapFieldHuman) {
+	fprintf(file, " 'human");
+    }
+}
+
+/**
+**	Save solid part of tileset.
+**
+**	@param file	File handle to save the solid part.
+**	@param table	Tile numbers.
+**	@param name	Ascii name of solid tile
+**	@param flags	Tile attributes.
+**	@param start	Start index into table.
+*/
+local void SaveTilesetSolid(FILE* file, const unsigned short* table,
+    const char* name, unsigned flags, int start)
+{
+    int i;
+    int j;
+    int n;
+
+    fprintf(file, "  'solid (list \"%s\"", name);
+    SaveTilesetFlags(file, flags);
+    // Remove empty tiles at end of block
+    for (n = 15; n >= 0 && !table[start + n]; n--) {
+    }
+    i = fprintf(file, "\n    #(");
+    for (j = 0; j <= n; ++j) {
+	i += fprintf(file, " %3d", table[start + j]);
+    }
+    i += fprintf(file, "))");
+
+    while ((i += 8) < 80) {
+	fprintf(file, "\t");
+    }
+    fprintf(file, "; %03X\n", start);
+}
+
+/**
+**	Save mixed part of tileset.
+**
+**	@param file	File handle to save the mixed part.
+**	@param table	Tile numbers.
+**	@param name1	First ascii name of mixed tiles.
+**	@param name2	Second Ascii name of mixed tiles.
+**	@param flags	Tile attributes.
+**	@param start	Start index into table.
+**	@param end	End of tiles.
+*/
+local void SaveTilesetMixed(FILE* file, const unsigned short* table,
+    const char* name1, const char* name2, unsigned flags, int start, int end)
+{
+    int x;
+    int i;
+    int j;
+    int n;
+
+    fprintf(file, "  'mixed (list \"%s\" \"%s\"", name1, name2);
+    SaveTilesetFlags(file, flags);
+    fprintf(file,"\n");
+    for (x = 0; x < 0x100; x += 0x10) {
+	if (start + x >= end) {		// Check end must be 0x10 aligned
+	    break;
+	}
+	fprintf(file, "    #(");
+	// Remove empty slots at end of table
+	for (n = 15; n >= 0 && !table[start + x + n]; n--) {
+	}
+	i = 6;
+	for (j = 0; j <= n; ++j) {
+	    i += fprintf(file, " %3d", table[start + x + j]);
+	}
+	if (x == 0xF0 ) {
+	    i += fprintf(file, "))");
+	} else {
+	    i += fprintf(file, ")");
+	}
+
+	while ((i += 8) < 80) {
+	    fprintf(file, "\t");
+	}
+	fprintf(file, "; %03X\n", start + x);
+    }
+}
+
+/**
+**	Save the tileset.
+**
+**	@param file	Output file.
+**	@param tileset	Save the content of this tileset.
+*/
+local void SaveTileset(FILE* file, const Tileset* tileset)
+{
+    const unsigned short* table;
+    int i;
+    int n;
+
+    fprintf(file, "\n(define-tileset\n  '%s 'class '%s", tileset->Ident,
+	tileset->Class);
+    fprintf(file, "\n  'name \"%s\"", tileset->Name);
+    fprintf(file, "\n  'image \"%s\"", tileset->ImageFile);
+    fprintf(file, "\n  'palette \"%s\"", tileset->PaletteFile);
+    fprintf(file, "\n  ;; Slots descriptions");
+    fprintf(file,
+	"\n  'slots (list\n  'special (list\t\t;; Can't be in pud\n");
+    fprintf(file, "    'extra-trees #( %d %d %d %d %d %d )\n",
+	tileset->ExtraTrees[0], tileset->ExtraTrees[1]
+	, tileset->ExtraTrees[2], tileset->ExtraTrees[3]
+	, tileset->ExtraTrees[4], tileset->ExtraTrees[5]);
+    fprintf(file, "    'top-one-tree %d 'mid-one-tree %d 'bot-one-tree %d\n",
+	tileset->TopOneTree, tileset->MidOneTree, tileset->BotOneTree);
+    fprintf(file, "    'removed-tree %d\n", tileset->RemovedTree);
+    fprintf(file, "    'growing-tree #( %d %d )\n", tileset->GrowingTree[0],
+	tileset->GrowingTree[1]);
+    fprintf(file, "    'extra-rocks #( %d %d %d %d %d %d )\n",
+	tileset->ExtraRocks[0], tileset->ExtraRocks[1]
+	, tileset->ExtraRocks[2], tileset->ExtraRocks[3]
+	, tileset->ExtraRocks[4], tileset->ExtraRocks[5]);
+    fprintf(file, "    'top-one-rock %d 'mid-one-rock %d 'bot-one-rock %d\n",
+	tileset->TopOneRock, tileset->MidOneRock, tileset->BotOneRock);
+    fprintf(file, "    'removed-rock %d )\n", tileset->RemovedRock);
+
+    table = tileset->Table;
+    n = tileset->NumTiles;
+
+    for (i = 0; i < n;) {
+	//
+	//      Mixeds
+	//
+	if (tileset->BasicNameTable[i] && tileset->MixedNameTable[i]) {
+	    SaveTilesetMixed(file, table,
+		tileset->TileNames[tileset->BasicNameTable[i]],
+		tileset->TileNames[tileset->MixedNameTable[i]],
+		tileset->FlagsTable[i], i, n);
+	    i += 256;
+	    //
+	    //      Solids
+	    //
+	} else {
+	    SaveTilesetSolid(file, table,
+		tileset->TileNames[tileset->BasicNameTable[i]],
+		tileset->FlagsTable[i], i);
+	    i += 16;
+	}
+    }
+    fprintf(file, "  )\n");
+    fprintf(file, "  ;; Animated tiles\n");
+    fprintf(file, "  'animations (list #( ) )\n");
+    fprintf(file, "  'objects (list #( ) ))\n");
+}
+
+/**
+**	Save the current tileset module.
+**
+**	@param file	Output file.
+*/
+global void SaveTilesets(FILE* file)
+{
+    int i;
+    char** sp;
+
+    fprintf(file, "\n;;; -----------------------------------------\n");
+    fprintf(file,
+	";;; MODULE: tileset $Id$\n\n");
+
+    //  Original number to internal tileset name
+
+    i = fprintf(file, "(define-tileset-wc-names");
+    for (sp = TilesetWcNames; *sp; ++sp) {
+	if (i + strlen(*sp) > 79) {
+	    i = fprintf(file, "\n ");
+	}
+	i += fprintf(file, " '%s", *sp);
+    }
+    fprintf(file, ")\n");
+
+    // 	Save all loaded tilesets
+
+    for (i = 0; i < NumTilesets; ++i) {
+	SaveTileset(file, Tilesets[i]);
+    }
+}
+
 /**
 **	Cleanup the tileset module.
 **
diff --git a/src/stratagus/construct.cpp b/src/stratagus/construct.cpp
index b32d3fbf5..dda796314 100644
--- a/src/stratagus/construct.cpp
+++ b/src/stratagus/construct.cpp
@@ -141,6 +141,8 @@ global void LoadConstructions(void)
 global void SaveConstructions(FILE* file)
 {
     int j;
+    int i;
+    char** cp;
     Construction** cop;
     ConstructionFrame* cframe;
 
@@ -149,6 +151,22 @@ global void SaveConstructions(FILE* file)
 
     // FIXME: needed?
     
+    //
+    //	Dump table wc2 construction numbers -> internal symbol.
+    //
+    if( (cp=ConstructionWcNames) ) {
+	fprintf(file,"(define-construction-wc-names");
+
+	i=90;
+	while( *cp ) {
+	    if( i+strlen(*cp)>79 ) {
+		i=fprintf(file,"\n ");
+	    }
+	    i+=fprintf(file," '%s",*cp++);
+	}
+	fprintf(file,")\n\n");
+    }
+
     //
     //	Dump table of all constructions
     //
diff --git a/src/stratagus/missile.cpp b/src/stratagus/missile.cpp
index c2794bc4f..c8e66210d 100644
--- a/src/stratagus/missile.cpp
+++ b/src/stratagus/missile.cpp
@@ -1510,6 +1510,75 @@ global int ViewPointDistanceToMissile(const Missile* missile)
     return ViewPointDistance(x,y);
 }
 
+/**
+**	Save the missile-types to file.
+**
+**	@param file	Output file.
+**
+**	@todo FIXME: CanHitOwner and FriendlyFire not supported!
+*/
+global void SaveMissileTypes(FILE* file)
+{
+    MissileType* mtype;
+    char** sp;
+    int i;
+
+    fprintf(file,"\n;;; -----------------------------------------\n");
+    fprintf(file,";;; MODULE: missile-types $Id$\n\n");
+
+    //
+    //	Original number to internal missile-type name.
+    //
+    i=fprintf(file,"(define-missiletype-wc-names");
+    for( sp=MissileTypeWcNames; *sp; ++sp ) {
+	if( i+strlen(*sp)>79 ) {
+	    i=fprintf(file,"\n ");
+	}
+	i+=fprintf(file," '%s",*sp);
+    }
+    fprintf(file,")\n\n");
+
+    //
+    //	Missile types
+    //
+    for( mtype=MissileTypes; mtype<&MissileTypes[NumMissileTypes]; ++mtype ) {
+	fprintf(file,"(define-missile-type '%s\n ",mtype->Ident);
+	if( mtype->File ) {
+	    fprintf(file," 'file \"%s\"",mtype->File);
+	}
+	fprintf(file," 'size '(%d %d)",mtype->Width,mtype->Height);
+	if( mtype->Sprite ) {
+	    fprintf(file," 'frames %d",mtype->SpriteFrames);
+	}
+	fprintf(file,"\n  'num-directions %d",mtype->NumDirections);
+	fprintf(file,"\n ");
+	if( mtype->FiredSound.Name ) {
+	    fprintf(file," 'fired-sound \"%s\"",mtype->FiredSound.Name);
+	}
+	if( mtype->ImpactSound.Name ) {
+	    fprintf(file," 'impact-sound \"%s\"",mtype->ImpactSound.Name);
+	}
+	if( mtype->FiredSound.Name || mtype->ImpactSound.Name ) {
+	    fprintf(file,"\n ");
+	}
+	fprintf(file," 'class '%s",MissileClassNames[mtype->Class]);
+	fprintf(file," 'draw-level %d ",mtype->DrawLevel);
+	if( mtype->StartDelay ) {
+	    fprintf(file," 'delay %d",mtype->StartDelay);
+	}
+	fprintf(file," 'sleep %d",mtype->Sleep);
+	fprintf(file," 'speed %d",mtype->Speed);
+	fprintf(file," 'range %d",mtype->Range);
+	if( mtype->ImpactMissile ) {
+	    fprintf(file,"\n  'impact-missile '%s",mtype->ImpactMissile->Ident);
+	}
+	fprintf(file,"\n ");
+	fprintf(file," 'can-hit-owner #%c",mtype->CanHitOwner ? 't' : 'f');
+	fprintf(file," 'friendly-fire #%c",mtype->FriendlyFire ? 't' : 'f');
+	fprintf(file,")\n");
+    }
+}
+
 /**
 **	Save the state of a missile to file.
 */
diff --git a/src/stratagus/player.cpp b/src/stratagus/player.cpp
index 227ed782b..69d20d4b3 100644
--- a/src/stratagus/player.cpp
+++ b/src/stratagus/player.cpp
@@ -211,6 +211,24 @@ global void SavePlayers(FILE* file)
     }
 #endif
 
+    //
+    //	Dump table wc2 race numbers -> internal symbol.
+    //
+    if( PlayerRaces.Count ) {
+	fprintf(file,"(define-race-names");
+	for( i=0; i<PlayerRaces.Count; ++i ) {
+	    fprintf(file,"\n  'race '(");
+	    fprintf(file,"\n    race %d",PlayerRaces.Race[i]);
+	    fprintf(file,"\n    name %s",PlayerRaces.Name[i]);
+	    fprintf(file,"\n    display %s",PlayerRaces.Display[i]);
+	    if( PlayerRaces.Visible[i] ) {
+		fprintf(file,"\n    visible");
+	    }
+	    fprintf(file,")");
+	}
+	fprintf(file,")\n\n");
+    }
+
     //
     //	Dump all players
     //
diff --git a/src/ui/icons.cpp b/src/ui/icons.cpp
index feef0a27f..1d34577fc 100644
--- a/src/ui/icons.cpp
+++ b/src/ui/icons.cpp
@@ -418,6 +418,58 @@ global void DrawUnitIcon(const Player* player, Icon* icon, unsigned flags,
     }
 }
 
+/**
+**	Save state of the icons to file.
+**
+**	@param file	Output file.
+*/
+global void SaveIcons(FILE* file)
+{
+    char* const* cp;
+    int i;
+
+    fprintf(file, "\n;;; -----------------------------------------\n");
+    fprintf(file, ";;; MODULE: icons $Id$\n\n");
+
+    //
+    //  Mapping the original icon numbers in puds to our internal strings
+    //
+    if ((cp = IconWcNames)) {
+	fprintf(file, "(define-icon-wc-names");
+
+	i = 90;
+	while (*cp) {
+	    if (i + strlen(*cp) > 79) {
+		i = fprintf(file, "\n ");
+	    }
+	    i += fprintf(file, " '%s", *cp++);
+	}
+	fprintf(file, ")\n\n");
+    }
+
+    //
+    //  Icons
+    //
+    for (i = 0; i < NumIcons; ++i) {
+	fprintf(file, "(define-icon '%s", Icons[i]->Ident);
+	if (Icons[i]->Tileset) {
+	    fprintf(file, " 'tileset '%s", Icons[i]->Tileset);
+	}
+	fprintf(file, "\n  'size '(%d %d) 'normal '(%d \"%s\"))\n",
+	    Icons[i]->Width, Icons[i]->Height,
+	    Icons[i]->Index, Icons[i]->File->FileName);
+    }
+    fprintf(file, "\n");
+
+    //
+    //  Icons aliases
+    //
+    for (i = 0; i < NumIconAliases; ++i) {
+	fprintf(file, "(define-icon-alias '%s '%s)\n",
+	    IconAliases[i * 2 + 0], IconAliases[i * 2 + 1]);
+    }
+}
+
 /**
 **	@brief Parse icon definition.
 **
diff --git a/src/ui/ui.cpp b/src/ui/ui.cpp
index a9721832c..7537d7649 100644
--- a/src/ui/ui.cpp
+++ b/src/ui/ui.cpp
@@ -294,6 +294,188 @@ global void LoadUserInterface(void)
     }
 }
 
+/**
+**	Save the UI structure.
+**
+**	@param file	Save file handle
+**	@param ui	User interface to save
+*/
+local void SaveUi(FILE* file,const UI* ui)
+{
+    int i;
+    MenuPanel* menupanel;
+
+    fprintf(file,"(define-ui '%s %d %d\t; Selector",
+	    ui->Name,ui->Width,ui->Height);
+
+    fprintf(file,"\n  'normal-font-color '%s"
+                 "\n  'reverse-font-color '%s",
+	    ui->NormalFontColor, ui->ReverseFontColor);
+    fprintf(file,"\n");
+
+    fprintf(file,"\n  'filler (list");
+    fprintf(file,"\n    'file \"%s\"",ui->Filler[0].File);
+    fprintf(file,"\n    'pos '(%3d %3d)",ui->FillerX[0],ui->FillerY[0]);
+    fprintf(file,")\n");
+
+    fprintf(file,"\n  ; Resource line");
+    fprintf(file,"\n  'resource-line (list \"%s\" %d %d)",
+	    ui->Resource.File,ui->ResourceX,ui->ResourceY);
+
+    fprintf(file,"\n  'resources (list");
+    for( i=1; i<MaxCosts+2; ++i ) {
+	if( !ui->Resources[i].Icon.File ) {
+	    continue;
+	}
+	fprintf(file,"\n    '%s",
+		i<MaxCosts ? DefaultResourceNames[i] :
+		    i==FoodCost ? "food" : "score");
+	fprintf(file," (list 'file \"%s\" 'row %d\n"
+	             "      'pos '(%d %d) 'size '(%d %d) 'text-pos '(%d %d))",
+		ui->Resources[i].Icon.File,ui->Resources[i].IconRow,
+		ui->Resources[i].IconX,ui->Resources[i].IconY,
+		ui->Resources[i].IconW,ui->Resources[i].IconH,
+		ui->Resources[i].TextX,ui->Resources[i].TextY);
+    }
+    fprintf(file,")\n");
+
+    fprintf(file,"  'info-panel (list \"%s\" %d %d %d %d)\n",
+	    ui->InfoPanel.File,
+	    ui->InfoPanelX,ui->InfoPanelY,
+	    ui->InfoPanelW,ui->InfoPanelH);
+
+    fprintf(file,"\n  'completed-bar '(");
+    fprintf(file,"\n    color %d",ui->CompleteBarColor);
+    fprintf(file,"\n    pos (%3d %3d)",ui->CompleteBarX,ui->CompleteBarY);
+    fprintf(file,"\n    size (%d %d)",ui->CompleteBarW,ui->CompleteBarH);
+    fprintf(file,"\n    text \"%s\"",ui->CompleteBarText);
+    fprintf(file,"\n    font %s",FontNames[ui->CompleteBarFont]);
+    fprintf(file,"\n    text-pos (%3d %3d)",
+	    ui->CompleteTextX,ui->CompleteTextY);
+    fprintf(file,")\n\n");
+
+    fprintf(file,"  'button-panel (list \"%s\" %d %d)\n",
+	    ui->ButtonPanel.File,ui->ButtonPanelX,ui->ButtonPanelY);
+
+    fprintf(file,"\n  'map-area (list");
+    fprintf(file,"\n    'pos '(%3d %3d)",
+	    ui->MapArea.X, ui->MapArea.Y);
+    fprintf(file,"\n    'size '(%d %d)",
+	    ui->MapArea.EndX-ui->MapArea.X+1,
+	    ui->MapArea.EndY-ui->MapArea.Y+1);
+    fprintf(file,")\n\n");
+
+    fprintf(file,"  ; Menu button background\n");
+    fprintf(file,"  'menu-panel (list \"%s\" %d %d)\n",
+	    ui->MenuButtonGraphic.File,ui->MenuButtonGraphicX,
+	    ui->MenuButtonGraphicY);
+
+    fprintf(file,"  ; Minimap background\n");
+    fprintf(file,"  'minimap-panel (list \"%s\" %d %d)\n",
+	    ui->MinimapPanel.File,ui->MinimapPanelX,ui->MinimapPanelY);
+    fprintf(file,"  ; Minimap position\n");
+    fprintf(file,"  'minimap-pos (list %d %d)\n",
+	    ui->MinimapPosX,ui->MinimapPosY);
+
+    fprintf(file,"\n  'status-line '(");
+    fprintf(file,"\n    file \"%s\"",ui->StatusLine.File);
+    fprintf(file,"\n    pos (%d %d)",ui->StatusLineX,ui->StatusLineY);
+    fprintf(file,"\n    text-pos (%d %d)",
+	    ui->StatusLineTextX,ui->StatusLineTextY);
+    fprintf(file,"\n    font %s",FontNames[ui->StatusLineFont]);
+    fprintf(file,")\n");
+
+    fprintf(file,"\n  'menu-button '(");
+    fprintf(file,"\n    pos (%d %d)",
+	    ui->MenuButton.X,ui->MenuButton.Y);
+    fprintf(file,"\n    size (%d %d)",
+	    ui->MenuButton.Width,ui->MenuButton.Height);
+    fprintf(file,"\n    caption \"%s\"",
+	    ui->MenuButton.Text);
+    fprintf(file,"\n    style %s",
+	    MenuButtonStyle(ui->MenuButton.Button));
+    fprintf(file,")");
+
+    fprintf(file,"\n  'network-menu-button '(");
+    fprintf(file,"\n    pos (%d %d)",
+	    ui->NetworkMenuButton.X,ui->NetworkMenuButton.Y);
+    fprintf(file,"\n    size (%d %d)",
+	    ui->NetworkMenuButton.Width,ui->NetworkMenuButton.Height);
+    fprintf(file,"\n    caption \"%s\"",
+	    ui->NetworkMenuButton.Text);
+    fprintf(file,"\n    style %s",
+	    MenuButtonStyle(ui->NetworkMenuButton.Button));
+    fprintf(file,")");
+
+    fprintf(file,"\n  'network-diplomacy-button '(");
+    fprintf(file,"\n    pos (%d %d)",
+	    ui->NetworkDiplomacyButton.X,ui->NetworkDiplomacyButton.Y);
+    fprintf(file,"\n    size (%d %d)",
+	    ui->NetworkDiplomacyButton.Width,ui->NetworkDiplomacyButton.Height);
+    fprintf(file,"\n    caption \"%s\"",
+	    ui->NetworkDiplomacyButton.Text);
+    fprintf(file,"\n    style %s",
+	    MenuButtonStyle(ui->NetworkDiplomacyButton.Button));
+    fprintf(file,")");
+
+    fprintf(file,"\n\n  'info-buttons '(");
+    for( i=0; i<ui->NumInfoButtons; ++i ) {
+	fprintf(file,"\n    (pos (%3d %3d) size (%d %d))",
+		ui->InfoButtons[i].X,ui->InfoButtons[i].Y,
+		ui->InfoButtons[i].Width,ui->InfoButtons[i].Height);
+    }
+    fprintf(file,")");
+    fprintf(file,"\n  'training-buttons '(");
+    for( i=0; i<ui->NumTrainingButtons; ++i ) {
+	fprintf(file,"\n    (pos (%3d %3d) size (%d %d))",
+		ui->TrainingButtons[i].X,ui->TrainingButtons[i].Y,
+		ui->TrainingButtons[i].Width,ui->TrainingButtons[i].Height);
+    }
+    fprintf(file,")");
+    fprintf(file,"\n  'button-buttons '(");
+    for( i=0; i<ui->NumButtonButtons; ++i ) {
+	fprintf(file,"\n    (pos (%3d %3d) size (%d %d))",
+		ui->ButtonButtons[i].X,ui->ButtonButtons[i].Y,
+		ui->ButtonButtons[i].Width,ui->ButtonButtons[i].Height);
+    }
+    fprintf(file,")");
+
+    fprintf(file,"\n\n  'cursors '(");
+    fprintf(file,"\n    point %s", ui->Point.Name);
+    fprintf(file,"\n    glass %s", ui->Glass.Name);
+    fprintf(file,"\n    cross %s", ui->Cross.Name);
+    fprintf(file,"\n    yellow %s", ui->YellowHair.Name);
+    fprintf(file,"\n    green %s", ui->GreenHair.Name);
+    fprintf(file,"\n    red %s", ui->RedHair.Name);
+    fprintf(file,"\n    scroll %s", ui->Scroll.Name);
+
+    fprintf(file,"\n    arrow-e %s", ui->ArrowE.Name);
+    fprintf(file,"\n    arrow-ne %s", ui->ArrowNE.Name);
+    fprintf(file,"\n    arrow-n %s", ui->ArrowN.Name);
+    fprintf(file,"\n    arrow-nw %s", ui->ArrowNW.Name);
+    fprintf(file,"\n    arrow-w %s", ui->ArrowW.Name);
+    fprintf(file,"\n    arrow-sw %s", ui->ArrowSW.Name);
+    fprintf(file,"\n    arrow-s %s", ui->ArrowS.Name);
+    fprintf(file,"\n    arrow-se %s", ui->ArrowSE.Name);
+    fprintf(file,")\n");
+
+    fprintf(file,"\n  'menu-panels '(");
+    menupanel=ui->MenuPanels;
+    while( menupanel ) {
+	fprintf(file,"\n    %s \"%s\"",
+		menupanel->Ident,menupanel->Panel.File);
+	menupanel=menupanel->Next;
+    }
+    fprintf(file,")\n");
+
+    fprintf(file,"\n  'victory-background \"%s\"",
+	    ui->VictoryBackground.File);
+    fprintf(file,"\n  'defeat-background \"%s\"",
+	    ui->DefeatBackground.File);
+
+    fprintf(file," )\n\n");
+}
+
 /**
 **	Save the viewports.
 **
@@ -320,9 +502,34 @@ local void SaveViewports(FILE* file,const UI* ui)
 */
 global void SaveUserInterface(FILE* file)
 {
+    int i;
+
     fprintf(file,"\n;;; -----------------------------------------\n");
     fprintf(file,";;; MODULE: ui $Id$\n\n");
 
+    // Contrast, Brightness, Saturation
+    fprintf(file,"(set-contrast! %d)\n",TheUI.Contrast);
+    fprintf(file,"(set-brightness! %d)\n",TheUI.Brightness);
+    fprintf(file,"(set-saturation! %d)\n\n",TheUI.Saturation);
+    // Scrolling
+    fprintf(file,"(set-mouse-scroll! %s)\n",TheUI.MouseScroll ? "#t" : "#f");
+    fprintf(file,"(set-mouse-scroll-speed! %d)\n",SpeedMouseScroll);
+    fprintf(file,"(set-key-scroll! %s)\n",TheUI.KeyScroll ? "#t" : "#f");
+    fprintf(file,"(set-key-scroll-speed! %d)\n",SpeedKeyScroll);
+    fprintf(file,"(set-reverse-map-move! %s)\n\n",
+	    TheUI.ReverseMouseMove ? "#t" : "#f");
+
+    fprintf(file,"(set-mouse-adjust! %d)\n",TheUI.MouseAdjust);
+    fprintf(file,"(set-mouse-scale! %d)\n\n",TheUI.MouseScale);
+
+    fprintf(file,"(set-original-resources! %s)\n\n",
+	    TheUI.OriginalResources ? "#t" : "#f");
+
+    // Save the UIs for all resolutions
+    for( i=0; UI_Table[i]; ++i ) {
+	SaveUi(file,UI_Table[i]);
+    }
+
     SaveViewports(file,&TheUI);
 }
 
diff --git a/src/unit/depend.cpp b/src/unit/depend.cpp
index ea5eac23f..4d265a3ad 100644
--- a/src/unit/depend.cpp
+++ b/src/unit/depend.cpp
@@ -271,6 +271,69 @@ try_or:
 */
 global void InitDependencies(void){}
 
+/**
+**	Save state of the dependencies to file.
+**
+**	@param file	Output file.
+*/
+global void SaveDependencies(FILE* file)
+{
+    unsigned u;
+    const DependRule* node;
+    const DependRule* rule;
+    const DependRule* temp;
+
+    fprintf(file,"\n;;; -----------------------------------------\n");
+    fprintf(file,";;; MODULE: dependencies $Id$\n\n");
+
+    // Save all dependencies
+
+    for( u=0; u<sizeof(DependHash)/sizeof(*DependHash); ++u ) {
+	node=DependHash[u];
+	while( node ) {			// all hash links
+	    fprintf(file,"(define-dependency '");
+	    switch( node->Type ) {
+		case DependRuleUnitType:
+		    fprintf(file,"%s",node->Kind.UnitType->Ident);
+		    break;
+		case DependRuleUpgrade:
+		    fprintf(file,"%s",node->Kind.Upgrade->Ident);
+		    break;
+	    }
+	    // All or cases
+
+	    fprintf(file,"\n  '(");
+	    rule=node->Rule;
+	    for( ;; ) {
+		temp=rule;
+		while( temp ) {
+		    switch( temp->Type ) {
+		    case DependRuleUnitType:
+			fprintf(file,"%s",temp->Kind.UnitType->Ident);
+			break;
+		    case DependRuleUpgrade:
+			fprintf(file,"%s",temp->Kind.Upgrade->Ident);
+			break;
+		    }
+		    temp=temp->Rule;
+		    if( temp ) {
+			fprintf(file," ");
+		    }
+		}
+		fprintf(file,")");
+		if( !(rule=rule->Next) ) {
+		    break;
+		}
+		fprintf(file,"\n  'or '( ");
+	    }
+
+	    fprintf(file,")\n");
+
+	    node=node->Next;
+	}
+    }
+}
+
 /**
 **	Clean up unit and upgrade dependencies.
 */
diff --git a/src/unit/unit.cpp b/src/unit/unit.cpp
index 68d935a5b..a35ca5a2b 100644
--- a/src/unit/unit.cpp
+++ b/src/unit/unit.cpp
@@ -4276,9 +4276,6 @@ global void SaveUnits(FILE* file)
     //
     //	Local variables
     //
-
-    // FIXME: is this map specifig or global for the game?
-    //        if it is global, don't save it
     fprintf(file,"(set-hitpoint-regeneration! #%s)\n",
 	    HitPointRegeneration ? "t" : "f");
     fprintf(file,"(set-xp-damage! #%s)\n",
@@ -4339,7 +4336,6 @@ global void SaveUnits(FILE* file)
  */
 global void InitUnits(void)
 {
-    // probably call CleanUnits() here?
 }
 
 /**
diff --git a/src/unit/unit_draw.cpp b/src/unit/unit_draw.cpp
index eadf29107..ec28e74d9 100644
--- a/src/unit/unit_draw.cpp
+++ b/src/unit/unit_draw.cpp
@@ -643,6 +643,69 @@ global void LoadDecorations(void)
     }
 }
 
+/**
+**	Save decorations.
+*/
+global void SaveDecorations(FILE* file)
+{
+    fprintf(file,"\n;;; -----------------------------------------\n");
+    fprintf(file,";;; MODULE: decorations $Id$\n\n");
+
+    fprintf(file,"(mana-sprite \"%s\"  %d %d  %d %d)\n",
+	ManaSprite.File,ManaSprite.HotX,ManaSprite.HotY,
+	ManaSprite.Width,ManaSprite.Height);
+    fprintf(file,"(health-sprite \"%s\"  %d %d  %d %d)\n",
+	HealthSprite.File,HealthSprite.HotX,HealthSprite.HotY,
+	HealthSprite.Width,HealthSprite.Height);
+    fprintf(file,"(shadow-sprite \"%s\"  %d %d  %d %d)\n",
+	ShadowSprite.File,ShadowSprite.HotX,ShadowSprite.HotY,
+	ShadowSprite.Width,ShadowSprite.Height);
+    fprintf(file,"(spell-sprite \"%s\"  %d %d  %d %d)\n",
+	SpellSprite.File,SpellSprite.HotX,SpellSprite.HotY,
+	SpellSprite.Width,SpellSprite.Height);
+
+    // This belongs to the config and not save file
+    if( ShowHealthBar ) {
+	fprintf(file,";(show-health-bar)\n");
+    }
+    if( ShowHealthDot ) {
+	fprintf(file,";(show-health-dot)\n");
+    }
+    if( ShowHealthHorizontal ) {
+	fprintf(file,";(show-health-horizontal)\n");
+    } else {
+	fprintf(file,";(show-health-vertical)\n");
+    }
+    if( ShowHealthBackgroundLong ) {
+	fprintf(file,";(show-health-blackground-long)\n");
+    }
+    if( ShowManaBar ) {
+	fprintf(file,";(show-mana-bar)\n");
+    }
+    if( ShowManaDot ) {
+	fprintf(file,";(show-mana-dot)\n");
+    }
+    if( ShowManaHorizontal ) {
+	fprintf(file,";(show-mana-horizontal)\n");
+    } else {
+	fprintf(file,";(show-mana-vertical)\n");
+    }
+    if( ShowManaBackgroundLong ) {
+	fprintf(file,";(show-mana-blackground-long)\n");
+    }
+    if( ShowEnergySelectedOnly ) {
+	fprintf(file,";(show-energy-selected-only)\n");
+    }
+    if( ShowNoFull ) {
+	fprintf(file,";(show-no-full)\n");
+    } else {
+	fprintf(file,";(show-full)\n");
+    }
+    if( DecorationOnTop ) {
+	fprintf(file,";(decoration-on-top)\n");
+    }
+}
+
 /**
 **	Clean decorations.
 */
diff --git a/src/unit/unittype.cpp b/src/unit/unittype.cpp
index 007ddbbec..16e9de461 100644
--- a/src/unit/unittype.cpp
+++ b/src/unit/unittype.cpp
@@ -588,7 +588,6 @@ local void SaveAnimation(const char* name,const Animation* anim,FILE* file)
 }
 
 /**
-<<<<<<< unittype.c
 **	Save state of the animitions set to file.
 **
 **	We save only the first occurance of an animation.
@@ -980,8 +979,6 @@ local void SaveUnitType(FILE* file,const UnitType* type,int all)
 }
 
 /**
-=======
->>>>>>> 1.80
 **	Save state of an unit-stats to file.
 **
 **	@param stats	Unit-stats to save.
diff --git a/src/unit/upgrade.cpp b/src/unit/upgrade.cpp
index aabdc02a3..b785b2213 100644
--- a/src/unit/upgrade.cpp
+++ b/src/unit/upgrade.cpp
@@ -568,7 +568,20 @@ global void SaveUpgrades(FILE* file)
     fprintf(file,"\n");
     */
 
-    // FIXME: can at least partially be removed
+    //
+    //	Save all upgrades
+    //
+    for( i=0; i<NumUpgrades; ++i ) {
+	fprintf(file,"(define-upgrade '%s 'icon '%s\n"
+		,Upgrades[i].Ident,Upgrades[i].Icon.Name);
+	fprintf(file,"  'costs #(");
+	for( j=0; j<MaxCosts; ++j ) {
+	    fprintf(file," %5d",Upgrades[i].Costs[j]);
+	}
+
+	fprintf(file,"))\n");
+    }
+    fprintf(file,"\n");
 
     //
     //	Save all upgrade modifiers.
diff --git a/src/video/cursor.cpp b/src/video/cursor.cpp
index 2ac755c50..990faa261 100644
--- a/src/video/cursor.cpp
+++ b/src/video/cursor.cpp
@@ -74,11 +74,7 @@ global CursorType* Cursors;
 
 global CursorStates CursorState;/// current cursor state (point,...)
 global int CursorAction;	/// action for selection
-#ifndef NEW_UI
 global int CursorValue;		/// value for CursorAction (spell type f.e.)
-#else
-global int CursorSpell;		/// spell type while selecting target
-#endif
 
 	//Event changed mouse position, can alter at any moment
 global int CursorX;		/// cursor position on screen X
@@ -1107,7 +1103,6 @@ global void InitVideoCursors(void)
 /**
 **	Save cursor state.
 */
-/* should not be necessary
 global void SaveCursors(FILE* file)
 {
     int i;
@@ -1147,7 +1142,6 @@ global void SaveCursors(FILE* file)
     fprintf(file,";;(unit-under-cursor %s\n",
 	    UnitUnderCursor ? UnitReference(UnitUnderCursor) : "()");
 }
-*/
 
 /**
 **	Cleanup cursor module
diff --git a/src/video/graphic.cpp b/src/video/graphic.cpp
index 625bb969b..a791e0bae 100644
--- a/src/video/graphic.cpp
+++ b/src/video/graphic.cpp
@@ -717,8 +717,12 @@ global Graphic* LoadGraphic(const char *name)
     char buf[1024];
 
     if (!(graphic = LoadGraphicPNG(LibraryFileName(name, buf)))) {
+	/*
 	fprintf(stderr, "Can't load the graphic `%s'\n", name);
 	ExitFatal(-1);
+	*/
+	name = NULL; // force crash
+	fprintf(stderr, "Can't load the graphic `%s'\n", name);
     }
 
     graphic->Pixels = VideoCreateSharedPalette(graphic->Palette);