xref: /original-bsd/games/phantasia/convert.c (revision 3b6250d9)
1 /*
2  *	Convert Phantasia 3.3.1 and 3.3.1+ characs file format to 3.3.2
3  *
4  */
5 
6 #include "include.h"
7 #include "oldplayer.h"
8 
9 struct oldplayer	Oldplayer;		/* old format structure */
10 struct player	Newplayer;			/* new format structure */
11 
12 char	Oldpfile[] = DEST/characs";		/* old format file */
13 char	Newpfile[] = DEST/newcharacs";		/* new format file */
14 
15 /************************************************************************
16 /
17 / FUNCTION NAME: main()
18 /
19 / FUNCTION: convert old Phantasia player file to new format
20 /
21 / AUTHOR: C. Robertson, 9/1/85  E. A. Estes, 3/12/86
22 /
23 / ARGUMENTS: none
24 /
25 / RETURN VALUE: none
26 /
27 / MODULES CALLED: time(), exit(), fread(), fopen(), srandom(), floor(),
28 /	random(), strcmp(), fwrite(), strcpy(), fclose(), fprintf()
29 /
30 / GLOBAL INPUTS: _iob[], Oldplayer, Newplayer
31 /
32 / GLOBAL OUTPUTS: Oldplayer, Newplayer
33 /
34 / DESCRIPTION:
35 /	Read in old player structures and write out to new file in
36 /	new format.
37 /	Old player file is unmodified.
38 /	New file is "DEST/newcharacs".
39 /	#define PHANTPLUS to convert from 3.3.1+.
40 /
41 /************************************************************************/
42 
43 main()
44 {
45 FILE	*oldcharac, *newcharac;		/* to open old and new files */
46 
47     if ((oldcharac = fopen(Oldpfile, "r")) == NULL)
48 	{
49 	fprintf(stderr, "Cannot open original character file!\n");
50 	exit(1);
51 	}
52 
53     if ((newcharac = fopen(Newpfile, "w")) == NULL)
54 	{
55 	fprintf(stderr, "Cannot create new character file!\n");
56 	exit(1);
57 	}
58 
59     srandom((unsigned) time((long *) NULL));	/* prime random numbers */
60 
61     while (fread((char *) &Oldplayer, sizeof(struct oldplayer), 1, oldcharac) == 1)
62 	/* read and convert old structures into new */
63 	{
64 	Newplayer.p_experience = Oldplayer.o_experience;
65 	Newplayer.p_level = (double) Oldplayer.o_level;
66 	Newplayer.p_strength =  Oldplayer.o_strength;
67 	Newplayer.p_sword =  Oldplayer.o_sword;
68 	Newplayer.p_might =  0.0;		/* game will calculate */
69 	Newplayer.p_energy =  Oldplayer.o_energy;
70 	Newplayer.p_maxenergy =  Oldplayer.o_maxenergy;
71 	Newplayer.p_shield =  Oldplayer.o_shield;
72 	Newplayer.p_quickness = (double) Oldplayer.o_quickness;
73 	Newplayer.p_quksilver = (double) Oldplayer.o_quksilver;
74 	Newplayer.p_speed = 0.0;		/* game will calculate */
75 	Newplayer.p_magiclvl = Oldplayer.o_magiclvl;
76 	Newplayer.p_mana = Oldplayer.o_mana;
77 	Newplayer.p_brains = Oldplayer.o_brains;
78 	Newplayer.p_poison = Oldplayer.o_poison;
79 	Newplayer.p_gold = Oldplayer.o_gold;
80 	Newplayer.p_gems = Oldplayer.o_gems;
81 	Newplayer.p_sin = Oldplayer.o_sin;
82 	Newplayer.p_x = Oldplayer.o_x;
83 	Newplayer.p_y = Oldplayer.o_y;
84 	Newplayer.p_1scratch = Oldplayer.o_1scratch;
85 	Newplayer.p_2scratch = Oldplayer.o_2scratch;
86 
87 	Newplayer.p_ring.ring_type = Oldplayer.o_ring.ring_type;
88 	Newplayer.p_ring.ring_duration = Oldplayer.o_ring.ring_duration;
89 	Newplayer.p_ring.ring_inuse = FALSE;
90 
91 	Newplayer.p_age = (long) Oldplayer.o_degenerated * N_AGE;
92 
93 	Newplayer.p_degenerated = Oldplayer.o_degenerated + 1;
94 
95 	/* convert character type into character type and special type */
96 
97 	if (Oldplayer.o_type < 0)
98 	    /* player with crown */
99 	    Oldplayer.o_type = -Oldplayer.o_type;
100 
101 	if (Oldplayer.o_type == 99)
102 	    /* valar */
103 	    {
104 	    Newplayer.p_specialtype = SC_VALAR;
105 	    Newplayer.p_type = (short) ROLL(C_MAGIC, C_EXPER - C_MAGIC + 1);
106 	    Newplayer.p_lives = Oldplayer.o_ring.ring_duration;
107 	    }
108 	else if (Oldplayer.o_type == 90)
109 	    /* ex-valar */
110 	    {
111 	    Newplayer.p_specialtype = SC_EXVALAR;
112 	    Newplayer.p_type = (short) ROLL(C_MAGIC, C_EXPER - C_MAGIC + 1);
113 	    Newplayer.p_lives = 0;
114 	    }
115 	else if (Oldplayer.o_type > 20)
116 	    /* council of wise */
117 	    {
118 	    Newplayer.p_specialtype = SC_COUNCIL;
119 	    Newplayer.p_type = Oldplayer.o_type - 20;
120 	    Newplayer.p_lives = Oldplayer.o_ring.ring_duration;
121 	    }
122 	else if (Oldplayer.o_type > 10)
123 	    /* king */
124 	    {
125 	    Newplayer.p_specialtype = SC_KING;
126 	    Newplayer.p_type = Oldplayer.o_type - 10;
127 	    Newplayer.p_lives = 0;
128 	    }
129 	else
130 	    /* normal player */
131 	    {
132 	    Newplayer.p_specialtype = SC_NONE;
133 	    Newplayer.p_type = Oldplayer.o_type;
134 	    Newplayer.p_lives = 0;
135 	    }
136 
137 	Newplayer.p_lives = 0;
138 	Newplayer.p_crowns = Oldplayer.o_crowns;
139 	Newplayer.p_charms = Oldplayer.o_charms;
140 	Newplayer.p_amulets = Oldplayer.o_amulets;
141 	Newplayer.p_holywater = Oldplayer.o_holywater;
142 	Newplayer.p_lastused = Oldplayer.o_lastused;
143 
144 	/* convert status and name into status */
145 
146 	Newplayer.p_status = Oldplayer.o_status + S_OFF;
147 	if (strcmp(Oldplayer.m_name, "<null>") == 0)
148 	    /* unused recored */
149 	    Newplayer.p_status = S_NOTUSED;
150 	if (Oldplayer.o_quickness < 0)
151 	    /* hung up player */
152 	    {
153 	    Newplayer.p_quickness = (double) Oldplayer.o_tampered;
154 	    Oldplayer.o_tampered = T_OFF;
155 	    Newplayer.p_status = S_HUNGUP;
156 	    }
157 
158 	Newplayer.p_tampered = Oldplayer.o_tampered + T_OFF;
159 	Newplayer.p_istat = I_OFF;
160 
161 	Newplayer.p_palantir = Oldplayer.o_palantir;
162 	Newplayer.p_blessing = Oldplayer.o_blessing;
163 	Newplayer.p_virgin = Oldplayer.o_virgin;
164 	Newplayer.p_blindness = Oldplayer.o_blindness;
165 
166 	strcpy(Newplayer.p_name, Oldplayer.o_name);
167 	strcpy(Newplayer.p_password, Oldplayer.o_password);
168 	strcpy(Newplayer.p_login, Oldplayer.o_login);
169 
170 	/* write new structure */
171 	fwrite((char *) &Newplayer, sizeof(Newplayer), 1, newcharac);
172 	}
173 
174     fclose(oldcharac);		/* close files */
175     fclose(newcharac);
176 
177     exit(0);
178 }
179 /**/
180 /************************************************************************
181 /
182 / FUNCTION NAME: drandom()
183 /
184 / FUNCTION: return a random number between 0.0 < 1.0
185 /
186 / AUTHOR: E. A. Estes, 2/7/86
187 /
188 / ARGUMENTS: none
189 /
190 / RETURN VALUE: random number
191 /
192 / MODULES CALLED: random()
193 /
194 / GLOBAL INPUTS: none
195 /
196 / GLOBAL OUTPUTS: none
197 /
198 / DESCRIPTION:
199 /	Return a random number.
200 /
201 /************************************************************************/
202 
203 double
204 drandom()
205 {
206     if (sizeof(int) != 2)
207 	return((double) (random() & 0x7fff) / 32768.0);
208     else
209 	return((double) random() / 32768.0);
210 }
211