project_files/frontlib/ipc/ipcprotocol.c
changeset 7179 f84805e6df03
parent 7177 bf6cf4dd847a
child 7224 5143861c83bd
equal deleted inserted replaced
7177:bf6cf4dd847a 7179:f84805e6df03
     1 #include "ipcprotocol.h"
     1 #include "ipcprotocol.h"
     2 #include "../util.h"
     2 #include "../util/util.h"
     3 #include "../logging.h"
     3 #include "../util/logging.h"
     4 
     4 
     5 #include <stdio.h>
     5 #include <stdio.h>
     6 #include <stdbool.h>
     6 #include <stdbool.h>
     7 #include <string.h>
     7 #include <string.h>
       
     8 #include <inttypes.h>
     8 
     9 
     9 int flib_ipc_append_message(flib_vector vec, const char *fmt, ...) {
    10 int flib_ipc_append_message(flib_vector vec, const char *fmt, ...) {
    10 	int result = -1;
    11 	int result = -1;
    11 	if(!vec || !fmt) {
    12 	if(!vec || !fmt) {
    12 		flib_log_e("null parameter in flib_ipc_appendmessage");
    13 		flib_log_e("null parameter in flib_ipc_appendmessage");
    92 		return -1;
    93 		return -1;
    93 	} else {
    94 	} else {
    94 		return flib_ipc_append_message(vec, "eseed %s", seed);
    95 		return flib_ipc_append_message(vec, "eseed %s", seed);
    95 	}
    96 	}
    96 }
    97 }
       
    98 
       
    99 int flib_ipc_append_gamescheme(flib_vector vec, flib_cfg *scheme, flib_cfg_meta *meta) {
       
   100 	int result = -1;
       
   101 	flib_vector tempvector = flib_vector_create();
       
   102 	if(!vec || !scheme || !meta) {
       
   103 		flib_log_e("null parameter in flib_ipc_append_gamescheme");
       
   104 	} else if(tempvector) {
       
   105 		bool error = false;
       
   106 		uint32_t gamemods = 0;
       
   107 		for(int i=0; i<meta->modCount; i++) {
       
   108 			if(scheme->mods[i]) {
       
   109 				gamemods |= (1<<meta->mods[i].bitmaskIndex);
       
   110 			}
       
   111 		}
       
   112 		error |= flib_ipc_append_message(tempvector, "e$gmflags %"PRIu32, gamemods);
       
   113 		for(int i=0; i<meta->settingCount; i++) {
       
   114 			int value = scheme->settings[i];
       
   115 			if(meta->settings[i].checkOverMax) {
       
   116 				value = value>meta->settings[i].max ? meta->settings[i].max : value;
       
   117 			}
       
   118 			if(meta->settings[i].times1000) {
       
   119 				value *= 1000;
       
   120 			}
       
   121 			error |= flib_ipc_append_message(tempvector, "%s %i", meta->settings[i].engineCommand, value);
       
   122 		}
       
   123 
       
   124 		if(!error) {
       
   125 			// Message created, now we can copy everything.
       
   126 			flib_constbuffer constbuf = flib_vector_as_constbuffer(tempvector);
       
   127 			if(flib_vector_append(vec, constbuf.data, constbuf.size) == constbuf.size) {
       
   128 				result = 0;
       
   129 			}
       
   130 		}
       
   131 	}
       
   132 	flib_vector_destroy(&tempvector);
       
   133 	return result;
       
   134 }
       
   135 
       
   136 // FIXME shared ammo will break per-team ammo
       
   137 int flib_ipc_append_addteam(flib_vector vec, flib_team *team, bool perHogAmmo, bool sharedAmmo) {
       
   138 	int result = -1;
       
   139 	flib_vector tempvector = flib_vector_create();
       
   140 	if(!vec || !team || !team->weaponset) {
       
   141 		flib_log_e("invalid parameter in flib_ipc_append_addteam");
       
   142 	} else if(tempvector) {
       
   143 		bool error = false;
       
   144 		error |= flib_ipc_append_message(tempvector, "eammloadt %s", team->weaponset->loadout);
       
   145 		error |= flib_ipc_append_message(tempvector, "eammprob %s", team->weaponset->crateprob);
       
   146 		error |= flib_ipc_append_message(tempvector, "eammdelay %s", team->weaponset->delay);
       
   147 		error |= flib_ipc_append_message(tempvector, "eammreinf %s", team->weaponset->crateammo);
       
   148 		if(!perHogAmmo) {
       
   149 			error |= flib_ipc_append_message(tempvector, "eammstore");
       
   150 		}
       
   151 
       
   152 		char *hash = team->hash ? team->hash : "00000000000000000000000000000000";
       
   153 		error |= flib_ipc_append_message(tempvector, "eaddteam %s %"PRIu32" %s", hash, team->color, team->name);
       
   154 
       
   155 		if(team->remoteDriven) {
       
   156 			error |= flib_ipc_append_message(tempvector, "erdriven");
       
   157 		}
       
   158 
       
   159 		error |= flib_ipc_append_message(tempvector, "egrave %s", team->grave);
       
   160 		error |= flib_ipc_append_message(tempvector, "efort %s", team->fort);
       
   161 		error |= flib_ipc_append_message(tempvector, "evoicepack %s", team->voicepack);
       
   162 		error |= flib_ipc_append_message(tempvector, "eflag %s", team->flag);
       
   163 
       
   164 		// TODO bindings
       
   165 
       
   166 		for(int i=0; i<team->hogsInGame; i++) {
       
   167 			error |= flib_ipc_append_message(tempvector, "eaddhh %i %i %s", team->hogs[i].difficulty, team->hogs[i].initialHealth, team->hogs[i].name);
       
   168 			error |= flib_ipc_append_message(tempvector, "ehat %s", team->hogs[i].hat);
       
   169 		}
       
   170 
       
   171 		if(!error) {
       
   172 			// Message created, now we can copy everything.
       
   173 			flib_constbuffer constbuf = flib_vector_as_constbuffer(tempvector);
       
   174 			if(flib_vector_append(vec, constbuf.data, constbuf.size) == constbuf.size) {
       
   175 				result = 0;
       
   176 			}
       
   177 		}
       
   178 	}
       
   179 	flib_vector_destroy(&tempvector);
       
   180 	return result;
       
   181 }