# HG changeset patch # User unc0rr # Date 1135808291 0 # Node ID 78bff13b11c0147fa492daef5381295feb1c6230 # Parent 99888245a4e8b38feb98c549631d0c90fa680f18 With this patch the game doesn't crash when gaming by net diff -r 99888245a4e8 -r 78bff13b11c0 QTfrontend/game.cpp --- a/QTfrontend/game.cpp Tue Dec 27 10:20:55 2005 +0000 +++ b/QTfrontend/game.cpp Wed Dec 28 22:18:11 2005 +0000 @@ -70,6 +70,8 @@ connect(client, SIGNAL(disconnected()), this, SLOT(ClientDisconnect())); connect(client, SIGNAL(readyRead()), this, SLOT(ClientRead())); msgsize = 0; + if (toSendBuf.size() > 0) + SENDIPC("?"); } else { client->disconnectFromHost(); @@ -91,13 +93,6 @@ void HWGame::SendConfig() { - if (gameType == gtDemo) - { - SENDIPC("TD"); - RawSendIPC(*toSendBuf); - delete toSendBuf; - return ; - } SENDIPC("TL"); // SENDIPC("e$gmflags 0"); SENDIPC("eaddteam"); @@ -139,7 +134,10 @@ emit SendNet(QByteArray("\x01""C")); } else - SendConfig(); + { + if (gameType == gtLocal) + SendConfig(); + } break; } case '+': @@ -148,46 +146,53 @@ } default: { + QByteArray tmpbuf = QByteArray::fromRawData((char *)&msgsize, 1) + QByteArray::fromRawData(msgbuf, msgsize); if (gameType == gtNet) { - emit SendNet(QByteArray::fromRawData(msgbuf, msgsize)); + emit SendNet(tmpbuf); } - demo->append(msgsize); - demo->append(QByteArray::fromRawData(msgbuf, msgsize)); + demo->append(tmpbuf); } } } void HWGame::SendIPC(const char * msg, quint8 len) { - IPCSocket->write((char *)&len, 1); - IPCSocket->write(msg, len); - if ((len > 5) && !((msg[0] == 'e') && (msg[1] == 'b'))) - { - demo->append(len); - demo->append(QByteArray::fromRawData(msg, len)); - } + SendIPC(QByteArray::fromRawData(msg, len)); } void HWGame::SendIPC(const QByteArray & buf) { if (buf.size() > MAXMSGCHARS) return; - quint8 len = buf.size(); - IPCSocket->write((char *)&len, 1); - IPCSocket->write(buf); - demo->append(len); - demo->append(buf); + if (!IPCSocket) + { + toSendBuf += buf; + } else + { + quint8 len = buf.size(); + RawSendIPC(QByteArray::fromRawData((char *)&len, 1) + buf); + } } void HWGame::RawSendIPC(const QByteArray & buf) { - IPCSocket->write(buf); - demo->append(buf); + if (!IPCSocket) + { + toSendBuf += buf; + } else + { + if (toSendBuf.size() > 0) + { + IPCSocket->write(toSendBuf); + demo->append(toSendBuf); + } + IPCSocket->write(buf); + demo->append(buf); + } } void HWGame::FromNet(const QByteArray & msg) { - // ?local config? RawSendIPC(msg); } @@ -299,52 +304,43 @@ // read demo QDataStream stream(&demofile); - toSendBuf = new QByteArray(); char buf[512]; quint32 readbytes; do { readbytes = stream.readRawData((char *)&buf, 512); - toSendBuf -> append(QByteArray((char *)&buf, readbytes)); + toSendBuf.append(QByteArray((char *)&buf, readbytes)); } while (readbytes > 0); demofile.close(); // cut seed - quint32 index = toSendBuf->indexOf(10); - if (!index) + quint32 index = toSendBuf.indexOf(10); + if ((index < 3) || (index > 20)) { QMessageBox::critical(0, tr("Error"), - tr("Corrupted demo file %s").arg(demofilename), + tr("Corrupted demo file %1").arg(demofilename), tr("Quit")); return ; } - seed = QString(toSendBuf->left(index++)); - toSendBuf->remove(0, index); + seed = QString(toSendBuf.left(index++)); + toSendBuf.remove(0, index); + toSendBuf = QByteArray::fromRawData("\x02TD", 3) + toSendBuf; // run engine - QProcess * process; - QStringList arguments; - process = new QProcess; - arguments << resolutions[0][vid_Resolution]; - arguments << resolutions[1][vid_Resolution]; - arguments << GetThemeBySeed(); - arguments << "46631"; - arguments << seed; - arguments << (vid_Fullscreen ? "1" : "0"); - process->start("hw", arguments); demo = new QByteArray; + Start(); } void HWGame::StartNet(const QString & netseed) { gameType = gtNet; seed = netseed; - Start(); demo = new QByteArray; demo->append(seed.toLocal8Bit()); demo->append(10); + Start(); } void HWGame::StartLocal() @@ -352,10 +348,10 @@ gameType = gtLocal; if (TeamCount < 2) return; seedgen.GenRNDStr(seed, 10); - Start(); demo = new QByteArray; demo->append(seed.toLocal8Bit()); demo->append(10); + Start(); } void HWGame::LocalCFG(const QString & teamname) diff -r 99888245a4e8 -r 78bff13b11c0 QTfrontend/game.h --- a/QTfrontend/game.h Tue Dec 27 10:20:55 2005 +0000 +++ b/QTfrontend/game.h Wed Dec 28 22:18:11 2005 +0000 @@ -80,7 +80,7 @@ int TeamCount; RNDStr seedgen; QByteArray * demo; - QByteArray * toSendBuf; + QByteArray toSendBuf; int vid_Resolution; bool vid_Fullscreen; GameType gameType; diff -r 99888245a4e8 -r 78bff13b11c0 QTfrontend/hwform.cpp --- a/QTfrontend/hwform.cpp Tue Dec 27 10:20:55 2005 +0000 +++ b/QTfrontend/hwform.cpp Wed Dec 28 22:18:11 2005 +0000 @@ -251,8 +251,8 @@ void HWForm::SimpleGame() { game = new HWGame(ui.CBResolution->currentIndex(), ui.CBFullscreen->isChecked()); - game->AddTeam("team.cfg"); - game->AddTeam("team.cfg"); + game->AddTeam("team"); + game->AddTeam("team"); game->StartLocal(); } @@ -310,6 +310,7 @@ connect(hwnet, SIGNAL(Connected()), this, SLOT(GoToNetChat())); connect(hwnet, SIGNAL(AddGame(const QString &)), this, SLOT(AddGame(const QString &))); connect(hwnet, SIGNAL(EnteredGame()), this, SLOT(NetGameEnter())); + connect(hwnet, SIGNAL(ChangeInTeams(const QStringList &)), this, SLOT(ChangeInNetTeams(const QStringList &))); } void HWForm::NetDisconnect() @@ -350,3 +351,10 @@ { hwnet->StartGame(); } + +void HWForm::ChangeInNetTeams(const QStringList & teams) +{ + ui.listNetTeams->clear(); + ui.listNetTeams->addItems(teams); +} + diff -r 99888245a4e8 -r 78bff13b11c0 QTfrontend/hwform.h --- a/QTfrontend/hwform.h Tue Dec 27 10:20:55 2005 +0000 +++ b/QTfrontend/hwform.h Wed Dec 28 22:18:11 2005 +0000 @@ -77,6 +77,7 @@ void NetAddTeam(); void NetGameEnter(); void NetStartGame(); + void ChangeInNetTeams(const QStringList & teams); public slots: void CBGrave_activated(const QString & gravename); diff -r 99888245a4e8 -r 78bff13b11c0 QTfrontend/hwform.ui --- a/QTfrontend/hwform.ui Tue Dec 27 10:20:55 2005 +0000 +++ b/QTfrontend/hwform.ui Wed Dec 28 22:18:11 2005 +0000 @@ -50,7 +50,7 @@ - 2 + 7 @@ -379,8 +379,8 @@ 0 0 - 99 - 29 + 181 + 270 @@ -998,6 +998,16 @@ false + + + + 270 + 30 + 120 + 80 + + + diff -r 99888245a4e8 -r 78bff13b11c0 QTfrontend/netclient.cpp --- a/QTfrontend/netclient.cpp Tue Dec 27 10:20:55 2005 +0000 +++ b/QTfrontend/netclient.cpp Wed Dec 28 22:18:11 2005 +0000 @@ -35,10 +35,6 @@ #include "netclient.h" #include "game.h" -#include - -#define chkp qDebug() << "hw chkp in " << __FILE__ << ":" << __LINE__ - HWNet::HWNet(int Resolution, bool Fullscreen) : QObject() { @@ -160,10 +156,14 @@ if ((state == nsGaming) || (state == nsStarting)) { QString msg = QString(buf.toBase64()); - if (msg == "AUM=") + if ((msg == "AUM=") && (mynick == opnick)) { ConfigAsked(); } else + if (msg == "AT8=") + { + // its ping ("?") + } else { RawSendNet(QString("PRIVMSG %1 :"MAGIC_CHAR MAGIC_CHAR"%2").arg(channel, msg)); } @@ -325,7 +325,9 @@ teamnames += MAGIC_CHAR; teamnames += teams[i].hhs[0]; } - RawSendNet(QString("PRIVMSG %1 :"MAGIC_CHAR"Teams%2").arg(channel, teamnames)); + QString tmsg = QString(MAGIC_CHAR"=%2").arg(teamnames); + RawSendNet(QString("PRIVMSG %1 :").arg(channel) + tmsg); + hwp_chanmsg(mynick, tmsg); } } } @@ -338,7 +340,6 @@ quint32 color = 65535; for (int i = 0; i < teamsCount; i++) { -chkp; SENDCFGSTRNET("eaddteam"); QString msg; msg = MAGIC_CHAR "T" MAGIC_CHAR + teams[i].nick + MAGIC_CHAR + teams[i].hhs.join(MAGIC_CHAR); RawSendNet(QString("PRIVMSG %1 :%2").arg(channel, msg)); @@ -349,7 +350,8 @@ SENDCFGSTRNET("eadd hh2 0"); color <<= 8; } -chkp; SENDCFGSTRNET("!"); + SENDCFGSTRNET("!"); + state = nsGaming; } } @@ -359,28 +361,43 @@ { return ; } - if ((state == nsJoined) && (msg.startsWith(MAGIC_CHAR"Start!"MAGIC_CHAR)) && (who == opnick)) + if (state == nsJoined) { - state = nsStarting; - RunGame(msg.mid(7)); - return ; + if (msg.startsWith(MAGIC_CHAR"Start!"MAGIC_CHAR) && (who == opnick)) + { + state = nsStarting; + RunGame(msg.mid(7)); + return ; + } + if (msg.startsWith(MAGIC_CHAR"="MAGIC_CHAR) && (who == opnick)) + { + emit ChangeInTeams(msg.mid(3).split(MAGIC_CHAR)); + } } - if ((state == nsStarting) && (msg == MAGIC_CHAR MAGIC_CHAR "AUM=")) + if (state == nsStarting) { - if (mynick == opnick) ConfigAsked(); - return ; + if (msg == MAGIC_CHAR MAGIC_CHAR "AUM=") + { + if (mynick == opnick) ConfigAsked(); + return ; + } + if (msg == MAGIC_CHAR MAGIC_CHAR "ASE=") + { + state = nsGaming; + } + if (msg.startsWith(MAGIC_CHAR"T"MAGIC_CHAR)) + { + NetTeamAdded(msg.mid(3)); + } } - if ((state == nsStarting) && (msg.startsWith(MAGIC_CHAR"T"MAGIC_CHAR))) - { - NetTeamAdded(msg.mid(3)); - } - if (state != nsGaming) + if ((state != nsGaming) && (state != nsStarting)) { return; } if (msg.startsWith(MAGIC_CHAR MAGIC_CHAR)) // HWP message { - emit FromNet(QByteArray::fromBase64(msg.mid(2).toLocal8Bit())); + QByteArray em = QByteArray::fromBase64(msg.mid(2).toLocal8Bit()); + emit FromNet(em); } else // smth other { @@ -392,18 +409,19 @@ QStringList list = msg.split(MAGIC_CHAR, QString::SkipEmptyParts); if (list.size() != 10) return ; + SENDCFGSTRLOC("eaddteam"); if (list[0] == mynick) { -chkp; emit LocalCFG(list[1]); + emit LocalCFG(list[1]); } else { -chkp; SENDCFGSTRLOC("erdriven"); - SENDCFGSTRLOC(QString("ename team %1").arg(list[2])); + SENDCFGSTRLOC("erdriven"); + SENDCFGSTRLOC(QString("ename team %1").arg(list[1])); for (int i = 0; i < 8; i++) { - SENDCFGSTRLOC(QString("ename hh%1").arg(i) + list[i + 3]); + SENDCFGSTRLOC(QString("ename hh%1 ").arg(i) + list[i + 2]); } -chkp; } + } } void HWNet::AddTeam(const HWTeam & team) diff -r 99888245a4e8 -r 78bff13b11c0 QTfrontend/netclient.h --- a/QTfrontend/netclient.h Tue Dec 27 10:20:55 2005 +0000 +++ b/QTfrontend/netclient.h Wed Dec 28 22:18:11 2005 +0000 @@ -67,6 +67,7 @@ void EnteredGame(); void FromNet(const QByteArray & buf); void LocalCFG(const QString & team); + void ChangeInTeams(const QStringList & teams); public slots: void SendNet(const QByteArray & buf); diff -r 99888245a4e8 -r 78bff13b11c0 hedgewars/CCHandlers.inc --- a/hedgewars/CCHandlers.inc Tue Dec 27 10:20:55 2005 +0000 +++ b/hedgewars/CCHandlers.inc Wed Dec 28 22:18:11 2005 +0000 @@ -218,6 +218,8 @@ if ((State and gstHHDriven)<>0)and((State and (gstAttacked or gstHHChooseTarget or gstMoving)) = 0) then begin FollowGear:= CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog].Gear; + if (State and (gstAttacked or gstHHChooseTarget) = 0)and(CurAmmoGear = nil) then + State:= State or gstAttacking; if not CurrentTeam.ExtDriven then SendIPC('A'); Message:= Message or gm_Attack end @@ -225,56 +227,14 @@ end; procedure chAttack_m(var s: shortstring); -var xx, yy: real; begin if CheckNoTeamOrHH then exit; with CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog].Gear^, CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog] do begin {$IFDEF DEBUGFILE}AddFileLog('/-attack: Gear.State = '+inttostr(State)+' CurAmmoGear = '+inttostr(longword(CurAmmoGear)));{$ENDIF} - if CurAmmoGear <> nil then - begin - Message:= Message and not gm_Attack; - if not CurrentTeam.ExtDriven then SendIPC('a') - end; - if (((State and (gstHHDriven or gstAttacking)) = (gstHHDriven or gstAttacking))and - ((State and (gstAttacked or gstMoving or gstHHChooseTarget)) = 0)and - (((State and gstFalling ) = 0)or((Ammo[CurSlot, CurAmmo].Propz and ammoprop_AttackInFall) <> 0))and - (((State and gstHHJumping) = 0)or((Ammo[CurSlot, CurAmmo].Propz and ammoprop_AttackInJump) <> 0)))and - (CurAmmoGear = nil) then - begin - if (Ammo[CurSlot, CurAmmo].Propz and ammoprop_Power) <> 0 then - begin - StopTPUSound; - PlaySound(sndThrowRelease); - end; - xx:= Sign(dX)*Sin(Angle*pi/cMaxAngle); - yy:= -Cos(Angle*pi/cMaxAngle); - case Ammo[CurSlot, CurAmmo].AmmoType of - amBazooka: FollowGear:= AddGear(round(X), round(Y), gtAmmo_Grenade, 0, xx*Power/cPowerDivisor, yy*Power/cPowerDivisor); - amGrenade: FollowGear:= AddGear(round(X), round(Y), gtAmmo_Bomb, 0, xx*Power/cPowerDivisor, yy*Power/cPowerDivisor, Ammo[CurSlot, CurAmmo].Timer); - amUFO: FollowGear:= AddGear(round(X), round(Y), gtUFO, 0, xx*Power/cPowerDivisor, yy*Power/cPowerDivisor); - amShotgun: begin - PlaySound(sndShotgunReload); - FollowGear:= AddGear(round(X + xx*20), round(Y + yy*20), gtShotgunShot, 0, xx * 0.5, 0.5 * yy); - end; - amSkip: TurnTimeLeft:= 0; - amPickHammer: CurAmmoGear:= AddGear(round(Gear.X), round(Gear.Y) + cHHHalfHeight, gtPickHammer, 0); - amRope: CurAmmoGear:= AddGear(round(Gear.X), round(Gear.Y), gtRope, 0, xx, yy); - amMine: AddGear(round(X) + Sign(dX) * 7, round(Y), gtMine, 0, Sign(dX) * 0.01, 0, 3000); - end; - Power:= 0; - if CurAmmoGear <> nil then - begin - CurAmmoGear.Message:= Gear.Message; - exit - end else - begin - Message:= Message and not gm_Attack; - if not CurrentTeam.ExtDriven then SendIPC('a') - end; - AfterAttack - end + Message:= Message and not gm_Attack; + if not CurrentTeam.ExtDriven then SendIPC('a') end end; diff -r 99888245a4e8 -r 78bff13b11c0 hedgewars/HHHandlers.inc --- a/hedgewars/HHHandlers.inc Tue Dec 27 10:20:55 2005 +0000 +++ b/hedgewars/HHHandlers.inc Wed Dec 28 22:18:11 2005 +0000 @@ -31,6 +31,78 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *) +procedure Attack(Gear: PGear); +var xx, yy: real; +begin +with Gear^, + CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog] do + begin + {$IFDEF DEBUGFILE}AddFileLog('Attack: Gear.State = '+inttostr(State)+' CurAmmoGear = '+inttostr(longword(CurAmmoGear)));{$ENDIF} + if CurAmmoGear <> nil then + begin + Message:= Message and not gm_Attack; + if not CurrentTeam.ExtDriven then SendIPC('a') + end; + if (((State and (gstHHDriven or gstAttacking)) = (gstHHDriven or gstAttacking))and + ((State and (gstAttacked or gstMoving or gstHHChooseTarget)) = 0)and + (((State and gstFalling ) = 0)or((Ammo[CurSlot, CurAmmo].Propz and ammoprop_AttackInFall) <> 0))and + (((State and gstHHJumping) = 0)or((Ammo[CurSlot, CurAmmo].Propz and ammoprop_AttackInJump) <> 0)))and + (CurAmmoGear = nil) then + begin + if (Ammo[CurSlot, CurAmmo].Propz and ammoprop_Power) <> 0 then + begin + StopTPUSound; + PlaySound(sndThrowRelease); + end; + xx:= Sign(dX)*Sin(Angle*pi/cMaxAngle); + yy:= -Cos(Angle*pi/cMaxAngle); + case Ammo[CurSlot, CurAmmo].AmmoType of + amBazooka: FollowGear:= AddGear(round(X), round(Y), gtAmmo_Grenade, 0, xx*Power/cPowerDivisor, yy*Power/cPowerDivisor); + amGrenade: FollowGear:= AddGear(round(X), round(Y), gtAmmo_Bomb, 0, xx*Power/cPowerDivisor, yy*Power/cPowerDivisor, Ammo[CurSlot, CurAmmo].Timer); + amUFO: FollowGear:= AddGear(round(X), round(Y), gtUFO, 0, xx*Power/cPowerDivisor, yy*Power/cPowerDivisor); + amShotgun: begin + PlaySound(sndShotgunReload); + FollowGear:= AddGear(round(X + xx*20), round(Y + yy*20), gtShotgunShot, 0, xx * 0.5, 0.5 * yy); + end; + amSkip: TurnTimeLeft:= 0; + amPickHammer: CurAmmoGear:= AddGear(round(Gear.X), round(Gear.Y) + cHHHalfHeight, gtPickHammer, 0); + amRope: CurAmmoGear:= AddGear(round(Gear.X), round(Gear.Y), gtRope, 0, xx, yy); + amMine: AddGear(round(X) + Sign(dX) * 7, round(Y), gtMine, 0, Sign(dX) * 0.01, 0, 3000); + end; + Power:= 0; + if CurAmmoGear <> nil then + begin + CurAmmoGear.Message:= Gear.Message; + exit + end else + begin + Message:= Message and not gm_Attack; + if not CurrentTeam.ExtDriven then SendIPC('a') + end; + AfterAttack + end + end +end; + +procedure AfterAttack; +begin +with CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog].Gear^, + CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog] do + begin + Inc(AttacksNum); + State:= State and not gstAttacking; + if Ammo[CurSlot, CurAmmo].NumPerTurn >= AttacksNum then isInMultiShoot:= true + else begin + TurnTimeLeft:= Ammoz[Ammo[CurSlot, CurAmmo].AmmoType].TimeAfterTurn; + State:= State or gstAttacked; + OnUsedAmmo(Ammo) + end; + AttackBar:= 0 + end +end; + + + procedure doStepHedgehog(Gear: PGear); forward; //////////////////////////////////////////////////////////////////////////////// procedure doStepHedgehogDriven(Gear: PGear); @@ -64,15 +136,13 @@ end; if (Gear.Message and gm_Attack)<>0 then - if (Gear.State and (gstAttacked or gstHHChooseTarget) = 0)and(CurAmmoGear = nil) then + if (Gear.State and (gstAttacked or gstHHChooseTarget) = 0) then with PHedgehog(Gear.Hedgehog)^ do -// if ((Gear.State and gstFalling ) = 0)or((Ammo[CurSlot, CurAmmo].Propz and ammoprop_AttackInFall) <> 0) -// and((Gear.State and gstHHJumping) = 0)or((Ammo[CurSlot, CurAmmo].Propz and ammoprop_AttackInJump) <> 0) then begin Gear.State:= Gear.State or gstAttacking; - if Gear.Power = cMaxPower then ParseCommand('-attack') + if Gear.Power = cMaxPower then Gear.Message:= Gear.Message and not gm_Attack else begin - if (Ammo[CurSlot, CurAmmo].Propz and ammoprop_Power) = 0 then Gear.Power:= cMaxPower + if (Ammo[CurSlot, CurAmmo].Propz and ammoprop_Power) = 0 then Attack(Gear) else begin if Gear.Power = 0 then begin @@ -84,6 +154,7 @@ end; end else Gear.Message:= Gear.Message and not gm_Attack; +if ((Gear.State and gstAttacking) <> 0) and ((Gear.Message and gm_Attack) = 0) then Attack(Gear); if (Gear.State and gstFalling) <> 0 then begin diff -r 99888245a4e8 -r 78bff13b11c0 hedgewars/uConsole.pas --- a/hedgewars/uConsole.pas Tue Dec 27 10:20:55 2005 +0000 +++ b/hedgewars/uConsole.pas Wed Dec 28 22:18:11 2005 +0000 @@ -44,7 +44,6 @@ procedure WriteLnToConsole(s: shortstring); procedure KeyPressConsole(Key: Longword); procedure ParseCommand(CmdStr: shortstring); -procedure AfterAttack; // экспортируется только для вызова из CurrAmmoGear implementation {$J+} @@ -235,23 +234,6 @@ {$INCLUDE CCHandlers.inc} -procedure AfterAttack; -begin -with CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog].Gear^, - CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog] do - begin - Inc(AttacksNum); - State:= State and not gstAttacking; - if Ammo[CurSlot, CurAmmo].NumPerTurn >= AttacksNum then isInMultiShoot:= true - else begin - TurnTimeLeft:= Ammoz[Ammo[CurSlot, CurAmmo].AmmoType].TimeAfterTurn; - State:= State or gstAttacked; - OnUsedAmmo(Ammo) - end; - AttackBar:= 0 - end -end; - initialization InitConsole; RegisterVariable('quit' , vtCommand, @chQuit ); diff -r 99888245a4e8 -r 78bff13b11c0 hedgewars/uGame.pas --- a/hedgewars/uGame.pas Tue Dec 27 10:20:55 2005 +0000 +++ b/hedgewars/uGame.pas Wed Dec 28 22:18:11 2005 +0000 @@ -53,6 +53,7 @@ ProcessKbdDemo; end else begin + ProcessKbd; NetGetNextCmd; // на случай, если что-то сказано if SendEmptyPacketTicks >= cSendEmptyPacketTime then begin diff -r 99888245a4e8 -r 78bff13b11c0 hedgewars/uGears.pas --- a/hedgewars/uGears.pas Tue Dec 27 10:20:55 2005 +0000 +++ b/hedgewars/uGears.pas Wed Dec 28 22:18:11 2005 +0000 @@ -74,7 +74,7 @@ var CurAmmoGear: PGear = nil; implementation -uses uWorld, uMisc, uStore, uConsole, uSound, uTeams, uRandom, uCollisions, uLand; +uses uWorld, uMisc, uStore, uConsole, uSound, uTeams, uRandom, uCollisions, uLand, uIO; var GearsList: PGear = nil; RopePoints: record Count: Longword; @@ -90,6 +90,7 @@ procedure doMakeExplosion(X, Y, Radius: integer; Mask: LongWord); forward; function CheckGearNear(Gear: PGear; Kind: TGearType; rX, rY: integer): PGear; forward; procedure SpawnBoxOfSmth; forward; +procedure AfterAttack; forward; {$INCLUDE GSHandlers.inc} {$INCLUDE HHHandlers.inc} diff -r 99888245a4e8 -r 78bff13b11c0 hedgewars/uMisc.pas --- a/hedgewars/uMisc.pas Tue Dec 27 10:20:55 2005 +0000 +++ b/hedgewars/uMisc.pas Wed Dec 28 22:18:11 2005 +0000 @@ -70,7 +70,7 @@ cExplosionBorderColor : LongWord = $808080; cDrownSpeed : Real = 0.06; - cMaxWindSpeed : Real = 0.0003; + cMaxWindSpeed : Real = 0.0005; cWindSpeed : Real = 0.0001; cGravity : Real = 0.0005; diff -r 99888245a4e8 -r 78bff13b11c0 hedgewars/uTeams.pas --- a/hedgewars/uTeams.pas Tue Dec 27 10:20:55 2005 +0000 +++ b/hedgewars/uTeams.pas Wed Dec 28 22:18:11 2005 +0000 @@ -115,7 +115,7 @@ AttacksNum:= 0; with Gear^ do begin - State:= State or gstHHDriven; + State:= gstHHDriven; Active:= true end; FollowGear:= Gear