33 #include <QTextStream> |
33 #include <QTextStream> |
34 |
34 |
35 QString training, campaign; // TODO: Cleaner solution? |
35 QString training, campaign; // TODO: Cleaner solution? |
36 |
36 |
37 HWGame::HWGame(GameUIConfig * config, GameCFGWidget * gamecfg, QString ammo, TeamSelWidget* pTeamSelWidget) : |
37 HWGame::HWGame(GameUIConfig * config, GameCFGWidget * gamecfg, QString ammo, TeamSelWidget* pTeamSelWidget) : |
38 TCPBase(true), |
38 TCPBase(true), |
39 ammostr(ammo), |
39 ammostr(ammo), |
40 m_pTeamSelWidget(pTeamSelWidget) |
40 m_pTeamSelWidget(pTeamSelWidget) |
41 { |
41 { |
42 this->config = config; |
42 this->config = config; |
43 this->gamecfg = gamecfg; |
43 this->gamecfg = gamecfg; |
44 netSuspend = false; |
44 netSuspend = false; |
45 } |
45 } |
49 SetGameState(gsDestroyed); |
49 SetGameState(gsDestroyed); |
50 } |
50 } |
51 |
51 |
52 void HWGame::onClientDisconnect() |
52 void HWGame::onClientDisconnect() |
53 { |
53 { |
54 switch (gameType) { |
54 switch (gameType) |
|
55 { |
55 case gtSave: |
56 case gtSave: |
56 if (gameState == gsInterrupted || gameState == gsHalted) |
57 if (gameState == gsInterrupted || gameState == gsHalted) |
57 emit HaveRecord(false, demo); |
58 emit HaveRecord(false, demo); |
58 else if (gameState == gsFinished) |
59 else if (gameState == gsFinished) |
59 emit HaveRecord(true, demo); |
60 emit HaveRecord(true, demo); |
60 break; |
61 break; |
61 case gtDemo: |
62 case gtDemo: |
62 break; |
63 break; |
63 case gtNet: |
64 case gtNet: |
64 emit HaveRecord(true, demo); |
65 emit HaveRecord(true, demo); |
96 HWProto::addStringToBuffer(buf, QString("eammprob %1").arg(ammostr.mid(cAmmoNumber, cAmmoNumber))); |
98 HWProto::addStringToBuffer(buf, QString("eammprob %1").arg(ammostr.mid(cAmmoNumber, cAmmoNumber))); |
97 HWProto::addStringToBuffer(buf, QString("eammdelay %1").arg(ammostr.mid(2 * cAmmoNumber, cAmmoNumber))); |
99 HWProto::addStringToBuffer(buf, QString("eammdelay %1").arg(ammostr.mid(2 * cAmmoNumber, cAmmoNumber))); |
98 HWProto::addStringToBuffer(buf, QString("eammreinf %1").arg(ammostr.mid(3 * cAmmoNumber, cAmmoNumber))); |
100 HWProto::addStringToBuffer(buf, QString("eammreinf %1").arg(ammostr.mid(3 * cAmmoNumber, cAmmoNumber))); |
99 if(!gamecfg->schemeData(21).toBool()) HWProto::addStringToBuffer(buf, QString("eammstore")); |
101 if(!gamecfg->schemeData(21).toBool()) HWProto::addStringToBuffer(buf, QString("eammstore")); |
100 HWProto::addStringListToBuffer(buf, |
102 HWProto::addStringListToBuffer(buf, |
101 team.teamGameConfig(gamecfg->getInitHealth())); |
103 team.teamGameConfig(gamecfg->getInitHealth())); |
102 ; |
104 ; |
103 } |
105 } |
104 } |
106 } |
105 RawSendIPC(buf); |
107 RawSendIPC(buf); |
106 } |
108 } |
114 { |
116 { |
115 QByteArray teamscfg; |
117 QByteArray teamscfg; |
116 |
118 |
117 HWProto::addStringToBuffer(teamscfg, "TL"); |
119 HWProto::addStringToBuffer(teamscfg, "TL"); |
118 HWProto::addStringToBuffer(teamscfg, QString("etheme %1") |
120 HWProto::addStringToBuffer(teamscfg, QString("etheme %1") |
119 .arg((themesModel->rowCount() > 0) ? themesModel->index(rand() % themesModel->rowCount()).data().toString() : "steel")); |
121 .arg((themesModel->rowCount() > 0) ? themesModel->index(rand() % themesModel->rowCount()).data().toString() : "steel")); |
120 HWProto::addStringToBuffer(teamscfg, "eseed " + QUuid::createUuid().toString()); |
122 HWProto::addStringToBuffer(teamscfg, "eseed " + QUuid::createUuid().toString()); |
121 |
123 |
122 HWTeam team1; |
124 HWTeam team1; |
123 team1.setDifficulty(0); |
125 team1.setDifficulty(0); |
124 team1.setColor(QColor(colors[0])); |
126 team1.setColor(QColor(colors[0])); |
125 team1.setNumHedgehogs(4); |
127 team1.setNumHedgehogs(4); |
126 HWNamegen::teamRandomNames(team1,true); |
128 HWNamegen::teamRandomNames(team1,true); |
127 HWProto::addStringListToBuffer(teamscfg, |
129 HWProto::addStringListToBuffer(teamscfg, |
128 team1.teamGameConfig(100)); |
130 team1.teamGameConfig(100)); |
129 |
131 |
130 HWTeam team2; |
132 HWTeam team2; |
131 team2.setDifficulty(4); |
133 team2.setDifficulty(4); |
132 team2.setColor(QColor(colors[1])); |
134 team2.setColor(QColor(colors[1])); |
133 team2.setNumHedgehogs(4); |
135 team2.setNumHedgehogs(4); |
134 do |
136 do |
135 HWNamegen::teamRandomNames(team2,true); |
137 HWNamegen::teamRandomNames(team2,true); |
136 while(!team2.name().compare(team1.name()) || !team2.hedgehog(0).Hat.compare(team1.hedgehog(0).Hat)); |
138 while(!team2.name().compare(team1.name()) || !team2.hedgehog(0).Hat.compare(team1.hedgehog(0).Hat)); |
137 HWProto::addStringListToBuffer(teamscfg, |
139 HWProto::addStringListToBuffer(teamscfg, |
138 team2.teamGameConfig(100)); |
140 team2.teamGameConfig(100)); |
139 |
141 |
140 HWProto::addStringToBuffer(teamscfg, QString("eammloadt %1").arg(cDefaultAmmoStore->mid(0, cAmmoNumber))); |
142 HWProto::addStringToBuffer(teamscfg, QString("eammloadt %1").arg(cDefaultAmmoStore->mid(0, cAmmoNumber))); |
141 HWProto::addStringToBuffer(teamscfg, QString("eammprob %1").arg(cDefaultAmmoStore->mid(cAmmoNumber, cAmmoNumber))); |
143 HWProto::addStringToBuffer(teamscfg, QString("eammprob %1").arg(cDefaultAmmoStore->mid(cAmmoNumber, cAmmoNumber))); |
142 HWProto::addStringToBuffer(teamscfg, QString("eammdelay %1").arg(cDefaultAmmoStore->mid(2 * cAmmoNumber, cAmmoNumber))); |
144 HWProto::addStringToBuffer(teamscfg, QString("eammdelay %1").arg(cDefaultAmmoStore->mid(2 * cAmmoNumber, cAmmoNumber))); |
143 HWProto::addStringToBuffer(teamscfg, QString("eammreinf %1").arg(cDefaultAmmoStore->mid(3 * cAmmoNumber, cAmmoNumber))); |
145 HWProto::addStringToBuffer(teamscfg, QString("eammreinf %1").arg(cDefaultAmmoStore->mid(3 * cAmmoNumber, cAmmoNumber))); |
171 commonConfig(); |
173 commonConfig(); |
172 } |
174 } |
173 |
175 |
174 void HWGame::ParseMessage(const QByteArray & msg) |
176 void HWGame::ParseMessage(const QByteArray & msg) |
175 { |
177 { |
176 switch(msg.at(1)) { |
178 switch(msg.at(1)) |
177 case '?': { |
179 { |
|
180 case '?': |
|
181 { |
178 SendIPC("!"); |
182 SendIPC("!"); |
179 break; |
183 break; |
180 } |
184 } |
181 case 'C': { |
185 case 'C': |
182 switch (gameType) { |
186 { |
183 case gtLocal: { |
187 switch (gameType) |
|
188 { |
|
189 case gtLocal: |
|
190 { |
184 SendConfig(); |
191 SendConfig(); |
185 break; |
192 break; |
186 } |
193 } |
187 case gtQLocal: { |
194 case gtQLocal: |
|
195 { |
188 SendQuickConfig(); |
196 SendQuickConfig(); |
189 break; |
197 break; |
190 } |
198 } |
191 case gtSave: |
199 case gtSave: |
192 case gtDemo: break; |
200 case gtDemo: |
193 case gtNet: { |
201 break; |
|
202 case gtNet: |
|
203 { |
194 SendNetConfig(); |
204 SendNetConfig(); |
195 break; |
205 break; |
196 } |
206 } |
197 case gtTraining: { |
207 case gtTraining: |
|
208 { |
198 SendTrainingConfig(); |
209 SendTrainingConfig(); |
199 break; |
210 break; |
200 } |
211 } |
201 case gtCampaign: { |
212 case gtCampaign: |
|
213 { |
202 SendCampaignConfig(); |
214 SendCampaignConfig(); |
203 break; |
215 break; |
204 } |
216 } |
205 } |
217 } |
206 break; |
218 break; |
207 } |
219 } |
208 case 'E': { |
220 case 'E': |
|
221 { |
209 int size = msg.size(); |
222 int size = msg.size(); |
210 emit ErrorMessage(QString("Last two engine messages:\n") + QString().append(msg.mid(2)).left(size - 4)); |
223 emit ErrorMessage(QString("Last two engine messages:\n") + QString().append(msg.mid(2)).left(size - 4)); |
211 return; |
224 return; |
212 } |
225 } |
213 case 'K': { |
226 case 'K': |
|
227 { |
214 ulong kb = msg.mid(2).toULong(); |
228 ulong kb = msg.mid(2).toULong(); |
215 if (kb==1) { |
229 if (kb==1) |
216 qWarning("%s", KBMessages[kb - 1].toLocal8Bit().constData()); |
230 { |
217 return; |
231 qWarning("%s", KBMessages[kb - 1].toLocal8Bit().constData()); |
|
232 return; |
218 } |
233 } |
219 if (kb && kb <= KBmsgsCount) |
234 if (kb && kb <= KBmsgsCount) |
220 { |
235 { |
221 emit ErrorMessage(KBMessages[kb - 1]); |
236 emit ErrorMessage(KBMessages[kb - 1]); |
222 } |
237 } |
223 return; |
238 return; |
224 } |
239 } |
225 case 'i': { |
240 case 'i': |
|
241 { |
226 emit GameStats(msg.at(2), QString::fromUtf8(msg.mid(3))); |
242 emit GameStats(msg.at(2), QString::fromUtf8(msg.mid(3))); |
227 break; |
243 break; |
228 } |
244 } |
229 case 'Q': { |
245 case 'Q': |
|
246 { |
230 SetGameState(gsInterrupted); |
247 SetGameState(gsInterrupted); |
231 break; |
248 break; |
232 } |
249 } |
233 case 'q': { |
250 case 'q': |
|
251 { |
234 SetGameState(gsFinished); |
252 SetGameState(gsFinished); |
235 break; |
253 break; |
236 } |
254 } |
237 case 'H': { |
255 case 'H': |
|
256 { |
238 SetGameState(gsHalted); |
257 SetGameState(gsHalted); |
239 break; |
258 break; |
240 } |
259 } |
241 case 's': { |
260 case 's': |
|
261 { |
242 int size = msg.size(); |
262 int size = msg.size(); |
243 QString msgbody = QString::fromUtf8(msg.mid(2).left(size - 4)); |
263 QString msgbody = QString::fromUtf8(msg.mid(2).left(size - 4)); |
244 emit SendChat(msgbody); |
264 emit SendChat(msgbody); |
245 // FIXME: /me command doesn't work here |
265 // FIXME: /me command doesn't work here |
246 QByteArray buf; |
266 QByteArray buf; |
247 HWProto::addStringToBuffer(buf, "s" + HWProto::formatChatMsg(config->netNick(), msgbody) + "\x20\x20"); |
267 HWProto::addStringToBuffer(buf, "s" + HWProto::formatChatMsg(config->netNick(), msgbody) + "\x20\x20"); |
248 demo.append(buf); |
268 demo.append(buf); |
249 break; |
269 break; |
250 } |
270 } |
251 case 'b': { |
271 case 'b': |
|
272 { |
252 int size = msg.size(); |
273 int size = msg.size(); |
253 QString msgbody = QString::fromUtf8(msg.mid(2).left(size - 4)); |
274 QString msgbody = QString::fromUtf8(msg.mid(2).left(size - 4)); |
254 emit SendTeamMessage(msgbody); |
275 emit SendTeamMessage(msgbody); |
255 break; |
276 break; |
256 } |
277 } |
257 default: { |
278 default: |
|
279 { |
258 if (gameType == gtNet && !netSuspend) |
280 if (gameType == gtNet && !netSuspend) |
259 { |
281 { |
260 emit SendNet(msg); |
282 emit SendNet(msg); |
261 } |
283 } |
262 if (msg.at(1) != 's') |
284 if (msg.at(1) != 's') |