1 /*
2  * Seven Kingdoms: Ancient Adversaries
3  *
4  * Copyright 1997,1998 Enlight Software Ltd.
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  *
19  */
20 
21 #ifdef DEBUG
22 #include <OSYS.h>
23 #include <OMISC.h>
24 #include <OMOUSE.h>
25 #include <OMOUSE2.h>
26 #include <stdio.h>
27 
28 #define	MAX_SEED_TABLE_SIZE	10 * 4000
29 static long	random_seed_backup_table[MAX_SEED_TABLE_SIZE];
30 static int	random_seed_writen_pos;
31 static int	random_seed_backup_pos;
32 static int	random_seed_backup_table_data_size;
33 static char file_opened_flag = 0;
34 static long	match_seed;
35 
36 
37 //-------- Begin of function Sys::sp_create_seed_file --------//
sp_create_seed_file(char * filename)38 void Sys::sp_create_seed_file(char *filename)
39 {
40 	seedCompareFile.file_create(filename);
41 	//debug_seed_status_flag = 2; // 1 for saving, 2 for comparing
42 	//random_seed_backup_pos = 0;
43 	random_seed_writen_pos = 0;
44 
45 	file_opened_flag = 1;
46 }
47 //--------- End of function Sys::sp_create_seed_file ---------//
48 
49 
50 //-------- Begin of function Sys::sp_close_seed_file --------//
sp_close_seed_file()51 void Sys::sp_close_seed_file()
52 {
53 	seedCompareFile.file_close();
54 	//debug_seed_status_flag = NO_DEBUG_SYN;
55 	//random_seed_backup_pos = 0;
56 
57 	file_opened_flag = 0;
58 	sp_seed_pos_reset();
59 }
60 //--------- End of function Sys::sp_close_seed_file ---------//
61 
62 
63 //-------- Begin of function Sys::sp_load_seed_file --------//
sp_load_seed_file()64 void Sys::sp_load_seed_file()
65 {
66 	//debug_seed_status_flag = NO_DEBUG_SYN;
67 
68 	File headerFile;
69 	headerFile.file_open("nhead.rs");
70 
71 	long firstSeed;
72 	if(headerFile.file_size() >= sizeof(long)*2)
73 	{
74 		firstSeed = headerFile.file_get_long();
75 		if(match_seed) // internal loading
76 		{
77 			// do nothing
78 			int debug = 0;
79 		}
80 		else // load from user action
81 		{
82 			if(misc.get_random_seed() != firstSeed)
83 				return; // seed file don't match the save game
84 		}
85 	}
86 	else
87 		return; // seed file don't match the save game
88 
89 	if(!seedCompareFile.file_open("nseed.rs"))
90 		return;
91 
92 	random_seed_backup_pos = 0;
93 	//debug_seed_status_flag = DEBUG_SYN_AUTO_LOAD;
94 
95 	random_seed_backup_table_data_size = headerFile.file_get_long(); // read the table size
96 	headerFile.file_close();
97 
98 	//------------ read the table content ------------//
99 	for(int i=0; i<random_seed_backup_table_data_size; i++)
100 		random_seed_backup_table[i] = seedCompareFile.file_get_long();
101 
102 	file_opened_flag = 1;
103 }
104 //--------- End of function Sys::sp_load_seed_file ---------//
105 
106 
107 //-------- Begin of function Sys::sp_record_match_seed --------//
sp_record_match_seed()108 void Sys::sp_record_match_seed()
109 {
110 	match_seed = misc.get_random_seed();
111 }
112 //--------- End of function Sys::sp_record_match_seed ---------//
113 
114 
115 //-------- Begin of function Sys::sp_record_seed --------//
sp_record_seed()116 void Sys::sp_record_seed()
117 {
118 	random_seed_backup_table[random_seed_backup_pos] = misc.get_random_seed();
119 	random_seed_backup_pos++;
120 }
121 //--------- End of function Sys::sp_record_seed ---------//
122 
123 
124 //-------- Begin of function Sys::sp_write_seed --------//
sp_write_seed()125 void Sys::sp_write_seed()
126 {
127 	if(random_seed_backup_pos==0)
128 		return;
129 
130 	if(file_opened_flag==0)
131 		return;
132 
133 	/*
134 	seedCompareFile.file_put_long(match_seed);
135 	seedCompareFile.file_put_long(random_seed_backup_pos);
136 
137 	for(int i=0; i<random_seed_backup_pos; i++)
138 		seedCompareFile.file_put_long(random_seed_backup_table[i]);
139 	*/
140 
141 	File headerFile;
142 	headerFile.file_create("nhead.rs");
143 	headerFile.file_put_long(match_seed);
144 	headerFile.file_put_long(random_seed_writen_pos + random_seed_backup_pos);
145 	headerFile.file_close();
146 
147 	if(random_seed_writen_pos==0)
148 	{
149 		for(int i=0; i<random_seed_backup_pos; i++)
150 			seedCompareFile.file_put_long(random_seed_backup_table[i]);
151 	}
152 	else
153 	{
154 		seedCompareFile.file_seek(0L, SEEK_END);
155 		for(int i=0; i<random_seed_backup_pos; i++)
156 			seedCompareFile.file_put_long(random_seed_backup_table[i]);
157 	}
158 
159 	random_seed_writen_pos += random_seed_backup_pos;
160 	random_seed_backup_pos = 0;
161 }
162 //--------- End of function Sys::sp_write_seed ---------//
163 
164 
165 //-------- Begin of function Sys::sp_compare_seed --------//
sp_compare_seed()166 void Sys::sp_compare_seed()
167 {
168 	if(file_opened_flag==0)
169 		return;
170 
171 	long	gameSeed, saveSeed;
172 
173 	gameSeed = misc.get_random_seed();
174 	saveSeed = random_seed_backup_table[random_seed_backup_pos];
175 
176 	if(random_seed_backup_pos>130)
177 		int debug = 0;
178 
179 	if( gameSeed != saveSeed )
180 		err.run( "Error: random seeds not sync." );
181 
182 	random_seed_backup_pos++;
183 
184 	if(random_seed_backup_pos>=random_seed_backup_table_data_size)
185 	{
186 		sp_close_seed_file();
187 		//debug_seed_status_flag = 0;
188 		if(debug_seed_status_flag==DEBUG_SYN_AUTO_LOAD)
189 			//debug_seed_status_flag = DENUG_SYN_AUTO_SAVE;
190 			// DIK_LBRACKET = 0x1A
191 			mouse.add_key_event(0x1A, misc.get_time()); // save seed for comparison
192 		else
193 			debug_seed_status_flag = NO_DEBUG_SYN;
194 	}
195 }
196 //--------- End of function Sys::sp_compare_seed ---------//
197 
198 
199 //-------- Begin of function Sys::sp_seed_pos_reset --------//
sp_seed_pos_reset()200 void Sys::sp_seed_pos_reset()
201 {
202 	random_seed_backup_pos = 0;
203 }
204 //--------- End of function Sys::sp_seed_pos_reset ---------//
205 
206 
207 //-------- Begin of function Sys::sp_seed_pos_set --------//
sp_seed_pos_set(int pos)208 void Sys::sp_seed_pos_set(int pos)
209 {
210 	random_seed_backup_pos = pos;
211 }
212 //--------- End of function Sys::sp_seed_pos_set ---------//
213 #endif
214