From bdaaa70fa262532a1ff0965dbd4ead4b12652f14 Mon Sep 17 00:00:00 2001
From: jsalmon3 <>
Date: Wed, 26 Jun 2002 00:54:38 +0000
Subject: [PATCH] Implemented task #55513: Don't load the complete campaign
 configuration

---
 doc/ChangeLog.html    |  5 +++--
 src/game/campaign.cpp | 26 +++++++++++++++++++++-----
 2 files changed, 24 insertions(+), 7 deletions(-)

diff --git a/doc/ChangeLog.html b/doc/ChangeLog.html
index 888a4b4b8..f1f6f54dd 100644
--- a/doc/ChangeLog.html
+++ b/doc/ChangeLog.html
@@ -878,9 +878,10 @@
     <LI>Fixed multiplayer fog of war (from Jimmy Salmon).
     <LI>Added free for all, top vs bottom, and left vs right game types (from
 	Jimmy Salmon).
-    <LI>Added if-resource trigger (from Jimmy Salmon).
     <LI>Fixed bug #573331: Peasants don't chop wood (from Jimmy Salmon).
-    <LI>Added if-kills and if-score triggers (from Jimmy Salmon).
+    <LI>Added if-resource, if-kills, and if-score triggers (from Jimmy Salmon).
+    <LI>Implemented task #55513: Don't load the complete campaign configuration
+	(from Jimmy Salmon).
     </UL>
 </UL>
 
diff --git a/src/game/campaign.cpp b/src/game/campaign.cpp
index 093563c54..0cec91b4e 100644
--- a/src/game/campaign.cpp
+++ b/src/game/campaign.cpp
@@ -38,6 +38,7 @@
 #include "map.h"
 #include "campaign.h"
 #include "settings.h"
+#include "iolib.h"
 
 /*----------------------------------------------------------------------------
 --	Declarations
@@ -149,6 +150,12 @@ global void PlayCampaign(const char* name)
 	return;
     }
 
+    if (!CurrentCampaign->Chapters) {
+	char buf[1024];
+	filename=LibraryFileName(CurrentCampaign->File,buf);
+	vload(filename, 0, 1);
+    }
+
     GameIntro.Objectives[0]=strdup(DefaultObjective);
 
     CurrentChapter = CurrentCampaign->Chapters;
@@ -190,13 +197,22 @@ local SCM CclDefineCampaign(SCM list)
     if( Campaigns ) {
 	for( i=0; i<NumCampaigns; ++i ) {
 	    if( !strcmp(Campaigns[i].Ident, ident) ) {
-		free(ident);
-		return SCM_UNSPECIFIED;
+		if( Campaigns[i].Chapters ) {
+		    free(ident);
+		    return SCM_UNSPECIFIED;
+		}
+		campaign=Campaigns+i;
+		free(campaign->Ident);
+		free(campaign->Name);
+		free(campaign->File);
+		break;
 	    }
 	}
-	Campaigns=realloc(Campaigns,sizeof(Campaign)*(NumCampaigns+1));
-	campaign=Campaigns+NumCampaigns;
-	NumCampaigns++;
+	if( i==NumCampaigns ) {
+	    Campaigns=realloc(Campaigns,sizeof(Campaign)*(NumCampaigns+1));
+	    campaign=Campaigns+NumCampaigns;
+	    NumCampaigns++;
+	}
     } else {
 	campaign=Campaigns=malloc(sizeof(Campaign));
 	NumCampaigns++;