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