From 8625f42e304a56d48875ad1ce9e9d8ae09f1a238 Mon Sep 17 00:00:00 2001 From: vierkant Date: Wed, 9 Jun 2010 20:00:09 +0800 Subject: [PATCH 01/31] Dutch translation. Some small errors and the editor translations --- data/languages/dutch.txt | 204 +++++++++++++++++++-------------------- 1 file changed, 102 insertions(+), 102 deletions(-) diff --git a/data/languages/dutch.txt b/data/languages/dutch.txt index 6804423b9..bb1f7480f 100644 --- a/data/languages/dutch.txt +++ b/data/languages/dutch.txt @@ -75,7 +75,7 @@ Demos == Demos Disconnect -== Verbinding verbreken +== Stoppen Disconnected == Verbinding verbroken @@ -282,7 +282,7 @@ Players == Spelers Please balance teams! -== Balanceer teams +== Breng teams in balans! Prev. weapon == Vorig wapen @@ -405,7 +405,7 @@ Teeworlds %s is out! Download it at www.teeworlds.com! == Teeworld %s is uit! Download het op www.teeworlds.com! Texture Compression -== Tekst verkleinen +== Structuur verkleinen The server is running a non-standard tuning on a pure game type. == The server draait geen standaard spel type. @@ -461,310 +461,310 @@ Your skin ##### needs translation #### Open map -== Open map +== Open kaart Open == Open Save map -== Save map +== Sla kaart op Save -== Save +== Opslaan HD -== HD +== Det. [ctrl+h] Toggle High Detail -== [ctrl+h] Toggle High Detail +== [ctrl+h] Activeer Details Anim -== Anim +== Anim. [ctrl+m] Toggle animation -== [ctrl+m] Toggle animation +== [ctrl+m] Activeer animaties Proof -== Proof +== Test [ctrl+p] Toggles proof borders. These borders represent what a player maximum can see. -== [ctrl+p] Toggles proof borders. These borders represent what a player maximum can see. +== [ctrl+p] Test grenzen. Deze grenzen laten zien wat een speler maximaal kan zien. ZO == ZO [NumPad-] Zoom out -== [NumPad-] Zoom out +== [NumPad-] Uitzoomen [NumPad*] Zoom to normal and remove editor offset -== [NumPad*] Zoom to normal and remove editor offset +== [NumPad*] Zoom naar normaal en verwijder toevoegingen van de editor ZI == ZI [NumPad+] Zoom in -== [NumPad+] Zoom in +== [NumPad+] Inzoomen Increase animation speed -== Increase animation speed +== Vergroot animatie snelheid Normal animation speed -== Normal animation speed +== Normale animatie snelheid Decrease animation speed -== Decrease animation speed +== Verklein animatie snelheid [N] Flip brush horizontal -== [N] Flip brush horizontal +== [N] Draai kwast horizontaal [M] Flip brush vertical -== [M] Flip brush vertical +== [M] Draai kwast verticaal CCW == CCW [R] Rotates the brush counter clockwise -== [R] Rotates the brush counter clockwise +== [R] Draai de kwast tegen de klok in CW == CW [T] Rotates the brush clockwise -== [T] Rotates the brush clockwise +== [T] Draai de kwast met de klok mee Add Quad -== Add Quad +== Voeg Quad toe Adds a new quad -== Adds a new quad +== Voegt een nieuwe Quad toe Border -== Border +== Grens Left mouse button to move. Hold shift to move pivot. Hold ctrl to rotate. -== Left mouse button to move. Hold shift to move pivot. Hold ctrl to rotate. +== Linkermuisknop om te bewegen. Druk shift in om te roteren. Druk ctrl om te draaien. Left mouse button to move. Hold shift to move the texture. -== Left mouse button to move. Hold shift to move the texture. +== Linkermuisknop om te bewegen. Druk shift in om de textuur te bewegen Use left mouse button to drag and create a brush. -== Use left mouse button to drag and create a brush. +== Gebruik de linkermuisknop om de kwast te maken en te slepen. Use left mouse button to paint with the brush. Right button clears the brush. -== Use left mouse button to paint with the brush. Right button clears the brush. +== Gebruik de linkermuisknop om de kwast te gebruiken. Rechtermuisknop maakt de kwast schoon. Decrease -== Decrease +== Verkleinen Increase -== Increase +== Vergroten None -== None +== Geen Toggle group visibility -== Toggle group visibility +== Acitveer groepszichtbaarheid Select group. Right click for properties. -== Select group. Right click for properties. +== Kies een groep. Rechtermuisknop voor eigenschappen. Add group -== Add group +== Voeg groep toe Adds a new group -== Adds a new group +== Voegt een nieuwe groep toe Embed -== Embed +== Insluiten Embeds the image into the map file. -== Embeds the image into the map file. +== Sluit een afbeelding in in het bestand van de kaart Make external -== Make external +== Maak extern Removes the image from the map file. -== Removes the image from the map file. +== Verwijderd de afbeelding uit de kaart. Replace -== Replace +== Vervang Replaces the image with a new one -== Replaces the image with a new one +== Vervangt de afbeelding met een nieuwe Replace Image -== Replace Image +== Vervang afbeelding Remove -== Remove +== Verwijder Removes the image from the map -== Removes the image from the map +== Verwijderd de afbeelding uit de kaart Embedded -== Embedded +== Ingesloten External -== External +== Extern Select image -== Select image +== Selecteer afbeelding Load a new image to use in the map -== Load a new image to use in the map +== Laad een nieuwe afbeelding om te gebruiken in de kaart Add Image -== Add Image +== Voeg afbeelding toe Add -== Add +== Voeg toe Filename: -== Filename: +== Bestandsnaam: Cancel -== Cancel +== Annuleren Layers -== Layers +== Lagen Images -== Images +== Afbeeldingen Switch between images and layers managment. -== Switch between images and layers managment. +== Wissel tussen afbeeldinglaag en beheerlaag. Envelopes == Envelopes Toggles the envelope editor. -== Toggles the envelope editor. +== Activeer de envelope editor. %s Right click for context menu. -== %s Right click for context menu. +== %s Rechtermuisknop voor context menu. Color+ -== Color+ +== Kleur+ Creates a new color envelope -== Creates a new color envelope +== Maakt een nieuwe kleur envelope Pos.+ == Pos.+ Creates a new pos envelope -== Creates a new pos envelope +== Maakt een nieuwe pos envelope Previous Envelope -== Previous Envelope +== Vorige envelope Next Envelope -== Next Envelope +== Volgende envelope Name: -== Name: +== Naam: Press right mouse button to create a new point -== Press right mouse button to create a new point +== Rechtermuisknop om een nieuw punt te maken Switch curve type -== Switch curve type +== Wissel bocht type Left mouse to drag. Hold shift to alter time point aswell. Right click to delete. -== Left mouse to drag. Hold shift to alter time point aswell. Right click to delete. +== Linkermuisknop om te slepen. Druk shift in om het punt te veranderen. Rechtermuisknop om te verwijderen. New -== New +== Nieuw Creates a new map -== Creates a new map +== Maakt een nieuwe kaart. Opens a map for editing -== Opens a map for editing +== Opent een kaart om te bewerken Append -== Append +== Toevoegen Opens a map and adds everything from that map to the current one -== Opens a map and adds everything from that map to the current one +== Opent een kaart en voegt alles van die kaart toe aan de huidige Append map -== Append map +== Voeg kaart toe Saves the current map -== Saves the current map +== Sla huidige kaart op Save As -== Save As +== Opslaan als Saves the current map under a new name -== Saves the current map under a new name +== Sla de huidige kaart op onder een nieuwe naam Exits from the editor -== Exits from the editor +== Verlaat de editor Clear collision -== Clear collision +== Verwijder botsingen Removes collision from this layer -== Removes collision from this layer +== Verwijderd botsingen in deze laag Make collision -== Make collision +== Maak botsing Constructs collision from this layer -== Constructs collision from this layer +== Maakt botsing van deze laag Width -== Width +== Breedte Height -== Height +== Hoogte Image -== Image +== Afbeelding Delete group -== Delete group +== Verwijder groep Add quads layer -== Add quads layer +== Voeg quads laag toe Creates a new quad layer -== Creates a new quad layer +== Maakt een nieuwe quads laag Add tile layer -== Add tile layer +== Voeg tegel laag toe Creates a new tile layer -== Creates a new tile layer +== Maakt een nieuwe tegel laag Delete layer -== Delete Layer +== Verwijder laag Deletes the layer -== Deletes the layer +== Verwijdert de laag Group -== Group +== Groep Order -== Order +== Volgorde Detail == Detail Delete -== Delete +== Verwijder Deletes the current quad -== Deletes the current quad +== Verwijdert de huidige quad Square -== Square +== Vereffenen Squares the current quad -== Squares the current quad +== Vereffenen de huidige quad Pos. Env == Pos. Env @@ -773,18 +773,18 @@ Pos. TO == Pos. TO Color Env -== Color Env +== Kleur Env Color TO -== Color TO +== Kleur TO Select layer. Right click for properties. -== Select layer. Right click for properties. +== Selecteer laag. Rechtermuisknop voor eigenschappen. Toggle layer visibility -== Toggle layer visibility +== Activeer zichtbaarheid laag File -== File +== Bestand ##### old translations #### From be5e19d2bd3011128b12e8dfd4897b3514760941 Mon Sep 17 00:00:00 2001 From: xalduin Date: Mon, 7 Jun 2010 09:38:38 +0800 Subject: [PATCH 02/31] Fixed some compiler warnings --- src/engine/server/server.cpp | 4 ++-- src/game/client/components/menus_demo.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/engine/server/server.cpp b/src/engine/server/server.cpp index 620599c87..bd5bebe1b 100644 --- a/src/engine/server/server.cpp +++ b/src/engine/server/server.cpp @@ -554,9 +554,9 @@ void CServer::SendMap(int ClientId) { //get the name of the map without his path char * pMapShortName = &g_Config.m_SvMap[0]; - for(int i = 0; i < 128; i++) + for(int i = 0; i < 127; i++) { - if(g_Config.m_SvMap[i] == '/' || g_Config.m_SvMap[i] == '\\' && i+1 < 128) + if(g_Config.m_SvMap[i] == '/' || g_Config.m_SvMap[i] == '\\') pMapShortName = &g_Config.m_SvMap[i+1]; } diff --git a/src/game/client/components/menus_demo.cpp b/src/game/client/components/menus_demo.cpp index ec1ead8e3..fd0caf621 100644 --- a/src/game/client/components/menus_demo.cpp +++ b/src/game/client/components/menus_demo.cpp @@ -519,6 +519,6 @@ void CMenus::DemoSetParentDirectory() for(i = 0; i < 256; i++) { if(i >= Stop) - m_aCurrentDemoFolder[i] = NULL; + m_aCurrentDemoFolder[i] = 0; } } From 7fa21400d6739de935b2a13ceeefa32dbbb95986 Mon Sep 17 00:00:00 2001 From: xalduin Date: Tue, 8 Jun 2010 09:25:27 +0800 Subject: [PATCH 03/31] Mouse wheel no longer moves layer/image scrollbar --- src/game/editor/ed_editor.cpp | 26 -------------------------- 1 file changed, 26 deletions(-) diff --git a/src/game/editor/ed_editor.cpp b/src/game/editor/ed_editor.cpp index 63963dc27..cd596dc34 100644 --- a/src/game/editor/ed_editor.cpp +++ b/src/game/editor/ed_editor.cpp @@ -1655,19 +1655,6 @@ void CEditor::RenderLayers(CUIRect ToolBox, CUIRect ToolBar, CUIRect View) LayersBox.VSplitRight(3.0f, &LayersBox, 0); // extra spacing Scroll.HMargin(5.0f, &Scroll); s_ScrollValue = UiDoScrollbarV(&s_ScrollBar, &Scroll, s_ScrollValue); - - if(ScrollNum > 0) - { - if(Input()->KeyPresses(KEY_MOUSE_WHEEL_UP)) - s_ScrollValue -= 3.0f/ScrollNum; - if(Input()->KeyPresses(KEY_MOUSE_WHEEL_DOWN)) - s_ScrollValue += 3.0f/ScrollNum; - - if(s_ScrollValue < 0) s_ScrollValue = 0; - if(s_ScrollValue > 1) s_ScrollValue = 1; - } - else - ScrollNum = 0; } int LayerStartAt = (int)(ScrollNum*s_ScrollValue); @@ -1953,19 +1940,6 @@ void CEditor::RenderImages(CUIRect ToolBox, CUIRect ToolBar, CUIRect View) ToolBox.VSplitRight(3.0f, &ToolBox, 0); // extra spacing Scroll.HMargin(5.0f, &Scroll); s_ScrollValue = UiDoScrollbarV(&s_ScrollBar, &Scroll, s_ScrollValue); - - if(ScrollNum > 0) - { - if(Input()->KeyPresses(KEY_MOUSE_WHEEL_UP)) - s_ScrollValue -= 3.0f/ScrollNum; - if(Input()->KeyPresses(KEY_MOUSE_WHEEL_DOWN)) - s_ScrollValue += 3.0f/ScrollNum; - - if(s_ScrollValue < 0) s_ScrollValue = 0; - if(s_ScrollValue > 1) s_ScrollValue = 1; - } - else - ScrollNum = 0; } int ImageStartAt = (int)(ScrollNum*s_ScrollValue); From dc3feaf42cd8bcb22b04fdba17dc10caacc94fef Mon Sep 17 00:00:00 2001 From: xalduin Date: Thu, 10 Jun 2010 00:24:38 +0800 Subject: [PATCH 04/31] Fixed remaining compiler warnings for gcc on Linux --- src/engine/client/client.cpp | 11 ++++++----- src/engine/server/server.cpp | 11 ++++++----- src/engine/shared/demorec.cpp | 2 +- src/engine/shared/ringbuffer.cpp | 2 +- src/game/client/components/maplayers.cpp | 2 +- src/game/client/components/menus_demo.cpp | 2 +- src/game/server/entities/character.cpp | 16 ++++++++++++++-- 7 files changed, 30 insertions(+), 16 deletions(-) diff --git a/src/engine/client/client.cpp b/src/engine/client/client.cpp index 613a81376..881f06d83 100644 --- a/src/engine/client/client.cpp +++ b/src/engine/client/client.cpp @@ -1123,6 +1123,7 @@ void CClient::ProcessPacket(CNetChunk *pPacket) int DeltaSize; unsigned char aTmpBuffer2[CSnapshot::MAX_SIZE]; unsigned char aTmpBuffer3[CSnapshot::MAX_SIZE]; + CSnapshot *pTmpBuffer3 = (CSnapshot*)aTmpBuffer3; // Fix compiler warning for strict-aliasing int SnapSize; CompleteSize = (NumParts-1) * MAX_SNAPSHOT_PACKSIZE + PartSize; @@ -1169,19 +1170,19 @@ void CClient::ProcessPacket(CNetChunk *pPacket) // unpack delta PurgeTick = DeltaTick; - SnapSize = m_SnapshotDelta.UnpackDelta(pDeltaShot, (CSnapshot*)aTmpBuffer3, pDeltaData, DeltaSize); + SnapSize = m_SnapshotDelta.UnpackDelta(pDeltaShot, pTmpBuffer3, pDeltaData, DeltaSize); if(SnapSize < 0) { dbg_msg("client", "delta unpack failed!"); return; } - if(Msg != NETMSG_SNAPEMPTY && ((CSnapshot*)aTmpBuffer3)->Crc() != Crc) + if(Msg != NETMSG_SNAPEMPTY && pTmpBuffer3->Crc() != Crc) { if(g_Config.m_Debug) { dbg_msg("client", "snapshot crc error #%d - tick=%d wantedcrc=%d gotcrc=%d compressed_size=%d delta_tick=%d", - m_SnapCrcErrors, GameTick, Crc, ((CSnapshot*)aTmpBuffer3)->Crc(), CompleteSize, DeltaTick); + m_SnapCrcErrors, GameTick, Crc, pTmpBuffer3->Crc(), CompleteSize, DeltaTick); } m_SnapCrcErrors++; @@ -1209,13 +1210,13 @@ void CClient::ProcessPacket(CNetChunk *pPacket) m_SnapshotStorage.PurgeUntil(PurgeTick); // add new - m_SnapshotStorage.Add(GameTick, time_get(), SnapSize, (CSnapshot*)aTmpBuffer3, 1); + m_SnapshotStorage.Add(GameTick, time_get(), SnapSize, pTmpBuffer3, 1); // add snapshot to demo if(m_DemoRecorder.IsRecording()) { // write snapshot - m_DemoRecorder.RecordSnapshot(GameTick, aTmpBuffer3, SnapSize); + m_DemoRecorder.RecordSnapshot(GameTick, pTmpBuffer3, SnapSize); } // apply snapshot, cycle pointers diff --git a/src/engine/server/server.cpp b/src/engine/server/server.cpp index bd5bebe1b..7a26704c7 100644 --- a/src/engine/server/server.cpp +++ b/src/engine/server/server.cpp @@ -427,6 +427,7 @@ void CServer::DoSnapshot() { char aData[CSnapshot::MAX_SIZE]; + CSnapshot *pData = (CSnapshot*)aData; // Fix compiler warning for strict-aliasing char aDeltaData[CSnapshot::MAX_SIZE]; char aCompData[CSnapshot::MAX_SIZE]; int SnapshotSize; @@ -442,15 +443,15 @@ void CServer::DoSnapshot() GameServer()->OnSnap(i); // finish snapshot - SnapshotSize = m_SnapshotBuilder.Finish(aData); - Crc = ((CSnapshot*)aData)->Crc(); + SnapshotSize = m_SnapshotBuilder.Finish(pData); + Crc = pData->Crc(); // remove old snapshos // keep 3 seconds worth of snapshots m_aClients[i].m_Snapshots.PurgeUntil(m_CurrentGameTick-SERVER_TICK_SPEED*3); // save it the snapshot - m_aClients[i].m_Snapshots.Add(m_CurrentGameTick, time_get(), SnapshotSize, aData, 0); + m_aClients[i].m_Snapshots.Add(m_CurrentGameTick, time_get(), SnapshotSize, pData, 0); // find snapshot that we can preform delta against EmptySnap.Clear(); @@ -468,7 +469,7 @@ void CServer::DoSnapshot() } // create delta - DeltaSize = m_SnapshotDelta.CreateDelta(pDeltashot, (CSnapshot*)aData, aDeltaData); + DeltaSize = m_SnapshotDelta.CreateDelta(pDeltashot, pData, aDeltaData); if(DeltaSize) { @@ -554,7 +555,7 @@ void CServer::SendMap(int ClientId) { //get the name of the map without his path char * pMapShortName = &g_Config.m_SvMap[0]; - for(int i = 0; i < 127; i++) + for(int i = 0; i < str_length(g_Config.m_SvMap)-1; i++) { if(g_Config.m_SvMap[i] == '/' || g_Config.m_SvMap[i] == '\\') pMapShortName = &g_Config.m_SvMap[i+1]; diff --git a/src/engine/shared/demorec.cpp b/src/engine/shared/demorec.cpp index 48b06e9a7..6c2ba07dc 100644 --- a/src/engine/shared/demorec.cpp +++ b/src/engine/shared/demorec.cpp @@ -335,7 +335,7 @@ void CDemoPlayer::DoTick() static char aDecompressed[CSnapshot::MAX_SIZE]; static char aData[CSnapshot::MAX_SIZE]; int ChunkType, ChunkTick, ChunkSize; - int DataSize; + int DataSize = 0; int GotSnapshot = 0; // update ticks diff --git a/src/engine/shared/ringbuffer.cpp b/src/engine/shared/ringbuffer.cpp index 45a845ee1..b84db5a30 100644 --- a/src/engine/shared/ringbuffer.cpp +++ b/src/engine/shared/ringbuffer.cpp @@ -98,7 +98,7 @@ void *CRingBufferBase::Allocate(int Size) // okey, we have our block // split the block if needed - if(pBlock->m_Size > WantedSize+sizeof(CItem)) + if(pBlock->m_Size > WantedSize+(int)sizeof(CItem)) { CItem *pNewItem = (CItem *)((char *)pBlock + WantedSize); pNewItem->m_pPrev = pBlock; diff --git a/src/game/client/components/maplayers.cpp b/src/game/client/components/maplayers.cpp index 202ea2da6..62b32a1f2 100644 --- a/src/game/client/components/maplayers.cpp +++ b/src/game/client/components/maplayers.cpp @@ -42,7 +42,7 @@ void CMapLayers::EnvelopeEval(float TimeOffset, int Env, float *pChannels, void pChannels[2] = 0; pChannels[3] = 0; - CEnvPoint *pPoints; + CEnvPoint *pPoints = 0; { int Start, Num; diff --git a/src/game/client/components/menus_demo.cpp b/src/game/client/components/menus_demo.cpp index fd0caf621..784212cad 100644 --- a/src/game/client/components/menus_demo.cpp +++ b/src/game/client/components/menus_demo.cpp @@ -475,7 +475,7 @@ void CMenus::RenderDemoList(CUIRect MainView) str_copy(aTitleButton, "Open", sizeof(aTitleButton)); else str_copy(aTitleButton, "Play", sizeof(aTitleButton)); - // /!\ TODO: Add "Open" in Localization /!\ + //TODO: Add "Open" in Localization if(DoButton_Menu(&s_PlayButton, Localize(aTitleButton), 0, &PlayRect) || Activated) { if(s_SelectedItem >= 0 && s_SelectedItem < m_lDemos.size()) diff --git a/src/game/server/entities/character.cpp b/src/game/server/entities/character.cpp index 77d8f462d..81d1f85bb 100644 --- a/src/game/server/entities/character.cpp +++ b/src/game/server/entities/character.cpp @@ -585,14 +585,26 @@ void CCharacter::TickDefered() if(!StuckBefore && (StuckAfterMove || StuckAfterQuant)) { + // Hackish solution to get rid of strict-aliasing warning + union + { + float f; + unsigned u; + }StartPosX, StartPosY, StartVelX, StartVelY; + + StartPosX.f = StartPos.x; + StartPosY.f = StartPos.y; + StartVelX.f = StartVel.x; + StartVelY.f = StartVel.y; + dbg_msg("char_core", "STUCK!!! %d %d %d %f %f %f %f %x %x %x %x", StuckBefore, StuckAfterMove, StuckAfterQuant, StartPos.x, StartPos.y, StartVel.x, StartVel.y, - *((unsigned *)&StartPos.x), *((unsigned *)&StartPos.y), - *((unsigned *)&StartVel.x), *((unsigned *)&StartVel.y)); + StartPosX.u, StartPosY.u, + StartVelX.u, StartVelY.u); } int Events = m_Core.m_TriggeredEvents; From 6e1eaa96ec4d7e443a6967c80bda8acaf8002c7f Mon Sep 17 00:00:00 2001 From: xalduin Date: Thu, 10 Jun 2010 06:40:22 +0800 Subject: [PATCH 05/31] Fixed issue #115, text now fits into columns in server browser --- src/engine/client/text.cpp | 2 +- src/game/client/components/menus_browser.cpp | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/engine/client/text.cpp b/src/engine/client/text.cpp index 57e1b43b5..8fa8efeeb 100644 --- a/src/engine/client/text.cpp +++ b/src/engine/client/text.cpp @@ -681,7 +681,7 @@ public: Advance = pChr->m_AdvanceX + Kerning(pFont, Character, Nextcharacter)/Size; } - if(pCursor->m_Flags&TEXTFLAG_STOP_AT_END && DrawX+Advance*Size-pCursor->m_StartX > pCursor->m_LineWidth) + if(pCursor->m_Flags&TEXTFLAG_STOP_AT_END && DrawX+(Advance+pChr->m_Width)*Size-pCursor->m_StartX > pCursor->m_LineWidth) { // we hit the end of the line, no more to render or count pCurrent = pEnd; diff --git a/src/game/client/components/menus_browser.cpp b/src/game/client/components/menus_browser.cpp index 9b816f155..32243a2a9 100644 --- a/src/game/client/components/menus_browser.cpp +++ b/src/game/client/components/menus_browser.cpp @@ -309,7 +309,12 @@ void CMenus::RenderServerbrowserServerList(CUIRect View) TextRender()->TextEx(&Cursor, pItem->m_aName, -1); } else if(Id == COL_MAP) - UI()->DoLabel(&Button, pItem->m_aMap, 12.0f, -1); + { + CTextCursor Cursor; + TextRender()->SetCursor(&Cursor, Button.x, Button.y, 12.0f, TEXTFLAG_RENDER|TEXTFLAG_STOP_AT_END); + Cursor.m_LineWidth = Button.w; + TextRender()->TextEx(&Cursor, pItem->m_aMap, -1); + } else if(Id == COL_PLAYERS) { str_format(aTemp, sizeof(aTemp), "%i/%i", pItem->m_NumPlayers, pItem->m_MaxPlayers); @@ -332,7 +337,10 @@ void CMenus::RenderServerbrowserServerList(CUIRect View) } else if(Id == COL_GAMETYPE) { - UI()->DoLabel(&Button, pItem->m_aGameType, 12.0f, 0); + CTextCursor Cursor; + TextRender()->SetCursor(&Cursor, Button.x, Button.y, 12.0f, TEXTFLAG_RENDER|TEXTFLAG_STOP_AT_END); + Cursor.m_LineWidth = Button.w; + TextRender()->TextEx(&Cursor, pItem->m_aGameType, -1); } } From 22f11d6839599bc3fecd6b8e2b5394b58d6a7eda Mon Sep 17 00:00:00 2001 From: xalduin Date: Thu, 10 Jun 2010 07:09:51 +0800 Subject: [PATCH 06/31] Restore map focus on load map/new map --- src/game/editor/ed_editor.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/game/editor/ed_editor.cpp b/src/game/editor/ed_editor.cpp index cd596dc34..3a47b00aa 100644 --- a/src/game/editor/ed_editor.cpp +++ b/src/game/editor/ed_editor.cpp @@ -2839,6 +2839,19 @@ void CEditor::Reset(bool CreateDefault) m_SelectedPoints = 0; m_SelectedEnvelope = 0; m_SelectedImage = 0; + + m_WorldOffsetX = 0; + m_WorldOffsetY = 0; + m_EditorOffsetX = 0.0f; + m_EditorOffsetY = 0.0f; + + m_WorldZoom = 1.0f; + m_ZoomLevel = 200; + + m_MouseDeltaX = 0; + m_MouseDeltaY = 0; + m_MouseDeltaWx = 0; + m_MouseDeltaWy = 0; } void CEditorMap::MakeGameLayer(CLayer *pLayer) From 8e8cbdb562fd264fa52963a30b03016954268aa4 Mon Sep 17 00:00:00 2001 From: Choupom Date: Mon, 7 Jun 2010 17:27:16 +0800 Subject: [PATCH 07/31] fix for folders in demo browser --- src/base/system.c | 3 ++- src/game/client/components/menus.h | 1 - src/game/client/components/menus_demo.cpp | 15 +++++---------- 3 files changed, 7 insertions(+), 12 deletions(-) diff --git a/src/base/system.c b/src/base/system.c index a1a1b33e4..47893aa3d 100644 --- a/src/base/system.c +++ b/src/base/system.c @@ -863,7 +863,8 @@ int fs_listdir(const char *dir, FS_LISTDIR_CALLBACK cb, void *user) /* add all the entries */ do { - cb(finddata.cFileName, 0, user); + if(finddata.cFileName[0] != '.') + cb(finddata.cFileName, 0, user); } while (FindNextFileA(handle, &finddata)); FindClose(handle); diff --git a/src/game/client/components/menus.h b/src/game/client/components/menus.h index 229fce801..9ea9c6eff 100644 --- a/src/game/client/components/menus.h +++ b/src/game/client/components/menus.h @@ -165,7 +165,6 @@ class CMenus : public CComponent void DemolistPopulate(); static void DemolistCountCallback(const char *pName, int IsDir, void *pUser); static void DemolistFetchCallback(const char *pName, int IsDir, void *pUser); - static void IsDirCallback(const char *pName, int IsDir, void *pUser); void DemoSetParentDirectory(); // found in menus.cpp diff --git a/src/game/client/components/menus_demo.cpp b/src/game/client/components/menus_demo.cpp index 784212cad..272e28c8b 100644 --- a/src/game/client/components/menus_demo.cpp +++ b/src/game/client/components/menus_demo.cpp @@ -380,9 +380,9 @@ struct FETCH_CALLBACKINFO void CMenus::DemolistFetchCallback(const char *pName, int IsDir, void *pUser) { - if(IsDir || pName[0] == '.') + if(pName[0] == '.') return; - + FETCH_CALLBACKINFO *pInfo = (FETCH_CALLBACKINFO *)pUser; CDemoItem Item; @@ -391,11 +391,6 @@ void CMenus::DemolistFetchCallback(const char *pName, int IsDir, void *pUser) pInfo->m_pSelf->m_lDemos.add(Item); } -void CMenus::IsDirCallback(const char *pName, int IsDir, void *pUser) -{ - *((bool *)pUser) = true; -} - void CMenus::DemolistPopulate() { m_lDemos.clear(); @@ -413,7 +408,7 @@ void CMenus::DemolistPopulate() char aBuf[512]; str_format(aBuf, sizeof(aBuf), "%s/%s", Client()->UserDirectory(), m_aCurrentDemoFolder); - FETCH_CALLBACKINFO Info = {this, aBuf, 0}; + FETCH_CALLBACKINFO Info = {this, aBuf, m_aCurrentDemoFolder[6]}; //skip "demos/" fs_listdir(aBuf, DemolistFetchCallback, &Info); Info.m_pPrefix = m_aCurrentDemoFolder; fs_listdir(m_aCurrentDemoFolder, DemolistFetchCallback, &Info); @@ -459,8 +454,8 @@ void CMenus::RenderDemoList(CUIRect MainView) bool IsDir = false; if(!strncmp(m_lDemos[s_SelectedItem].m_aName, "..", 256)) //parent folder IsDir = true; - else - fs_listdir(m_lDemos[s_SelectedItem].m_aFilename, IsDirCallback, &IsDir); + else if(fs_is_dir(m_lDemos[s_SelectedItem].m_aFilename)) + IsDir = true; static int s_RefreshButton = 0; From f8b9f342d317a853606aeb6751cc3c6a56e9bdb2 Mon Sep 17 00:00:00 2001 From: Fujnky Date: Fri, 11 Jun 2010 04:26:39 +0800 Subject: [PATCH 08/31] Fix for l10n in menus_demo.cpp and sime german l10n tweaks. --- data/languages/german.txt | 4 ++-- src/game/client/components/menus_demo.cpp | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/data/languages/german.txt b/data/languages/german.txt index 8bea57238..81fca2697 100644 --- a/data/languages/german.txt +++ b/data/languages/german.txt @@ -260,7 +260,7 @@ Pistol == Pistole Play -== Spielen +== Abspielen Player == Spieler @@ -455,7 +455,7 @@ Sudden Death == Noch %ds error loading demo -== Fehler beim Laden der Demo, die Datei ist nicht gültig. +== Fehler beim Laden der Demo, die Datei ist ungültig. Error == Fehlgeschlagen diff --git a/src/game/client/components/menus_demo.cpp b/src/game/client/components/menus_demo.cpp index 272e28c8b..38ce76755 100644 --- a/src/game/client/components/menus_demo.cpp +++ b/src/game/client/components/menus_demo.cpp @@ -465,13 +465,13 @@ void CMenus::RenderDemoList(CUIRect MainView) } static int s_PlayButton = 0; - char aTitleButton[8]; + char aTitleButton[10]; if(IsDir) - str_copy(aTitleButton, "Open", sizeof(aTitleButton)); + str_copy(aTitleButton, Localize("Open"), sizeof(aTitleButton)); else - str_copy(aTitleButton, "Play", sizeof(aTitleButton)); - //TODO: Add "Open" in Localization - if(DoButton_Menu(&s_PlayButton, Localize(aTitleButton), 0, &PlayRect) || Activated) + str_copy(aTitleButton, Localize("Play"), sizeof(aTitleButton)); + + if(DoButton_Menu(&s_PlayButton, aTitleButton, 0, &PlayRect) || Activated) { if(s_SelectedItem >= 0 && s_SelectedItem < m_lDemos.size()) { @@ -491,7 +491,7 @@ void CMenus::RenderDemoList(CUIRect MainView) { const char *pError = Client()->DemoPlayer_Play(m_lDemos[s_SelectedItem].m_aFilename); if(pError) - PopupMessage(Localize("Error"), pError, Localize("Ok")); + PopupMessage(Localize("Error"), Localize(pError), Localize("Ok")); } } } From ec334a9d68c71ceb0ae83e7f24e1781545887326 Mon Sep 17 00:00:00 2001 From: oy Date: Fri, 11 Jun 2010 12:34:11 +0200 Subject: [PATCH 09/31] small cleanup --- src/game/client/components/menus_demo.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/game/client/components/menus_demo.cpp b/src/game/client/components/menus_demo.cpp index 38ce76755..f8cf8e4f3 100644 --- a/src/game/client/components/menus_demo.cpp +++ b/src/game/client/components/menus_demo.cpp @@ -1,5 +1,4 @@ -#include #include @@ -396,7 +395,7 @@ void CMenus::DemolistPopulate() m_lDemos.clear(); - if(strncmp(m_aCurrentDemoFolder, "demos", 256)) //add parent folder + if(str_comp_num(m_aCurrentDemoFolder, "demos", 256)) //add parent folder { CDemoItem Item; str_copy(Item.m_aName, "..", sizeof(Item.m_aName)); @@ -452,7 +451,7 @@ void CMenus::RenderDemoList(CUIRect MainView) bool IsDir = false; - if(!strncmp(m_lDemos[s_SelectedItem].m_aName, "..", 256)) //parent folder + if(!str_comp_num(m_lDemos[s_SelectedItem].m_aName, "..", 256)) //parent folder IsDir = true; else if(fs_is_dir(m_lDemos[s_SelectedItem].m_aFilename)) IsDir = true; @@ -475,7 +474,7 @@ void CMenus::RenderDemoList(CUIRect MainView) { if(s_SelectedItem >= 0 && s_SelectedItem < m_lDemos.size()) { - if(!strncmp(m_lDemos[s_SelectedItem].m_aName, "..", 256)) + if(!str_comp_num(m_lDemos[s_SelectedItem].m_aName, "..", 256)) { DemoSetParentDirectory(); DemolistPopulate(); From 39853bcf897c351ed392fb2f08215b1499e86906 Mon Sep 17 00:00:00 2001 From: oy Date: Fri, 11 Jun 2010 13:20:45 +0200 Subject: [PATCH 10/31] fixed walk animation if x-position is negative. Closes #119 --- src/game/client/components/players.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/client/components/players.cpp b/src/game/client/components/players.cpp index 8ad7b0cbb..ad7b3bcdc 100644 --- a/src/game/client/components/players.cpp +++ b/src/game/client/components/players.cpp @@ -319,7 +319,7 @@ void CPlayers::RenderPlayer( bool WantOtherDir = (Player.m_Direction == -1 && Vel.x > 0) || (Player.m_Direction == 1 && Vel.x < 0); // evaluate animation - float WalkTime = fmod(Position.x, 100.0f)/100.0f; + float WalkTime = fmod(absolute(Position.x), 100.0f)/100.0f; CAnimState State; State.Set(&g_pData->m_aAnimations[ANIM_BASE], 0); From d7c106ca900a3b9b808878bae1b4fe2021b703e0 Mon Sep 17 00:00:00 2001 From: oy Date: Fri, 11 Jun 2010 13:44:28 +0200 Subject: [PATCH 11/31] fixed border function in the editor. Closes #117 --- src/game/editor/ed_editor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/editor/ed_editor.cpp b/src/game/editor/ed_editor.cpp index 3a47b00aa..ac27a5c61 100644 --- a/src/game/editor/ed_editor.cpp +++ b/src/game/editor/ed_editor.cpp @@ -2925,7 +2925,7 @@ void CEditor::DoMapBorder() pT->m_pTiles[i].m_Index = 1; } - for(int i = ((pT->m_Width-2)*pT->m_Height); i < pT->m_Width*pT->m_Height; ++i) + for(int i = (pT->m_Width*(pT->m_Height-2)); i < pT->m_Width*pT->m_Height; ++i) pT->m_pTiles[i].m_Index = 1; } From a5bc567e84902d55fe1f2eec9df621d984a0d808 Mon Sep 17 00:00:00 2001 From: oy Date: Sun, 13 Jun 2010 19:34:14 +0200 Subject: [PATCH 12/31] fixed a server register issue --- src/engine/server/register.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/engine/server/register.cpp b/src/engine/server/register.cpp index 959b9288e..5e49f4990 100644 --- a/src/engine/server/register.cpp +++ b/src/engine/server/register.cpp @@ -231,6 +231,23 @@ void CRegister::RegisterUpdate() int CRegister::RegisterProcessPacket(CNetChunk *pPacket) { + // check for masterserver address + bool Valid = false; + NETADDR Addr1 = pPacket->m_Address; + Addr1.port = 0; + for(int i = 0; i < IMasterServer::MAX_MASTERSERVERS; i++) + { + NETADDR Addr2 = m_aMasterserverInfo[i].m_Addr; + Addr2.port = 0; + if(net_addr_comp(&Addr1, &Addr2) == 0) + { + Valid = true; + break; + } + } + if(!Valid) + return 0; + if(pPacket->m_DataSize == sizeof(SERVERBROWSE_FWCHECK) && mem_comp(pPacket->m_pData, SERVERBROWSE_FWCHECK, sizeof(SERVERBROWSE_FWCHECK)) == 0) { From ea64b0d7b361308d3b3737ecbac724856bfddda4 Mon Sep 17 00:00:00 2001 From: oy Date: Fri, 18 Jun 2010 20:32:52 +0200 Subject: [PATCH 13/31] made the console use the flagmask when looking for command (FindCommand) and removed double "No such command" console message --- src/engine/client/client.cpp | 2 +- src/engine/console.h | 4 ++-- src/engine/server/server.cpp | 2 +- src/engine/shared/console.cpp | 25 ++++++++++++++----------- src/engine/shared/console.h | 7 ++++--- src/game/client/components/console.cpp | 2 +- 6 files changed, 23 insertions(+), 19 deletions(-) diff --git a/src/engine/client/client.cpp b/src/engine/client/client.cpp index 881f06d83..eae5ef3ae 100644 --- a/src/engine/client/client.cpp +++ b/src/engine/client/client.cpp @@ -1964,7 +1964,7 @@ int main(int argc, const char **argv) // ignore_convention m_Client.RegisterInterfaces(); // create the components - IConsole *pConsole = CreateConsole(); + IConsole *pConsole = CreateConsole(CFGFLAG_CLIENT); IStorage *pStorage = CreateStorage("Teeworlds", argv[0]); // ignore_convention IConfig *pConfig = CreateConfig(); IEngineGraphics *pEngineGraphics = CreateEngineGraphics(); diff --git a/src/engine/console.h b/src/engine/console.h index 74d789e9e..34fa42725 100644 --- a/src/engine/console.h +++ b/src/engine/console.h @@ -37,7 +37,7 @@ public: typedef void (*FCommandCallback)(IResult *pResult, void *pUserData); typedef void (*FChainCommandCallback)(IResult *pResult, void *pUserData, FCommandCallback pfnCallback, void *pCallbackUserData); - virtual CCommandInfo *GetCommandInfo(const char *pName) = 0; + virtual CCommandInfo *GetCommandInfo(const char *pName, int FlagMask) = 0; virtual void PossibleCommands(const char *pStr, int FlagMask, FPossibleCallback pfnCallback, void *pUser) = 0; virtual void ParseArguments(int NumArgs, const char **ppArguments) = 0; @@ -53,6 +53,6 @@ public: virtual void Print(const char *pStr) = 0; }; -extern IConsole *CreateConsole(); +extern IConsole *CreateConsole(int FlagMask); #endif // FILE_ENGINE_CONSOLE_H diff --git a/src/engine/server/server.cpp b/src/engine/server/server.cpp index 7a26704c7..ea2815e7e 100644 --- a/src/engine/server/server.cpp +++ b/src/engine/server/server.cpp @@ -1391,7 +1391,7 @@ int main(int argc, const char **argv) // ignore_convention // create the components IEngineMap *pEngineMap = CreateEngineMap(); IGameServer *pGameServer = CreateGameServer(); - IConsole *pConsole = CreateConsole(); + IConsole *pConsole = CreateConsole(CFGFLAG_SERVER); IEngineMasterServer *pEngineMasterServer = CreateEngineMasterServer(); IStorage *pStorage = CreateStorage("Teeworlds", argv[0]); // ignore_convention IConfig *pConfig = CreateConfig(); diff --git a/src/engine/shared/console.cpp b/src/engine/shared/console.cpp index eacf9b78f..b7850bea2 100644 --- a/src/engine/shared/console.cpp +++ b/src/engine/shared/console.cpp @@ -210,7 +210,7 @@ void CConsole::ExecuteLineStroked(int Stroke, const char *pStr) if(ParseStart(&Result, pStr, (pEnd-pStr) + 1) != 0) return; - CCommand *pCommand = FindCommand(Result.m_pCommand); + CCommand *pCommand = FindCommand(Result.m_pCommand, m_FlagMask); if(pCommand) { @@ -234,7 +234,7 @@ void CConsole::ExecuteLineStroked(int Stroke, const char *pStr) pCommand->m_pfnCallback(&Result, pCommand->m_pUserData); } } - else + else if(Stroke) { char aBuf[256]; str_format(aBuf, sizeof(aBuf), "No such command: %s.", Result.m_pCommand); @@ -258,14 +258,16 @@ void CConsole::PossibleCommands(const char *pStr, int FlagMask, FPossibleCallbac } } -// TODO: this should regard the commands flag -CConsole::CCommand *CConsole::FindCommand(const char *pName) +CConsole::CCommand *CConsole::FindCommand(const char *pName, int FlagMask) { CCommand *pCommand; for (pCommand = m_pFirstCommand; pCommand; pCommand = pCommand->m_pNext) { - if(str_comp_nocase(pCommand->m_pName, pName) == 0) - return pCommand; + if(pCommand->m_Flags&FlagMask) + { + if(str_comp_nocase(pCommand->m_pName, pName) == 0) + return pCommand; + } } return 0x0; @@ -385,8 +387,9 @@ static void StrVariableCommand(IConsole::IResult *pResult, void *pUserData) } } -CConsole::CConsole() +CConsole::CConsole(int FlagMask) { + m_FlagMask = FlagMask; m_pFirstCommand = 0; m_pFirstExec = 0; m_pPrintCallbackUserdata = 0; @@ -459,7 +462,7 @@ void CConsole::Con_Chain(IResult *pResult, void *pUserData) void CConsole::Chain(const char *pName, FChainCommandCallback pfnChainFunc, void *pUser) { - CCommand *pCommand = FindCommand(pName); + CCommand *pCommand = FindCommand(pName, m_FlagMask); if(!pCommand) { @@ -481,10 +484,10 @@ void CConsole::Chain(const char *pName, FChainCommandCallback pfnChainFunc, void } -IConsole::CCommandInfo *CConsole::GetCommandInfo(const char *pName) +IConsole::CCommandInfo *CConsole::GetCommandInfo(const char *pName, int FlagMask) { - return FindCommand(pName); + return FindCommand(pName, FlagMask); } -extern IConsole *CreateConsole() { return new CConsole(); } +extern IConsole *CreateConsole(int FlagMask) { return new CConsole(FlagMask); } diff --git a/src/engine/shared/console.h b/src/engine/shared/console.h index 93d23547c..9064fa867 100644 --- a/src/engine/shared/console.h +++ b/src/engine/shared/console.h @@ -24,6 +24,7 @@ class CConsole : public IConsole void *m_pUserData; }; + int m_FlagMask; CCommand *m_pFirstCommand; class CExecFile @@ -74,12 +75,12 @@ class CConsole : public IConsole int ParseStart(CResult *pResult, const char *pString, int Length); int ParseArgs(CResult *pResult, const char *pFormat); - CCommand *FindCommand(const char *pName); + CCommand *FindCommand(const char *pName, int FlagMask); public: - CConsole(); + CConsole(int FlagMask); - virtual CCommandInfo *GetCommandInfo(const char *pName); + virtual CCommandInfo *GetCommandInfo(const char *pName, int FlagMask); virtual void PossibleCommands(const char *pStr, int FlagMask, FPossibleCallback pfnCallback, void *pUser) ; virtual void ParseArguments(int NumArgs, const char **ppArguments); diff --git a/src/game/client/components/console.cpp b/src/game/client/components/console.cpp index b323ab48e..9e09e6a2d 100644 --- a/src/game/client/components/console.cpp +++ b/src/game/client/components/console.cpp @@ -184,7 +184,7 @@ void CGameConsole::CInstance::OnInput(IInput::CEvent Event) aBuf[i] = *pSrc; aBuf[i] = 0; - m_pCommand = m_pGameConsole->m_pConsole->GetCommandInfo(aBuf); + m_pCommand = m_pGameConsole->m_pConsole->GetCommandInfo(aBuf, m_CompletionFlagmask); } } } From b790634a2dc273a506d3373a85e8b11ae9b043da Mon Sep 17 00:00:00 2001 From: oy Date: Sat, 19 Jun 2010 13:48:01 +0200 Subject: [PATCH 14/31] scroll the possible commands in the console's tab completion if the wanted one is out of sight. Closes #105 --- src/game/client/components/console.cpp | 14 +++++++++++++- src/game/client/components/console.h | 1 + 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/game/client/components/console.cpp b/src/game/client/components/console.cpp index 9e09e6a2d..2916606b4 100644 --- a/src/game/client/components/console.cpp +++ b/src/game/client/components/console.cpp @@ -51,6 +51,7 @@ CGameConsole::CInstance::CInstance(int Type) m_aCompletionBuffer[0] = 0; m_CompletionChosen = -1; + m_CompletionRenderOffset = 0.0f; m_pCommand = 0x0; } @@ -241,6 +242,8 @@ struct CRenderInfo const char *m_pCurrentCmd; int m_WantedCompletion; int m_EnumCount; + float m_Offset; + float m_Width; }; void CGameConsole::PossibleCommandsRenderCallback(const char *pStr, void *pUser) @@ -256,6 +259,12 @@ void CGameConsole::PossibleCommandsRenderCallback(const char *pStr, void *pUser) pInfo->m_pSelf->RenderTools()->DrawRoundRect(pInfo->m_Cursor.m_X-3, pInfo->m_Cursor.m_Y, tw+5, pInfo->m_Cursor.m_FontSize+4, pInfo->m_Cursor.m_FontSize/3); pInfo->m_pSelf->Graphics()->QuadsEnd(); + // scroll when out of sight + if(pInfo->m_Cursor.m_X < 3.0f) + pInfo->m_Offset = 0.0f; + else if(pInfo->m_Cursor.m_X+tw > pInfo->m_Width) + pInfo->m_Offset -= pInfo->m_Width/2; + pInfo->m_pSelf->TextRender()->TextColor(0.05f, 0.05f, 0.05f,1); pInfo->m_pSelf->TextRender()->TextEx(&pInfo->m_Cursor, pStr, -1); } @@ -386,8 +395,10 @@ void CGameConsole::OnRender() Info.m_pSelf = this; Info.m_WantedCompletion = pConsole->m_CompletionChosen; Info.m_EnumCount = 0; + Info.m_Offset = pConsole->m_CompletionRenderOffset; + Info.m_Width = Screen.w; Info.m_pCurrentCmd = pConsole->m_aCompletionBuffer; - TextRender()->SetCursor(&Info.m_Cursor, x, y+12.0f, FontSize, TEXTFLAG_RENDER); + TextRender()->SetCursor(&Info.m_Cursor, x+Info.m_Offset, y+12.0f, FontSize, TEXTFLAG_RENDER); const char *pPrompt = "> "; if(m_ConsoleType) @@ -438,6 +449,7 @@ void CGameConsole::OnRender() if(pConsole->m_Input.GetString()[0] != 0) { m_pConsole->PossibleCommands(pConsole->m_aCompletionBuffer, pConsole->m_CompletionFlagmask, PossibleCommandsRenderCallback, &Info); + pConsole->m_CompletionRenderOffset = Info.m_Offset; if(Info.m_EnumCount <= 0) { diff --git a/src/game/client/components/console.h b/src/game/client/components/console.h index d146307f7..6d6440016 100644 --- a/src/game/client/components/console.h +++ b/src/game/client/components/console.h @@ -24,6 +24,7 @@ class CGameConsole : public CComponent char m_aCompletionBuffer[128]; int m_CompletionChosen; int m_CompletionFlagmask; + float m_CompletionRenderOffset; IConsole::CCommandInfo *m_pCommand; From e2c3f744b2b12c63f3563c79471446ec508929ef Mon Sep 17 00:00:00 2001 From: oy Date: Sat, 19 Jun 2010 20:51:54 +0200 Subject: [PATCH 15/31] added commands to clear the consoles. Closes #104 --- src/game/client/components/console.cpp | 18 ++++++++++++++++++ src/game/client/components/console.h | 4 ++++ 2 files changed, 22 insertions(+) diff --git a/src/game/client/components/console.cpp b/src/game/client/components/console.cpp index 2916606b4..5ffe1efdd 100644 --- a/src/game/client/components/console.cpp +++ b/src/game/client/components/console.cpp @@ -61,6 +61,12 @@ void CGameConsole::CInstance::Init(CGameConsole *pGameConsole) m_pGameConsole = pGameConsole; }; +void CGameConsole::CInstance::ClearBacklog() +{ + m_Backlog.Init(); + m_BacklogActPage = 0; +} + void CGameConsole::CInstance::ExecuteLine(const char *pLine) { if(m_Type == 0) @@ -574,6 +580,16 @@ void CGameConsole::ConToggleRemoteConsole(IConsole::IResult *pResult, void *pUse ((CGameConsole *)pUserData)->Toggle(1); } +void CGameConsole::ConClearLocalConsole(IConsole::IResult *pResult, void *pUserData) +{ + ((CGameConsole *)pUserData)->m_LocalConsole.ClearBacklog(); +} + +void CGameConsole::ConClearRemoteConsole(IConsole::IResult *pResult, void *pUserData) +{ + ((CGameConsole *)pUserData)->m_RemoteConsole.ClearBacklog(); +} + void CGameConsole::ClientConsolePrintCallback(const char *pStr, void *pUserData) { ((CGameConsole *)pUserData)->m_LocalConsole.PrintLine(pStr); @@ -600,6 +616,8 @@ void CGameConsole::OnConsoleInit() Console()->Register("toggle_local_console", "", CFGFLAG_CLIENT, ConToggleLocalConsole, this, "Toggle local console"); Console()->Register("toggle_remote_console", "", CFGFLAG_CLIENT, ConToggleRemoteConsole, this, "Toggle remote console"); + Console()->Register("clear_local_console", "", CFGFLAG_CLIENT, ConClearLocalConsole, this, "Clear local console"); + Console()->Register("clear_remote_console", "", CFGFLAG_CLIENT, ConClearRemoteConsole, this, "Clear remote console"); } /* diff --git a/src/game/client/components/console.h b/src/game/client/components/console.h index 6d6440016..68f3965da 100644 --- a/src/game/client/components/console.h +++ b/src/game/client/components/console.h @@ -31,6 +31,8 @@ class CGameConsole : public CComponent CInstance(int t); void Init(CGameConsole *pGameConsole); + void ClearBacklog(); + void ExecuteLine(const char *pLine); void OnInput(IInput::CEvent Event); @@ -59,6 +61,8 @@ class CGameConsole : public CComponent static void ClientConsolePrintCallback(const char *pStr, void *pUserData); static void ConToggleLocalConsole(IConsole::IResult *pResult, void *pUserData); static void ConToggleRemoteConsole(IConsole::IResult *pResult, void *pUserData); + static void ConClearLocalConsole(IConsole::IResult *pResult, void *pUserData); + static void ConClearRemoteConsole(IConsole::IResult *pResult, void *pUserData); public: CGameConsole(); From a5113c6740e22e633a7fd7d853b81518762e4e21 Mon Sep 17 00:00:00 2001 From: oy Date: Sun, 20 Jun 2010 14:12:59 +0200 Subject: [PATCH 16/31] added commands to dump the output of the consoles into a file --- src/engine/shared/storage.cpp | 3 ++ src/game/client/components/console.cpp | 49 ++++++++++++++++++++++++++ src/game/client/components/console.h | 3 ++ 3 files changed, 55 insertions(+) diff --git a/src/engine/shared/storage.cpp b/src/engine/shared/storage.cpp index 491795ad1..1d0e2f781 100644 --- a/src/engine/shared/storage.cpp +++ b/src/engine/shared/storage.cpp @@ -30,6 +30,9 @@ public: str_format(aPath, sizeof(aPath), "%s/maps", m_aApplicationSavePath); fs_makedir(aPath); + str_format(aPath, sizeof(aPath), "%s/dumps", m_aApplicationSavePath); + fs_makedir(aPath); + str_format(aPath, sizeof(aPath), "%s/downloadedmaps", m_aApplicationSavePath); fs_makedir(aPath); diff --git a/src/game/client/components/console.cpp b/src/game/client/components/console.cpp index 5ffe1efdd..433ff4091 100644 --- a/src/game/client/components/console.cpp +++ b/src/game/client/components/console.cpp @@ -1,5 +1,6 @@ //#include "gc_console.h" #include +#include #include @@ -9,6 +10,7 @@ #include #include #include +#include #include #include @@ -570,6 +572,41 @@ void CGameConsole::Toggle(int Type) m_ConsoleType = Type; } +void CGameConsole::Dump(int Type) +{ + CInstance *pConsole = Type == 1 ? &m_RemoteConsole : &m_LocalConsole; + char aFilename[128]; + time_t Time; + char aDate[20]; + + time(&Time); + tm* TimeInfo = localtime(&Time); + strftime(aDate, sizeof(aDate), "%Y-%m-%d_%I-%M", TimeInfo); + + for(int i = 0; i < 10; i++) + { + IOHANDLE io; + str_format(aFilename, sizeof(aFilename), "dumps/%s_dump%s-%05d.txt", Type==1?"remote_console":"local_console", aDate, i); + io = Storage()->OpenFile(aFilename, IOFLAG_WRITE); + if(io) + { + #if defined(CONF_FAMILY_WINDOWS) + static const char Newline[] = "\r\n"; + #else + static const char Newline[] = "\n"; + #endif + + for(char *pEntry = pConsole->m_Backlog.First(); pEntry; pEntry = pConsole->m_Backlog.Next(pEntry)) + { + io_write(io, pEntry, str_length(pEntry)); + io_write(io, Newline, sizeof(Newline)-1); + } + io_close(io); + break; + } + } +} + void CGameConsole::ConToggleLocalConsole(IConsole::IResult *pResult, void *pUserData) { ((CGameConsole *)pUserData)->Toggle(0); @@ -590,6 +627,16 @@ void CGameConsole::ConClearRemoteConsole(IConsole::IResult *pResult, void *pUser ((CGameConsole *)pUserData)->m_RemoteConsole.ClearBacklog(); } +void CGameConsole::ConDumpLocalConsole(IConsole::IResult *pResult, void *pUserData) +{ + ((CGameConsole *)pUserData)->Dump(0); +} + +void CGameConsole::ConDumpRemoteConsole(IConsole::IResult *pResult, void *pUserData) +{ + ((CGameConsole *)pUserData)->Dump(1); +} + void CGameConsole::ClientConsolePrintCallback(const char *pStr, void *pUserData) { ((CGameConsole *)pUserData)->m_LocalConsole.PrintLine(pStr); @@ -618,6 +665,8 @@ void CGameConsole::OnConsoleInit() Console()->Register("toggle_remote_console", "", CFGFLAG_CLIENT, ConToggleRemoteConsole, this, "Toggle remote console"); Console()->Register("clear_local_console", "", CFGFLAG_CLIENT, ConClearLocalConsole, this, "Clear local console"); Console()->Register("clear_remote_console", "", CFGFLAG_CLIENT, ConClearRemoteConsole, this, "Clear remote console"); + Console()->Register("dump_local_console", "", CFGFLAG_CLIENT, ConDumpLocalConsole, this, "Dump local console"); + Console()->Register("dump_remote_console", "", CFGFLAG_CLIENT, ConDumpRemoteConsole, this, "Dump remote console"); } /* diff --git a/src/game/client/components/console.h b/src/game/client/components/console.h index 68f3965da..a4d227902 100644 --- a/src/game/client/components/console.h +++ b/src/game/client/components/console.h @@ -56,6 +56,7 @@ class CGameConsole : public CComponent float m_StateChangeDuration; void Toggle(int Type); + void Dump(int Type); static void PossibleCommandsRenderCallback(const char *pStr, void *pUser); static void ClientConsolePrintCallback(const char *pStr, void *pUserData); @@ -63,6 +64,8 @@ class CGameConsole : public CComponent static void ConToggleRemoteConsole(IConsole::IResult *pResult, void *pUserData); static void ConClearLocalConsole(IConsole::IResult *pResult, void *pUserData); static void ConClearRemoteConsole(IConsole::IResult *pResult, void *pUserData); + static void ConDumpLocalConsole(IConsole::IResult *pResult, void *pUserData); + static void ConDumpRemoteConsole(IConsole::IResult *pResult, void *pUserData); public: CGameConsole(); From 73bdf657c4417bcb76e52b80e63c75024d799751 Mon Sep 17 00:00:00 2001 From: oy Date: Sun, 20 Jun 2010 14:35:50 +0200 Subject: [PATCH 17/31] fixed suicide penalty after a restart. Closes #131 --- src/game/server/gamecontroller.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/game/server/gamecontroller.cpp b/src/game/server/gamecontroller.cpp index 5b7051d33..20ae867ae 100644 --- a/src/game/server/gamecontroller.cpp +++ b/src/game/server/gamecontroller.cpp @@ -286,6 +286,7 @@ void IGameController::PostReset() GameServer()->m_apPlayers[i]->Respawn(); GameServer()->m_apPlayers[i]->m_Score = 0; GameServer()->m_apPlayers[i]->m_ScoreStartTick = Server()->Tick(); + GameServer()->m_apPlayers[i]->m_RespawnTick = Server()->Tick()+Server()->TickSpeed()/2; } } } From 3475d2ae1b66b1f254ac56a25170448aa19447b1 Mon Sep 17 00:00:00 2001 From: oy Date: Sun, 20 Jun 2010 15:27:44 +0200 Subject: [PATCH 18/31] fixed freeze in the map editor GUI. Closes #138 --- src/game/editor/ed_editor.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/game/editor/ed_editor.cpp b/src/game/editor/ed_editor.cpp index ac27a5c61..4e879c64c 100644 --- a/src/game/editor/ed_editor.cpp +++ b/src/game/editor/ed_editor.cpp @@ -1393,6 +1393,15 @@ void CEditor::DoMapEditor(CUIRect View, CUIRect ToolBar) } } } + else if(UI()->ActiveItem() == s_pEditorId) + { + // release mouse + if(!UI()->MouseButton(0)) + { + s_Operation = OP_NONE; + UI()->SetActiveItem(0); + } + } if(GetSelectedGroup() && GetSelectedGroup()->m_UseClipping) { From c40bc9af3e51c98afe68e03a45ba83651bfa0ad0 Mon Sep 17 00:00:00 2001 From: oy Date: Mon, 21 Jun 2010 13:45:30 +0200 Subject: [PATCH 19/31] fixed a possible crash in the client console --- src/game/client/components/console.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/client/components/console.cpp b/src/game/client/components/console.cpp index 433ff4091..cb8c31ce2 100644 --- a/src/game/client/components/console.cpp +++ b/src/game/client/components/console.cpp @@ -189,7 +189,7 @@ void CGameConsole::CInstance::OnInput(IInput::CEvent Event) char aBuf[64] = {0}; const char *pSrc = GetString(); int i = 0; - for(; i < (int)sizeof(aBuf) && *pSrc && *pSrc != ' ' && *pSrc != ' '; i++, pSrc++) + for(; i < (int)sizeof(aBuf)-1 && *pSrc && *pSrc != ' '; i++, pSrc++) aBuf[i] = *pSrc; aBuf[i] = 0; From d01776bf3f4166797c1ce9145e47e3d21b7274c2 Mon Sep 17 00:00:00 2001 From: oy Date: Tue, 22 Jun 2010 01:15:12 +0200 Subject: [PATCH 20/31] auto-add background when creating new map. Closes #50 --- src/game/editor/ed_editor.cpp | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/game/editor/ed_editor.cpp b/src/game/editor/ed_editor.cpp index 4e879c64c..21ffe31fe 100644 --- a/src/game/editor/ed_editor.cpp +++ b/src/game/editor/ed_editor.cpp @@ -2891,6 +2891,28 @@ void CEditorMap::Clean() void CEditorMap::CreateDefault(int EntitiesTexture) { + // add background + CLayerGroup *pGroup = NewGroup(); + pGroup->m_ParallaxX = 0; + pGroup->m_ParallaxY = 0; + CLayerQuads *pLayer = new CLayerQuads; + pLayer->m_pEditor = m_pEditor; + CQuad *pQuad = pLayer->NewQuad(); + const int Width = 800000; + const int Height = 600000; + pQuad->m_aPoints[0].x = pQuad->m_aPoints[2].x = -Width; + pQuad->m_aPoints[1].x = pQuad->m_aPoints[3].x = Width; + pQuad->m_aPoints[0].y = pQuad->m_aPoints[1].y = -Height; + pQuad->m_aPoints[2].y = pQuad->m_aPoints[3].y = Height; + pQuad->m_aColors[0].r = pQuad->m_aColors[1].r = 94; + pQuad->m_aColors[0].g = pQuad->m_aColors[1].g = 132; + pQuad->m_aColors[0].b = pQuad->m_aColors[1].b = 174; + pQuad->m_aColors[2].r = pQuad->m_aColors[3].r = 204; + pQuad->m_aColors[2].g = pQuad->m_aColors[3].g = 232; + pQuad->m_aColors[2].b = pQuad->m_aColors[3].b = 255; + pGroup->AddLayer(pLayer); + + // add game layer MakeGameGroup(NewGroup()); MakeGameLayer(new CLayerGame(50, 50)); m_pGameGroup->AddLayer(m_pGameLayer); @@ -3028,4 +3050,4 @@ void CEditor::UpdateAndRender() Input()->ClearEvents(); } -IEditor *CreateEditor() { return new CEditor; } +IEditor *CreateEditor() { return new CEditor; } \ No newline at end of file From 62ffaa91422df95bf1e027d9b8da8cf1053256f8 Mon Sep 17 00:00:00 2001 From: oy Date: Tue, 22 Jun 2010 02:07:52 +0200 Subject: [PATCH 21/31] added a lost newline --- src/game/editor/ed_editor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/editor/ed_editor.cpp b/src/game/editor/ed_editor.cpp index 21ffe31fe..524770957 100644 --- a/src/game/editor/ed_editor.cpp +++ b/src/game/editor/ed_editor.cpp @@ -3050,4 +3050,4 @@ void CEditor::UpdateAndRender() Input()->ClearEvents(); } -IEditor *CreateEditor() { return new CEditor; } \ No newline at end of file +IEditor *CreateEditor() { return new CEditor; } From 6b713157a71a617b39734160d492e6b5ec56adab Mon Sep 17 00:00:00 2001 From: oy Date: Tue, 22 Jun 2010 14:15:52 +0200 Subject: [PATCH 22/31] added button to restore the map focus. Closes #116 --- src/game/editor/ed_editor.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/game/editor/ed_editor.cpp b/src/game/editor/ed_editor.cpp index 524770957..dbb5ffe87 100644 --- a/src/game/editor/ed_editor.cpp +++ b/src/game/editor/ed_editor.cpp @@ -773,6 +773,17 @@ void CEditor::DoToolbar(CUIRect ToolBar) DoMapBorder(); } } + + TB_Bottom.VSplitLeft(5.0f, 0, &TB_Bottom); + + // refocus button + TB_Bottom.VSplitLeft(50.0f, &Button, &TB_Bottom); + static int s_RefocusButton = 0; + if(DoButton_Editor(&s_RefocusButton, Localize("Refocus"), m_WorldOffsetX&&m_WorldOffsetY?0:-1, &Button, 0, Localize("[HOME] Restore map focus")) || Input()->KeyDown(KEY_HOME)) + { + m_WorldOffsetX = 0; + m_WorldOffsetY = 0; + } } static void Rotate(CPoint *pCenter, CPoint *pPoint, float Rotation) From c9828a22293d9959606c678b926ecac810e70b55 Mon Sep 17 00:00:00 2001 From: oy Date: Tue, 22 Jun 2010 21:27:58 +0200 Subject: [PATCH 23/31] fixed display bug in the score hud. Closes #106 --- src/game/client/components/hud.cpp | 79 +++++++++++++++--------------- 1 file changed, 40 insertions(+), 39 deletions(-) diff --git a/src/game/client/components/hud.cpp b/src/game/client/components/hud.cpp index a3ae5a4d8..73dfef534 100644 --- a/src/game/client/components/hud.cpp +++ b/src/game/client/components/hud.cpp @@ -71,57 +71,58 @@ void CHud::RenderScoreHud() // render small score hud if(!(m_pClient->m_Snap.m_pGameobj && m_pClient->m_Snap.m_pGameobj->m_GameOver) && (GameFlags&GAMEFLAG_TEAMS)) { + char aScoreTeam[2][32]; + str_format(aScoreTeam[0], sizeof(aScoreTeam)/2, "%d", m_pClient->m_Snap.m_pGameobj->m_TeamscoreRed); + str_format(aScoreTeam[1], sizeof(aScoreTeam)/2, "%d", m_pClient->m_Snap.m_pGameobj->m_TeamscoreBlue); + float aScoreTeamWidth[2] = {TextRender()->TextWidth(0, 14.0f, aScoreTeam[0], -1), TextRender()->TextWidth(0, 14.0f, aScoreTeam[1], -1)}; + float ScoreWidthMax = max(max(aScoreTeamWidth[0], aScoreTeamWidth[1]), TextRender()->TextWidth(0, 14.0f, "100", -1)); + float Split = 3.0f; + float ImageSize = GameFlags&GAMEFLAG_FLAGS ? 16.0f : Split; + for(int t = 0; t < 2; t++) { + // draw box Graphics()->BlendNormal(); Graphics()->TextureSet(-1); Graphics()->QuadsBegin(); if(t == 0) - Graphics()->SetColor(1,0,0,0.25f); + Graphics()->SetColor(1.0f, 0.0f, 0.0f, 0.25f); else - Graphics()->SetColor(0,0,1,0.25f); - RenderTools()->DrawRoundRect(Whole-45, 300-40-15+t*20, 50, 18, 5.0f); + Graphics()->SetColor(0.0f, 0.0f, 1.0f, 0.25f); + RenderTools()->DrawRoundRectExt(Whole-ScoreWidthMax-ImageSize-2*Split, 245.0f+t*20, ScoreWidthMax+ImageSize+2*Split, 18.0f, 5.0f, CUI::CORNER_L); Graphics()->QuadsEnd(); - char Buf[32]; - str_format(Buf, sizeof(Buf), "%d", t?m_pClient->m_Snap.m_pGameobj->m_TeamscoreBlue : m_pClient->m_Snap.m_pGameobj->m_TeamscoreRed); - float w = TextRender()->TextWidth(0, 14, Buf, -1); - - if(GameFlags&GAMEFLAG_FLAGS) - { - TextRender()->Text(0, Whole-20-w/2+5, 300-40-15+t*20, 14, Buf, -1); - if(m_pClient->m_Snap.m_paFlags[t]) - { - if(m_pClient->m_Snap.m_paFlags[t]->m_CarriedBy == -2 || (m_pClient->m_Snap.m_paFlags[t]->m_CarriedBy == -1 && ((Client()->GameTick()/10)&1))) - { - Graphics()->BlendNormal(); - Graphics()->TextureSet(g_pData->m_aImages[IMAGE_GAME].m_Id); - Graphics()->QuadsBegin(); + // draw score + TextRender()->Text(0, Whole-ScoreWidthMax+(ScoreWidthMax-aScoreTeamWidth[t])/2-Split, 245.0f+t*20, 14.0f, aScoreTeam[t], -1); - if(t == 0) RenderTools()->SelectSprite(SPRITE_FLAG_RED); - else RenderTools()->SelectSprite(SPRITE_FLAG_BLUE); - - float Size = 16; - IGraphics::CQuadItem QuadItem(Whole-40+2, 300-40-15+t*20+1, Size/2, Size); - Graphics()->QuadsDrawTL(&QuadItem, 1); - Graphics()->QuadsEnd(); - } - else if(m_pClient->m_Snap.m_paFlags[t]->m_CarriedBy >= 0) - { - int Id = m_pClient->m_Snap.m_paFlags[t]->m_CarriedBy%MAX_CLIENTS; - const char *pName = m_pClient->m_aClients[Id].m_aName; - float w = TextRender()->TextWidth(0, 10, pName, -1); - TextRender()->Text(0, Whole-40-7-w, 300-40-15+t*20+2, 10, pName, -1); - CTeeRenderInfo Info = m_pClient->m_aClients[Id].m_RenderInfo; - Info.m_Size = 18.0f; - - RenderTools()->RenderTee(CAnimState::GetIdle(), &Info, EMOTE_NORMAL, vec2(1,0), - vec2(Whole-40+5, 300-40-15+9+t*20+1)); - } + if(GameFlags&GAMEFLAG_FLAGS && m_pClient->m_Snap.m_paFlags[t]) + { + if(m_pClient->m_Snap.m_paFlags[t]->m_CarriedBy == -2 || (m_pClient->m_Snap.m_paFlags[t]->m_CarriedBy == -1 && ((Client()->GameTick()/10)&1))) + { + // draw flag + Graphics()->BlendNormal(); + Graphics()->TextureSet(g_pData->m_aImages[IMAGE_GAME].m_Id); + Graphics()->QuadsBegin(); + RenderTools()->SelectSprite(t==0?SPRITE_FLAG_RED:SPRITE_FLAG_BLUE); + IGraphics::CQuadItem QuadItem(Whole-ScoreWidthMax-ImageSize, 246.0f+t*20, ImageSize/2, ImageSize); + Graphics()->QuadsDrawTL(&QuadItem, 1); + Graphics()->QuadsEnd(); + } + else if(m_pClient->m_Snap.m_paFlags[t]->m_CarriedBy >= 0) + { + // draw name of the flag holder + int Id = m_pClient->m_Snap.m_paFlags[t]->m_CarriedBy%MAX_CLIENTS; + const char *pName = m_pClient->m_aClients[Id].m_aName; + float w = TextRender()->TextWidth(0, 10.0f, pName, -1); + TextRender()->Text(0, Whole-ScoreWidthMax-ImageSize-3*Split-w, 247.0f+t*20, 10.0f, pName, -1); + + // draw tee of the flag holder + CTeeRenderInfo Info = m_pClient->m_aClients[Id].m_RenderInfo; + Info.m_Size = 18.0f; + RenderTools()->RenderTee(CAnimState::GetIdle(), &Info, EMOTE_NORMAL, vec2(1,0), + vec2(Whole-ScoreWidthMax-Info.m_Size/2-Split, 246.0f+Info.m_Size/2+t*20)); } } - else - TextRender()->Text(0, Whole-20-w/2, 300-40-15+t*20, 14, Buf, -1); } } } From 822b002344b2da7fa6bc1565aa4ae8db0e801bae Mon Sep 17 00:00:00 2001 From: oy Date: Wed, 23 Jun 2010 20:09:15 +0200 Subject: [PATCH 24/31] fixed the ninja tip cut off and made its weapon and pickup sprite equal. Closes #127 --- datasrc/content.py | 4 ++-- src/game/client/components/items.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/datasrc/content.py b/datasrc/content.py index 2c353f24d..e510a19fd 100644 --- a/datasrc/content.py +++ b/datasrc/content.py @@ -305,7 +305,7 @@ container.sprites.Add(Sprite("weapon_hammer_body", set_game, 2,1,4,3)) container.sprites.Add(Sprite("weapon_hammer_cursor", set_game, 0,0,2,2)) container.sprites.Add(Sprite("weapon_hammer_proj", set_game, 0,0,0,0)) -container.sprites.Add(Sprite("weapon_ninja_body", set_game, 2,10,7,2)) +container.sprites.Add(Sprite("weapon_ninja_body", set_game, 2,10,8,2)) container.sprites.Add(Sprite("weapon_ninja_cursor", set_game, 0,10,2,2)) container.sprites.Add(Sprite("weapon_ninja_proj", set_game, 0,0,0,0)) @@ -323,7 +323,7 @@ container.sprites.Add(Sprite("weapon_ninja_muzzle3", set_game, 25,8,7,4)) container.sprites.Add(Sprite("pickup_health", set_game, 10,2,2,2)) container.sprites.Add(Sprite("pickup_armor", set_game, 12,2,2,2)) container.sprites.Add(Sprite("pickup_weapon", set_game, 3,0,6,2)) -container.sprites.Add(Sprite("pickup_ninja", set_game, 3,10,7,2)) +container.sprites.Add(Sprite("pickup_ninja", set_game, 2,10,8,2)) container.sprites.Add(Sprite("flag_blue", set_game, 12,8,4,8)) container.sprites.Add(Sprite("flag_red", set_game, 16,8,4,8)) diff --git a/src/game/client/components/items.cpp b/src/game/client/components/items.cpp index 70479e53e..b29bee990 100644 --- a/src/game/client/components/items.cpp +++ b/src/game/client/components/items.cpp @@ -104,7 +104,7 @@ void CItems::RenderPickup(const CNetObj_Pickup *pPrev, const CNetObj_Pickup *pCu { m_pClient->m_pEffects->PowerupShine(Pos, vec2(96,18)); Size *= 2.0f; - Pos.x += 10.0f; + Pos.x -= 10.0f; } } From 82f5a56d89005b94493f63ca1d00031d194966b6 Mon Sep 17 00:00:00 2001 From: oy Date: Fri, 25 Jun 2010 18:56:58 +0200 Subject: [PATCH 25/31] fixed crash in the map editor --- src/game/editor/ed_editor.cpp | 36 ++++++++++++++++++----------------- src/game/editor/ed_popups.cpp | 1 + 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/src/game/editor/ed_editor.cpp b/src/game/editor/ed_editor.cpp index dbb5ffe87..8e777218b 100644 --- a/src/game/editor/ed_editor.cpp +++ b/src/game/editor/ed_editor.cpp @@ -1328,24 +1328,26 @@ void CEditor::DoMapEditor(CUIRect View, CUIRect ToolBar) } CLayerGroup *g = GetSelectedGroup(); - m_Brush.m_OffsetX += g->m_OffsetX; - m_Brush.m_OffsetY += g->m_OffsetY; - m_Brush.m_ParallaxX = g->m_ParallaxX; - m_Brush.m_ParallaxY = g->m_ParallaxY; - m_Brush.Render(); - float w, h; - m_Brush.GetSize(&w, &h); - - IGraphics::CLineItem Array[4] = { - IGraphics::CLineItem(0, 0, w, 0), - IGraphics::CLineItem(w, 0, w, h), - IGraphics::CLineItem(w, h, 0, h), - IGraphics::CLineItem(0, h, 0, 0)}; - Graphics()->TextureSet(-1); - Graphics()->LinesBegin(); - Graphics()->LinesDraw(Array, 4); - Graphics()->LinesEnd(); + if(g) + { + m_Brush.m_OffsetX += g->m_OffsetX; + m_Brush.m_OffsetY += g->m_OffsetY; + m_Brush.m_ParallaxX = g->m_ParallaxX; + m_Brush.m_ParallaxY = g->m_ParallaxY; + m_Brush.Render(); + float w, h; + m_Brush.GetSize(&w, &h); + IGraphics::CLineItem Array[4] = { + IGraphics::CLineItem(0, 0, w, 0), + IGraphics::CLineItem(w, 0, w, h), + IGraphics::CLineItem(w, h, 0, h), + IGraphics::CLineItem(0, h, 0, 0)}; + Graphics()->TextureSet(-1); + Graphics()->LinesBegin(); + Graphics()->LinesDraw(Array, 4); + Graphics()->LinesEnd(); + } } } } diff --git a/src/game/editor/ed_popups.cpp b/src/game/editor/ed_popups.cpp index 5e833ba6e..08ec51cb6 100644 --- a/src/game/editor/ed_popups.cpp +++ b/src/game/editor/ed_popups.cpp @@ -84,6 +84,7 @@ int CEditor::PopupGroup(CEditor *pEditor, CUIRect View) pEditor->DoButton_Editor(&s_DeleteButton, Localize("Delete group"), 0, &Button, 0, Localize("Delete group"))) { pEditor->m_Map.DeleteGroup(pEditor->m_SelectedGroup); + pEditor->m_SelectedGroup = max(0, pEditor->m_SelectedGroup-1); return 1; } From ff3eda23ae7608bfc7e9e79bbcb1c9db571ebaa7 Mon Sep 17 00:00:00 2001 From: oy Date: Fri, 25 Jun 2010 19:41:55 +0200 Subject: [PATCH 26/31] automatically add the map extension when saving a map with the editor --- src/game/editor/ed_editor.cpp | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/game/editor/ed_editor.cpp b/src/game/editor/ed_editor.cpp index 8e777218b..da97ed61d 100644 --- a/src/game/editor/ed_editor.cpp +++ b/src/game/editor/ed_editor.cpp @@ -573,7 +573,21 @@ static void CallbackAppendMap(const char *pFileName, void *pUser) else pEditor->SortImages(); } -static void CallbackSaveMap(const char *pFileName, void *pUser){ if(((CEditor*)pUser)->Save(pFileName)) str_copy(((CEditor*)pUser)->m_aFileName, pFileName, 512); } +static void CallbackSaveMap(const char *pFileName, void *pUser) +{ + char aBuf[1024]; + const int Length = str_length(pFileName); + // add map extension + if(Length <= 4 || pFileName[Length-4] != '.' || str_comp_nocase(pFileName+Length-3, "map")) + { + str_format(aBuf, sizeof(aBuf), "%s.map", pFileName); + pFileName = aBuf; + } + + CEditor *pEditor = static_cast(pUser); + if(pEditor->Save(pFileName)) + str_copy(pEditor->m_aFileName, pFileName, sizeof(pEditor->m_aFileName)); +} void CEditor::DoToolbar(CUIRect ToolBar) { @@ -593,7 +607,7 @@ void CEditor::DoToolbar(CUIRect ToolBar) if(Input()->KeyDown('s') && (Input()->KeyPressed(KEY_LCTRL) || Input()->KeyPressed(KEY_RCTRL))) { if(m_aFileName[0]) - Save(m_aFileName); + CallbackSaveMap(m_aFileName, this); else InvokeFileDialog(IStorage::TYPE_SAVE, Localize("Save map"), Localize("Save"), "maps/", "", CallbackSaveMap, this); } @@ -2666,7 +2680,7 @@ int CEditor::PopupMenuFile(CEditor *pEditor, CUIRect View) if(pEditor->DoButton_MenuItem(&s_SaveButton, Localize("Save"), 0, &Slot, 0, Localize("Saves the current map"))) { if(pEditor->m_aFileName[0]) - pEditor->Save(pEditor->m_aFileName); + CallbackSaveMap(pEditor->m_aFileName, pEditor); else pEditor->InvokeFileDialog(IStorage::TYPE_SAVE, Localize("Save Map"), Localize("Save"), "maps/", "", CallbackSaveMap, pEditor); return 1; From 2a570196ef7dd66f475a3379b9cc5b6abf915e09 Mon Sep 17 00:00:00 2001 From: oy Date: Sat, 26 Jun 2010 17:53:32 +0200 Subject: [PATCH 27/31] check for case sensitive filename when trying to open a file for reading under windows. Closes #126 --- src/base/system.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/base/system.c b/src/base/system.c index 47893aa3d..457b761a9 100644 --- a/src/base/system.c +++ b/src/base/system.c @@ -262,7 +262,23 @@ int mem_check_imp() IOHANDLE io_open(const char *filename, int flags) { if(flags == IOFLAG_READ) + { + #if defined(CONF_FAMILY_WINDOWS) + // check for filename case sensitive + WIN32_FIND_DATA finddata; + HANDLE handle; + int length; + + length = str_length(filename); + if(!filename || !length || filename[length-1] == '\\') + return 0x0; + handle = FindFirstFile(filename, &finddata); + if(handle == INVALID_HANDLE_VALUE || str_comp(filename+length-str_length(finddata.cFileName), finddata.cFileName)) + return 0x0; + FindClose(handle); + #endif return (IOHANDLE)fopen(filename, "rb"); + } if(flags == IOFLAG_WRITE) return (IOHANDLE)fopen(filename, "wb"); return 0x0; From 9130c918419fdc1e29d66e53cd21b34ed05eabc7 Mon Sep 17 00:00:00 2001 From: oy Date: Sat, 26 Jun 2010 17:59:59 +0200 Subject: [PATCH 28/31] fixed entering a private server on a map change without password. Closes #142 --- src/engine/server/server.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/server/server.cpp b/src/engine/server/server.cpp index ea2815e7e..c45b2dd47 100644 --- a/src/engine/server/server.cpp +++ b/src/engine/server/server.cpp @@ -1067,7 +1067,7 @@ int CServer::Run() for(int c = 0; c < MAX_CLIENTS; c++) { - if(m_aClients[c].m_State == CClient::STATE_EMPTY) + if(m_aClients[c].m_State <= CClient::STATE_AUTH) continue; SendMap(c); From 29d29df4f043aecf7711e956da5076456241d68f Mon Sep 17 00:00:00 2001 From: oy Date: Sun, 27 Jun 2010 13:12:00 +0200 Subject: [PATCH 29/31] fixed screenshot bug. Closes #144 --- src/engine/client/graphics.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/engine/client/graphics.cpp b/src/engine/client/graphics.cpp index e2f4ae4cd..bf3f42eac 100644 --- a/src/engine/client/graphics.cpp +++ b/src/engine/client/graphics.cpp @@ -422,7 +422,11 @@ void CGraphics_OpenGL::ScreenshotDirect(const char *pFilename) int h = m_ScreenHeight; unsigned char *pPixelData = (unsigned char *)mem_alloc(w*(h+1)*3, 1); unsigned char *pTempRow = pPixelData+w*h*3; + GLint Alignment; + glGetIntegerv(GL_PACK_ALIGNMENT, &Alignment); + glPixelStorei(GL_PACK_ALIGNMENT, 1); glReadPixels(0,0, w, h, GL_RGB, GL_UNSIGNED_BYTE, pPixelData); + glPixelStorei(GL_PACK_ALIGNMENT, Alignment); // flip the pixel because opengl works from bottom left corner for(y = 0; y < h/2; y++) From 7325bdac42db7a19e6eeb3e4b2ede7dfe9d3a5a9 Mon Sep 17 00:00:00 2001 From: oy Date: Sun, 27 Jun 2010 13:24:47 +0200 Subject: [PATCH 30/31] don't consider sv_spectator_slots for team change when already in a team(red, blue). Closes #141 --- src/game/server/gamecontroller.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/server/gamecontroller.cpp b/src/game/server/gamecontroller.cpp index 20ae867ae..07f8bf86a 100644 --- a/src/game/server/gamecontroller.cpp +++ b/src/game/server/gamecontroller.cpp @@ -541,7 +541,7 @@ int IGameController::GetAutoTeam(int Notthisid) bool IGameController::CanJoinTeam(int Team, int Notthisid) { - if(Team == -1) + if(Team == -1 || (GameServer()->m_apPlayers[Notthisid] && GameServer()->m_apPlayers[Notthisid]->GetTeam() != -1)) return true; int aNumplayers[2] = {0,0}; From bd02c2043e9f76ec47ee9ac35caf23ae294b1dfa Mon Sep 17 00:00:00 2001 From: oy Date: Mon, 28 Jun 2010 15:12:43 +0200 Subject: [PATCH 31/31] fixed editor popups shown outside the screen --- src/game/editor/ed_popups.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/game/editor/ed_popups.cpp b/src/game/editor/ed_popups.cpp index 08ec51cb6..001a7249c 100644 --- a/src/game/editor/ed_popups.cpp +++ b/src/game/editor/ed_popups.cpp @@ -20,6 +20,10 @@ static int g_UiNumPopups = 0; void CEditor::UiInvokePopupMenu(void *Id, int Flags, float x, float y, float w, float h, int (*pfnFunc)(CEditor *pEditor, CUIRect Rect), void *pExtra) { dbg_msg("", "invoked"); + if(x + w > UI()->Screen()->w) + x -= w; + if(y + h > UI()->Screen()->h) + y -= h; s_UiPopups[g_UiNumPopups].m_pId = Id; s_UiPopups[g_UiNumPopups].m_IsMenu = Flags; s_UiPopups[g_UiNumPopups].m_Rect.x = x;