# HG changeset patch # User unc0rr # Date 1136922798 0 # Node ID e297fea1a2f3546dab03056bceb7e67e84a4a04f # Parent 72ffe21f027c929283efec8f5d2214583bb0f7d1 - Removed dark pixels on the corners of health case - Cleaned up dynamite code - Dynamite sprite - Frontend shows error messages from engine (except IPC-related :) ) - changed IPC-related stuff in frontend diff -r 72ffe21f027c -r e297fea1a2f3 QTfrontend/game.cpp --- a/QTfrontend/game.cpp Mon Jan 09 20:33:12 2006 +0000 +++ b/QTfrontend/game.cpp Tue Jan 10 19:53:18 2006 +0000 @@ -60,7 +60,6 @@ IPCSocket = client; connect(client, SIGNAL(disconnected()), this, SLOT(ClientDisconnect())); connect(client, SIGNAL(readyRead()), this, SLOT(ClientRead())); - msgsize = 0; if (toSendBuf.size() > 0) SENDIPC("?"); } else @@ -105,9 +104,9 @@ SENDIPC("eadd hh4 1"); } -void HWGame::ParseMessage() +void HWGame::ParseMessage(const QByteArray & msg) { - switch(msgbuf[0]) + switch(msg.data()[1]) { case '?': { @@ -131,23 +130,31 @@ } break; } + case 'E': + { + QMessageBox::critical(0, + "Hedgewars: error message", + QString().append(msg.mid(2)).left(msg.size() - 6), + QMessageBox::Ok, + QMessageBox::NoButton, + QMessageBox::NoButton); + return; + } case '+': { if (gameType == gtNet) { - QByteArray tmpbuf = QByteArray::fromRawData((char *)&msgsize, 1) + QByteArray::fromRawData(msgbuf, msgsize); - emit SendNet(tmpbuf); + emit SendNet(msg); } break; } default: { - QByteArray tmpbuf = QByteArray::fromRawData((char *)&msgsize, 1) + QByteArray::fromRawData(msgbuf, msgsize); if (gameType == gtNet) { - emit SendNet(tmpbuf); + emit SendNet(msg); } - demo->append(tmpbuf); + demo->append(msg); } } } @@ -189,23 +196,15 @@ void HWGame::ClientRead() { - qint64 readbytes = 1; - while (readbytes > 0) + readbuffer.append(IPCSocket->readAll()); + quint8 msglen; + quint32 bufsize; + while (((bufsize = readbuffer.size()) > 0) && + ((msglen = readbuffer.data()[0]) < bufsize)) { - if (msgsize == 0) - { - msgbufsize = 0; - readbytes = IPCSocket->read((char *)&msgsize, 1); - } else - { - msgbufsize += - readbytes = IPCSocket->read((char *)&msgbuf[msgbufsize], msgsize - msgbufsize); - if (msgbufsize = msgsize) - { - ParseMessage(); - msgsize = 0; - } - } + QByteArray msg = readbuffer.left(msglen + 1); + readbuffer.remove(0, msglen + 1); + ParseMessage(msg); } } diff -r 72ffe21f027c -r e297fea1a2f3 QTfrontend/game.h --- a/QTfrontend/game.h Mon Jan 09 20:33:12 2006 +0000 +++ b/QTfrontend/game.h Tue Jan 10 19:53:18 2006 +0000 @@ -73,8 +73,7 @@ QTcpServer * IPCServer; QTcpSocket * IPCSocket; char msgbuf[MAXMSGCHARS]; - quint8 msgbufsize; - quint8 msgsize; + QByteArray readbuffer; QString teams[5]; QString seed; int TeamCount; @@ -89,7 +88,7 @@ void Start(); void SendConfig(); void SendTeamConfig(int index); - void ParseMessage(); + void ParseMessage(const QByteArray & msg); void SendIPC(const char * msg, quint8 len); void SendIPC(const QByteArray & buf); void RawSendIPC(const QByteArray & buf); diff -r 72ffe21f027c -r e297fea1a2f3 QTfrontend/hwform.cpp --- a/QTfrontend/hwform.cpp Mon Jan 09 20:33:12 2006 +0000 +++ b/QTfrontend/hwform.cpp Tue Jan 10 19:53:18 2006 +0000 @@ -107,7 +107,7 @@ { QMessageBox::critical(this, tr("Error"), - tr("Cannot create directory %s").arg("/.hedgewars"), + tr("Cannot create directory %1").arg("/.hedgewars"), tr("Quit")); return ; } @@ -275,7 +275,7 @@ { QMessageBox::critical(this, tr("Error"), - tr("Cannot save options to file %s").arg(settings.fileName()), + tr("Cannot save options to file %1").arg(settings.fileName()), tr("Quit")); return ; } diff -r 72ffe21f027c -r e297fea1a2f3 hedgewars/Data/Graphics/FirstAid.png Binary file hedgewars/Data/Graphics/FirstAid.png has changed diff -r 72ffe21f027c -r e297fea1a2f3 hedgewars/Data/Graphics/dynamite.png Binary file hedgewars/Data/Graphics/dynamite.png has changed diff -r 72ffe21f027c -r e297fea1a2f3 hedgewars/GSHandlers.inc --- a/hedgewars/GSHandlers.inc Mon Jan 09 20:33:12 2006 +0000 +++ b/hedgewars/GSHandlers.inc Tue Jan 10 19:53:18 2006 +0000 @@ -642,30 +642,16 @@ //////////////////////////////////////////////////////////////////////////////// procedure doStepDynamite(Gear: PGear); begin -if (Gear.dX <> 0) or (Gear.dY <> 0) {or not TestCollisionY(Gear, 1)} then +doStepFallingGear(Gear); +AllInactive:= false; +if Gear.Timer mod 166 = 0 then inc(Gear.Tag); +if Gear.Timer = 0 then begin - doStepFallingGear(Gear); - if Gear.Active = false then - begin - Gear.dX:= 0; - Gear.dY:= 0 - end; -// CalcRotationDirAngle(Gear); - AllInactive:= false + doMakeExplosion(round(Gear.X), round(Gear.Y), 85, EXPLAutoSound); + DeleteGear(Gear); + exit end; -//if ((Gear.State and gsttmpFlag) <> 0) then -// if ((Gear.State and gstAttacking) = 0) then - begin - // AllInactive:= true; - if (Gear.Timer and $FF) = 0 then PlaySound(sndMineTick); - if Gear.Timer = 0 then - begin - doMakeExplosion(round(Gear.X), round(Gear.Y), 85, EXPLAutoSound); - DeleteGear(Gear) - end; - dec(Gear.Timer); - end;{ else // gsttmpFlag = 0 - if TurnTimeLeft = 0 then Gear.State:= Gear.State or gsttmpFlag;} +dec(Gear.Timer); end; //////////////////////////////////////////////////////////////////////////////// diff -r 72ffe21f027c -r e297fea1a2f3 hedgewars/uConsts.pas --- a/hedgewars/uConsts.pas Mon Jan 09 20:33:12 2006 +0000 +++ b/hedgewars/uConsts.pas Tue Jan 10 19:53:18 2006 +0000 @@ -44,7 +44,7 @@ TSprite = (sprWater, sprCloud, sprBomb, sprBigDigit, sprFrame, sprLag, sprArrow, sprGrenade, sprTargetP, sprUFO, sprSmokeTrace, sprRopeHook, sprExplosion50, sprMineOff, - sprMineOn, sprCase, sprFAid); + sprMineOn, sprCase, sprFAid, sprDynamite); TGearType = (gtCloud, gtAmmo_Bomb, gtHedgehog, gtAmmo_Grenade, gtHealthTag, gtGrave, gtUFO, gtShotgunShot, gtActionTimer, gtPickHammer, gtRope, gtSmokeTrace, gtExplosion, gtMine, gtCase, gtDEagleShot, gtDynamite); @@ -69,7 +69,7 @@ resourcestring - errmsgCreateSurface = 'Error creating DirectDraw7 surface'; + errmsgCreateSurface = 'Error creating SDL surface'; errmsgNoDesc = 'Unknown error'; errmsgTransparentSet = 'Error setting transparent color'; errmsgUnknownCommand = 'Unknown command'; @@ -237,7 +237,8 @@ (FileName: 'MineOff.png'; Path: ptGraphics; Width: 16; Height: 16; hasAlpha: false),// sprMineOff (FileName: 'MineOn.png'; Path: ptGraphics; Width: 16; Height: 16; hasAlpha: false),// sprMineOn (FileName: 'Case.png'; Path: ptGraphics; Width: 32; Height: 32; hasAlpha: false),// sprCase - (FileName: 'FirstAid.png'; Path: ptGraphics; Width: 32; Height: 32; hasAlpha: false) // sprFAid + (FileName: 'FirstAid.png'; Path: ptGraphics; Width: 32; Height: 32; hasAlpha: false),// sprFAid + (FileName: 'dynamite.png'; Path: ptGraphics; Width: 32; Height: 32; hasAlpha: false) // sprDynamite ); Soundz: array[TSound] of record FileName: String[31]; diff -r 72ffe21f027c -r e297fea1a2f3 hedgewars/uGears.pas --- a/hedgewars/uGears.pas Mon Jan 09 20:33:12 2006 +0000 +++ b/hedgewars/uGears.pas Tue Jan 10 19:53:18 2006 +0000 @@ -493,11 +493,7 @@ gtMine: if ((Gear.State and gstAttacking) = 0)or((Gear.Timer and $3FF) < 420) then DrawSprite(sprMineOff , Round(Gear.X) - 8 + WorldDx, Round(Gear.Y) - 8 + WorldDy, trunc(Gear.DirAngle), Surface) else DrawSprite(sprMineOn , Round(Gear.X) - 8 + WorldDx, Round(Gear.Y) - 8 + WorldDy, trunc(Gear.DirAngle), Surface); - //!!! ACHTUNG!!!! - gtDynamite: if ((Gear.State and gstAttacking) = 0)or((Gear.Timer and $3FF) < 420) - then DrawSprite(sprMineOff , Round(Gear.X) - 8 + WorldDx, Round(Gear.Y) - 8 + WorldDy, trunc(Gear.DirAngle), Surface) - else DrawSprite(sprMineOn , Round(Gear.X) - 8 + WorldDx, Round(Gear.Y) - 8 + WorldDy, trunc(Gear.DirAngle), Surface); - //!!! ACHTUNG!!!! + gtDynamite: DrawSprite2(sprDynamite, Round(Gear.X) - 8 + WorldDx, Round(Gear.Y) - 8 + WorldDy, Gear.Tag and 1, Gear.Tag shr 1, Surface); gtCase: case Gear.Pos of posCaseAmmo : DrawSprite(sprCase, Round(Gear.X) - 16 + WorldDx, Round(Gear.Y) - 16 + WorldDy, 0, Surface); posCaseHealth: DrawSprite(sprFAid, Round(Gear.X) - 16 + WorldDx, Round(Gear.Y) - 16 + WorldDy, (GameTicks shr 6) and $F, Surface); @@ -660,7 +656,7 @@ var i, x, y, k: integer; b: boolean; begin -if CountGears(gtCase) > 2 then exit; +if (CountGears(gtCase) > 1) or (getrandom(3) <> 0) then exit; k:= 7; repeat x:= getrandom(2000) + 24; diff -r 72ffe21f027c -r e297fea1a2f3 hedgewars/uMisc.pas --- a/hedgewars/uMisc.pas Mon Jan 09 20:33:12 2006 +0000 +++ b/hedgewars/uMisc.pas Tue Jan 10 19:53:18 2006 +0000 @@ -111,7 +111,7 @@ TargetPoint: TPoint = (X: NoPointX; Y: 0); implementation -uses uConsole, uStore; +uses uConsole, uStore, uIO; {$IFDEF DEBUGFILE} var f: textfile; {$ENDIF} @@ -137,6 +137,7 @@ {$IFDEF DEBUGFILE}AddFileLog(Msg);{$ENDIF} if isFatalError then begin + SendIPC('E' + Msg); WriteLn(Msg); SDL_Quit; // Readln; diff -r 72ffe21f027c -r e297fea1a2f3 hedgewars/uStore.pas --- a/hedgewars/uStore.pas Mon Jan 09 20:33:12 2006 +0000 +++ b/hedgewars/uStore.pas Tue Jan 10 19:53:18 2006 +0000 @@ -47,6 +47,7 @@ procedure DrawGear(Stuff : TStuff; X, Y: integer; Surface: PSDL_Surface); procedure DrawSpriteFromRect(r: TSDL_Rect; X, Y, Height, Position: integer; Surface: PSDL_Surface); procedure DrawSprite (Sprite: TSprite; X, Y, Position: integer; Surface: PSDL_Surface); +procedure DrawSprite2(Sprite: TSprite; X, Y, FrameX, FrameY: integer; Surface: PSDL_Surface); procedure DrawLand (X, Y: integer; Surface: PSDL_Surface); procedure DXOutText(X, Y: Integer; Font: THWFont; s: string; Surface: PSDL_Surface); procedure DrawCaption(X, Y: integer; Rect: TSDL_Rect; Surface: PSDL_Surface; const fromTempSurf: boolean = false); @@ -531,7 +532,7 @@ rr.h:= r.h; if SDL_UpperBlit(SourceSurface, r, DestSurface, @rr) < 0 then begin - Writeln('Blit: ', SDL_GetError); + OutError('Blit: ' + SDL_GetError, true); exit end; end; @@ -558,6 +559,16 @@ DrawFromRect(X, Y, @r, SpritesData[Sprite].Surface, Surface) end; +procedure DrawSprite2(Sprite: TSprite; X, Y, FrameX, FrameY: integer; Surface: PSDL_Surface); +var r: TSDL_Rect; +begin +r.x:= FrameX * SpritesData[Sprite].Width; +r.w:= SpritesData[Sprite].Width; +r.y:= FrameY * SpritesData[Sprite].Height; +r.h:= SpritesData[Sprite].Height; +DrawFromRect(X, Y, @r, SpritesData[Sprite].Surface, Surface) +end; + procedure DXOutText(X, Y: Integer; Font: THWFont; s: string; Surface: PSDL_Surface); var clr: TSDL_Color; tmpsurf: PSDL_Surface;