1 //Copyright Paul Reiche, Fred Ford. 1992-2002
2
3 /*
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17 */
18
19 /*
20 * This file seems to be a collection of functions that don't do
21 * much.
22 */
23
24 #include "dummy.h"
25
26 #include "coderes.h"
27 #include "globdata.h"
28 #include "races.h"
29
30 #include "libs/compiler.h"
31 #include "libs/log.h"
32 #include "libs/memlib.h"
33
34 #include <stdlib.h>
35 #include <ctype.h>
36
37
38 typedef struct
39 {
40 RACE_DESC data _ALIGNED_ANY;
41 } CODERES_STRUCT;
42
43 typedef enum
44 {
45 ANDROSYN_CODE_RES,
46 ARILOU_CODE_RES,
47 BLACKURQ_CODE_RES,
48 CHENJESU_CODE_RES,
49 CHMMR_CODE_RES,
50 DRUUGE_CODE_RES,
51 HUMAN_CODE_RES,
52 ILWRATH_CODE_RES,
53 MELNORME_CODE_RES,
54 MMRNMHRM_CODE_RES,
55 MYCON_CODE_RES,
56 ORZ_CODE_RES,
57 PKUNK_CODE_RES,
58 SHOFIXTI_CODE_RES,
59 SLYLANDR_CODE_RES,
60 SPATHI_CODE_RES,
61 SUPOX_CODE_RES,
62 SYREEN_CODE_RES,
63 THRADD_CODE_RES,
64 UMGAH_CODE_RES,
65 URQUAN_CODE_RES,
66 UTWIG_CODE_RES,
67 VUX_CODE_RES,
68 YEHAT_CODE_RES,
69 ZOQFOT_CODE_RES,
70
71 SAMATRA_CODE_RES,
72 SIS_CODE_RES,
73 PROBE_CODE_RES
74 } ShipCodeRes;
75
76 typedef RACE_DESC *(*RaceDescInitFunc)(void);
77
78 static RaceDescInitFunc
CodeResToInitFunc(ShipCodeRes res)79 CodeResToInitFunc(ShipCodeRes res)
80 {
81 switch (res)
82 {
83 case ANDROSYN_CODE_RES: return &init_androsynth;
84 case ARILOU_CODE_RES: return &init_arilou;
85 case BLACKURQ_CODE_RES: return &init_black_urquan;
86 case CHENJESU_CODE_RES: return &init_chenjesu;
87 case CHMMR_CODE_RES: return &init_chmmr;
88 case DRUUGE_CODE_RES: return &init_druuge;
89 case HUMAN_CODE_RES: return &init_human;
90 case ILWRATH_CODE_RES: return &init_ilwrath;
91 case MELNORME_CODE_RES: return &init_melnorme;
92 case MMRNMHRM_CODE_RES: return &init_mmrnmhrm;
93 case MYCON_CODE_RES: return &init_mycon;
94 case ORZ_CODE_RES: return &init_orz;
95 case PKUNK_CODE_RES: return &init_pkunk;
96 case SHOFIXTI_CODE_RES: return &init_shofixti;
97 case SLYLANDR_CODE_RES: return &init_slylandro;
98 case SPATHI_CODE_RES: return &init_spathi;
99 case SUPOX_CODE_RES: return &init_supox;
100 case SYREEN_CODE_RES: return &init_syreen;
101 case THRADD_CODE_RES: return &init_thraddash;
102 case UMGAH_CODE_RES: return &init_umgah;
103 case URQUAN_CODE_RES: return &init_urquan;
104 case UTWIG_CODE_RES: return &init_utwig;
105 case VUX_CODE_RES: return &init_vux;
106 case YEHAT_CODE_RES: return &init_yehat;
107 case ZOQFOT_CODE_RES: return &init_zoqfotpik;
108 case SAMATRA_CODE_RES: return &init_samatra;
109 case SIS_CODE_RES: return &init_sis;
110 case PROBE_CODE_RES: return &init_probe;
111 default:
112 {
113 log_add (log_Warning, "Unknown SHIP identifier '%d'", res);
114 return NULL;
115 }
116 }
117 }
118
119 static void
GetCodeResData(const char * ship_id,RESOURCE_DATA * resdata)120 GetCodeResData (const char *ship_id, RESOURCE_DATA *resdata)
121 {
122 BYTE which_res;
123 void *hData;
124
125 which_res = atoi (ship_id);
126 hData = HMalloc (sizeof (CODERES_STRUCT));
127 if (hData)
128 {
129 RaceDescInitFunc initFunc = CodeResToInitFunc (which_res);
130 RACE_DESC *RDPtr = (initFunc == NULL) ? NULL : (*initFunc)();
131 if (RDPtr == 0)
132 {
133 HFree (hData);
134 hData = 0;
135 }
136 else
137 {
138 CODERES_STRUCT *cs;
139
140 cs = (CODERES_STRUCT *) hData;
141 cs->data = *RDPtr; // Structure assignment.
142 }
143 }
144 resdata->ptr = hData;
145 }
146
147 static BOOLEAN
_ReleaseCodeResData(void * data)148 _ReleaseCodeResData (void *data)
149 {
150 HFree (data);
151 return TRUE;
152 }
153
154 BOOLEAN
InstallCodeResType()155 InstallCodeResType ()
156 {
157 return (InstallResTypeVectors ("SHIP",
158 GetCodeResData, _ReleaseCodeResData, NULL));
159 }
160
161
162 void *
LoadCodeResInstance(RESOURCE res)163 LoadCodeResInstance (RESOURCE res)
164 {
165 void *hData;
166
167 hData = res_GetResource (res);
168 if (hData)
169 res_DetachResource (res);
170
171 return hData;
172 }
173
174
175 BOOLEAN
DestroyCodeRes(void * hCode)176 DestroyCodeRes (void *hCode)
177 {
178 HFree (hCode);
179 return TRUE;
180 }
181
182
183 void*
CaptureCodeRes(void * hCode,void * pData,void ** ppLocData)184 CaptureCodeRes (void *hCode, void *pData, void **ppLocData)
185 {
186 CODERES_STRUCT *cs;
187
188 if (hCode == NULL)
189 {
190 log_add (log_Fatal, "dummy.c::CaptureCodeRes() hCode==NULL! FATAL!");
191 return(NULL);
192 }
193
194 cs = (CODERES_STRUCT *) hCode;
195 *ppLocData = &cs->data;
196
197 (void) pData; /* Satisfying compiler (unused parameter) */
198 return cs;
199 }
200
201
202 void *
ReleaseCodeRes(void * CodeRef)203 ReleaseCodeRes (void *CodeRef)
204 {
205 return CodeRef;
206 }
207
208