78 * We have to split the drawn map data into several edraw messages here because |
78 * We have to split the drawn map data into several edraw messages here because |
79 * it can be longer than the maximum message size. |
79 * it can be longer than the maximum message size. |
80 */ |
80 */ |
81 const char *edraw = "edraw "; |
81 const char *edraw = "edraw "; |
82 int edrawlen = strlen(edraw); |
82 int edrawlen = strlen(edraw); |
83 for(int offset=0; offset<map->drawDataSize; offset+=200) { |
83 for(size_t offset=0; offset<map->drawDataSize; offset+=200) { |
84 int bytesRemaining = map->drawDataSize-offset; |
84 size_t bytesRemaining = map->drawDataSize-offset; |
85 int fragmentsize = bytesRemaining < 200 ? bytesRemaining : 200; |
85 int fragmentsize = bytesRemaining < 200 ? bytesRemaining : 200; |
86 uint8_t messagesize = edrawlen + fragmentsize; |
86 uint8_t messagesize = edrawlen + fragmentsize; |
87 error |= flib_vector_append(tempvector, &messagesize, 1); |
87 error |= flib_vector_append(tempvector, &messagesize, 1); |
88 error |= flib_vector_append(tempvector, edraw, edrawlen); |
88 error |= flib_vector_append(tempvector, edraw, edrawlen); |
89 error |= flib_vector_append(tempvector, map->drawData+offset, fragmentsize); |
89 error |= flib_vector_append(tempvector, map->drawData+offset, fragmentsize); |
109 return flib_ipc_append_message(vec, "eseed %s", seed); |
109 return flib_ipc_append_message(vec, "eseed %s", seed); |
110 } |
110 } |
111 |
111 |
112 int flib_ipc_append_script(flib_vector *vec, const char *script) { |
112 int flib_ipc_append_script(flib_vector *vec, const char *script) { |
113 int result = -1; |
113 int result = -1; |
114 char *copy = flib_strdupnull(script); |
114 if(!log_badargs_if2(vec==NULL, script==NULL)) { |
|
115 result = flib_ipc_append_message(vec, "escript %s", script); |
|
116 } |
|
117 return result; |
|
118 } |
|
119 |
|
120 int flib_ipc_append_style(flib_vector *vec, const char *style) { |
|
121 int result = -1; |
|
122 char *copy = flib_strdupnull(style); |
115 if(!log_badargs_if(vec==NULL) && copy) { |
123 if(!log_badargs_if(vec==NULL) && copy) { |
116 if(!strcmp("Normal", copy)) { |
124 if(!strcmp("Normal", copy)) { |
117 // "Normal" means no gametype script |
125 // "Normal" means no gametype script |
|
126 // TODO if an empty script called "Normal" is added to the scripts directory this can be removed |
118 result = 0; |
127 result = 0; |
119 } else { |
128 } else { |
120 size_t len = strlen(copy); |
129 size_t len = strlen(copy); |
121 for(size_t i=0; i<len; i++) { |
130 for(size_t i=0; i<len; i++) { |
122 if(copy[i] == ' ') { |
131 if(copy[i] == ' ') { |
190 for(int i=0;i<sizeof(md5bytes); i++) { |
199 for(int i=0;i<sizeof(md5bytes); i++) { |
191 snprintf(out+i*2, 3, "%02x", (unsigned)md5bytes[i]); |
200 snprintf(out+i*2, 3, "%02x", (unsigned)md5bytes[i]); |
192 } |
201 } |
193 } |
202 } |
194 |
203 |
195 int flib_ipc_append_addteam(flib_vector *vec, const flib_team *team, bool perHogAmmo, bool noAmmoStore) { |
204 static int flib_ipc_append_addteam(flib_vector *vec, const flib_team *team, bool perHogAmmo, bool noAmmoStore) { |
196 int result = -1; |
205 int result = -1; |
197 flib_vector *tempvector = flib_vector_create(); |
206 flib_vector *tempvector = flib_vector_create(); |
198 if(!log_badargs_if2(vec==NULL, team==NULL) && tempvector) { |
207 if(!log_badargs_if2(vec==NULL, team==NULL) && tempvector) { |
199 bool error = false; |
208 bool error = false; |
200 |
209 |
204 || flib_ipc_append_message(tempvector, "eammstore"); |
213 || flib_ipc_append_message(tempvector, "eammstore"); |
205 } |
214 } |
206 |
215 |
207 char md5Hex[33]; |
216 char md5Hex[33]; |
208 calculateMd5Hex(team->ownerName ? team->ownerName : "", md5Hex); |
217 calculateMd5Hex(team->ownerName ? team->ownerName : "", md5Hex); |
209 if(team->colorIndex<0 || team->colorIndex>=flib_teamcolor_defaults_len) { |
218 if(team->colorIndex<0 || team->colorIndex>=flib_teamcolor_count) { |
210 flib_log_e("Color index out of bounds for team %s: %i", team->name, team->colorIndex); |
219 flib_log_e("Color index out of bounds for team %s: %i", team->name, team->colorIndex); |
211 error = true; |
220 error = true; |
212 } else { |
221 } else { |
213 error |= flib_ipc_append_message(tempvector, "eaddteam %s %"PRIu32" %s", md5Hex, flib_teamcolor_defaults[team->colorIndex], team->name); |
222 error |= flib_ipc_append_message(tempvector, "eaddteam %s %"PRIu32" %s", md5Hex, flib_teamcolors[team->colorIndex], team->name); |
214 } |
223 } |
215 |
224 |
216 if(team->remoteDriven) { |
225 if(team->remoteDriven) { |
217 error |= flib_ipc_append_message(tempvector, "erdriven"); |
226 error |= flib_ipc_append_message(tempvector, "erdriven"); |
218 } |
227 } |
256 |
265 |
257 error |= flib_ipc_append_message(vec, netgame ? "TN" : "TL"); |
266 error |= flib_ipc_append_message(vec, netgame ? "TN" : "TL"); |
258 if(setup->map) { |
267 if(setup->map) { |
259 error |= flib_ipc_append_mapconf(tempvector, setup->map, false); |
268 error |= flib_ipc_append_mapconf(tempvector, setup->map, false); |
260 } |
269 } |
261 if(setup->script) { |
270 if(setup->style) { |
262 error |= flib_ipc_append_script(tempvector, setup->script); |
271 error |= flib_ipc_append_style(tempvector, setup->style); |
263 } |
272 } |
264 if(setup->gamescheme) { |
273 if(setup->gamescheme) { |
265 error |= flib_ipc_append_gamescheme(tempvector, setup->gamescheme); |
274 error |= flib_ipc_append_gamescheme(tempvector, setup->gamescheme); |
266 sharedAmmo = flib_scheme_get_mod(setup->gamescheme, "sharedammo"); |
275 sharedAmmo = flib_scheme_get_mod(setup->gamescheme, "sharedammo"); |
267 // Shared ammo has priority over per-hog ammo |
276 // Shared ammo has priority over per-hog ammo |