59 conn->onDisconnectCb = &defaultCallback_onDisconnect; |
59 conn->onDisconnectCb = &defaultCallback_onDisconnect; |
60 conn->onErrorMessageCb = &defaultCallback_onErrorMessage; |
60 conn->onErrorMessageCb = &defaultCallback_onErrorMessage; |
61 conn->onChatCb = &defaultCallback_onChat; |
61 conn->onChatCb = &defaultCallback_onChat; |
62 conn->onGameRecordedCb = &defaultCallback_onGameRecorded; |
62 conn->onGameRecordedCb = &defaultCallback_onGameRecorded; |
63 conn->onNetMessageCb = &defaultCallback_onNetMessage; |
63 conn->onNetMessageCb = &defaultCallback_onNetMessage; |
64 } |
|
65 |
|
66 static bool getGameMod(flib_cfg_meta *meta, flib_cfg *conf, int maskbit) { |
|
67 for(int i=0; i<meta->modCount; i++) { |
|
68 if(meta->mods[i].bitmaskIndex == maskbit) { |
|
69 return conf->mods[i]; |
|
70 } |
|
71 } |
|
72 flib_log_e("Unable to find game mod with mask bit %i", maskbit); |
|
73 return false; |
|
74 } |
|
75 |
|
76 static int fillConfigBuffer(flib_vector *configBuffer, const char *playerName, flib_cfg_meta *metaconf, flib_gamesetup *setup, bool netgame) { |
|
77 bool error = false; |
|
78 bool perHogAmmo = false; |
|
79 bool sharedAmmo = false; |
|
80 |
|
81 error |= flib_ipc_append_message(configBuffer, netgame ? "TN" : "TL"); |
|
82 error |= flib_ipc_append_seed(configBuffer, setup->seed); |
|
83 if(setup->map) { |
|
84 error |= flib_ipc_append_mapconf(configBuffer, setup->map, false); |
|
85 } |
|
86 if(setup->script) { |
|
87 error |= flib_ipc_append_message(configBuffer, "escript %s", setup->script); |
|
88 } |
|
89 if(setup->gamescheme) { |
|
90 error |= flib_ipc_append_gamescheme(configBuffer, setup->gamescheme, metaconf); |
|
91 perHogAmmo = getGameMod(metaconf, setup->gamescheme, GAMEMOD_PERHOGAMMO_MASKBIT); |
|
92 sharedAmmo = getGameMod(metaconf, setup->gamescheme, GAMEMOD_SHAREDAMMO_MASKBIT); |
|
93 } |
|
94 if(setup->teams) { |
|
95 for(int i=0; i<setup->teamcount; i++) { |
|
96 error |= flib_ipc_append_addteam(configBuffer, setup->teams[i], perHogAmmo, sharedAmmo); |
|
97 } |
|
98 } |
|
99 error |= flib_ipc_append_message(configBuffer, "!"); |
|
100 return error ? -1 : 0; |
|
101 } |
64 } |
102 |
65 |
103 static flib_gameconn *flib_gameconn_create_partial(bool record, const char *playerName, bool netGame) { |
66 static flib_gameconn *flib_gameconn_create_partial(bool record, const char *playerName, bool netGame) { |
104 flib_gameconn *result = NULL; |
67 flib_gameconn *result = NULL; |
105 flib_gameconn *tempConn = flib_calloc(1, sizeof(flib_gameconn)); |
68 flib_gameconn *tempConn = flib_calloc(1, sizeof(flib_gameconn)); |
120 } |
83 } |
121 flib_gameconn_destroy(tempConn); |
84 flib_gameconn_destroy(tempConn); |
122 return result; |
85 return result; |
123 } |
86 } |
124 |
87 |
125 flib_gameconn *flib_gameconn_create(const char *playerName, flib_cfg_meta *metaconf, flib_gamesetup *setup, bool netgame) { |
88 flib_gameconn *flib_gameconn_create(const char *playerName, flib_gamesetup *setup, bool netgame) { |
126 flib_gameconn *result = NULL; |
89 flib_gameconn *result = NULL; |
127 flib_gameconn *tempConn = flib_gameconn_create_partial(true, playerName, netgame); |
90 flib_gameconn *tempConn = flib_gameconn_create_partial(true, playerName, netgame); |
128 if(tempConn) { |
91 if(tempConn) { |
129 if(fillConfigBuffer(tempConn->configBuffer, playerName, metaconf, setup, netgame) == 0) { |
92 if(!flib_ipc_append_fullconfig(tempConn->configBuffer, setup, netgame)) { |
130 result = tempConn; |
93 result = tempConn; |
131 tempConn = NULL; |
94 tempConn = NULL; |
132 } |
95 } |
133 } |
96 } |
134 flib_gameconn_destroy(tempConn); |
97 flib_gameconn_destroy(tempConn); |