project_files/frontlib/ipc/ipcprotocol.c
changeset 7482 d70a5b0d1190
parent 7320 e704706008d4
child 7497 7e1d72fc03c7
equal deleted inserted replaced
7479:c8c552ee3acb 7482:d70a5b0d1190
    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