glob2-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[glob2-devel] New prestige system


From: David Kolf
Subject: [glob2-devel] New prestige system
Date: Fri, 23 Nov 2007 01:29:49 +0100
User-agent: IceDove 1.5.0.14pre (X11/20071020)

Hello!

I have started implementing the new prestige system I proposed in
http://globulation2.org/forums/viewtopic.php?t=225

The hg export is attached.

To do:
1) It has to be saved in game files. Can this be done without breaking
maps compatibility?
2) I would like to add hourglass graphics that change depending on how
much time has already passed and how close the end is.
3) There should be an option at the map selection screen which lets you
choose between no prestige, the fixed prestige and the dynamic prestige.

Best regards,

David
# HG changeset patch
# User David Kolf <address@hidden>
# Date 1195777216 -3600
# Branch master
# Node ID f55088748cb83fb2f145ccb9d714c71734ac815d
# Parent  db366a97c69c46b740870a2a8ff92d87e6b5f85a
The first step for a new dynamic prestige system

diff -r db366a97c69c -r f55088748cb8 src/Game.cpp
--- a/src/Game.cpp      Sun Oct 28 02:43:52 2007 +0100
+++ b/src/Game.cpp      Fri Nov 23 01:20:16 2007 +0100
@@ -111,7 +111,12 @@ void Game::init(GameGUI *gui, MapEdit* e
        mouseY=0;
 
        stepCounter=0;
+       prestigeMode = PRESTIGE_DYNAMIC;
        prestigeToReach=0;
+       prestigeLeaderTimeStamp = 0;
+       prestigeLeaderScore = 0;
+       prestigeLeader = 0;
+       prestigeTimeOut = 7500;
        
        for (int i=0; i<32; i++)
                ticksGameSum[i]=0;
@@ -140,6 +145,8 @@ void Game::clearGame()
        }
 
        ///Clears prestige      
+       prestigeLeaderScore = 0;
+       prestigeLeaderTimeStamp = 0;
        totalPrestige=0;
        totalPrestigeReached=false;
        isGameEnded=false;
@@ -1063,6 +1070,7 @@ void Game::wonSyncStep(void)
                totalPrestige=0;
                isGameEnded=false;
                int greatestPrestige=0;
+               int greatestPrestigeTeam=0;
                
                for (int i=0; i<mapHeader.getNumberOfTeams(); i++)
                {
@@ -1075,16 +1083,48 @@ void Game::wonSyncStep(void)
                        teams[i]->hasWon |= !isOtherAlive;
                        isGameEnded |= teams[i]->hasWon;
                        totalPrestige += teams[i]->prestige;
-                       if (greatestPrestige < teams[i]->prestige) 
greatestPrestige = teams[i]->prestige;
-               }
-       
-               if (totalPrestige >= prestigeToReach)
+                       if (greatestPrestige < teams[i]->prestige)
+                       {
+                               greatestPrestige = teams[i]->prestige;
+                               greatestPrestigeTeam = i;
+                       }
+                       if ((prestigeLeaderTimeStamp == 0) || (prestigeLeader 
!= i))
+                       {
+                               if (prestigeLeaderScore < teams[i]->prestige)
+                               {
+                                       prestigeLeaderTimeStamp = stepCounter;
+                                       prestigeLeaderScore = 
teams[i]->prestige;
+                                       prestigeLeader = greatestPrestigeTeam;
+                                       gui->addMessage (Color(255,0,255), "A 
new prestige record has been set! Time runs down!");
+                               }
+                               else if ((prestigeLeaderScore <= 
teams[i]->prestige) && prestigeLeaderTimeStamp != 0)
+                               {
+                                       prestigeLeaderTimeStamp = 0;
+                                       gui->addMessage (Color(255,0,255), "The 
prestige record has been broken.");
+                               }
+                       }
+                       else if (prestigeLeader == i)
+                       {
+                               prestigeLeaderScore = teams[i]->prestige;
+                       }
+               }
+       
+               if ((prestigeMode == PRESTIGE_FIXED) && (totalPrestige >= 
prestigeToReach))
                {
                        totalPrestigeReached=true;
                        isGameEnded=true;
        
                        for (int i=0; i<mapHeader.getNumberOfTeams(); i++)
                                teams[i]->hasWon = teams[i]->prestige == 
greatestPrestige;
+               }
+               else if ((prestigeMode == PRESTIGE_DYNAMIC) && (totalPrestige > 
0))
+               {
+                       if ((prestigeLeaderTimeStamp != 0) &&
+                               ((stepCounter - prestigeLeaderTimeStamp) >= 
prestigeTimeOut))
+                       {
+                               totalPrestigeReached = true;
+                               isGameEnded = true;
+                       }
                }
        }
 }
diff -r db366a97c69c -r f55088748cb8 src/Game.h
--- a/src/Game.h        Sun Oct 28 02:43:52 2007 +0100
+++ b/src/Game.h        Fri Nov 23 01:20:16 2007 +0100
@@ -212,8 +212,13 @@ public:
        Building *selectedBuilding;
        
        Uint32 stepCounter;
+       enum {PRESTIGE_NONE, PRESTIGE_FIXED, PRESTIGE_DYNAMIC} prestigeMode;
        int totalPrestige;
        int prestigeToReach;
+       int prestigeLeaderTimeStamp;
+       int prestigeLeaderScore;
+       int prestigeLeader;
+       int prestigeTimeOut;
        bool totalPrestigeReached;
        bool isGameEnded;
        
diff -r db366a97c69c -r f55088748cb8 src/GameGUI.cpp
--- a/src/GameGUI.cpp   Sun Oct 28 02:43:52 2007 +0100
+++ b/src/GameGUI.cpp   Fri Nov 23 01:20:16 2007 +0100
@@ -3289,8 +3289,23 @@ void GameGUI::drawTopScreenBar(void)
        }
 
        // draw prestige stats
-       globalContainer->gfx->drawString(dec+0, 0, globalContainer->littleFont, 
FormatableString("%0 / %1 / 
%2").arg(localTeam->prestige).arg(game.totalPrestige).arg(game.prestigeToReach).c_str());
-       
+       if (game.prestigeMode == Game::PRESTIGE_FIXED)
+       {
+               globalContainer->gfx->drawString(dec+0, 0, 
globalContainer->littleFont, FormatableString("%0 / %1 / 
%2").arg(localTeam->prestige).arg(game.totalPrestige).arg(game.prestigeToReach).c_str());
+       }
+       else if (game.prestigeMode == Game::PRESTIGE_DYNAMIC)
+       {
+
+               if (game.prestigeLeaderTimeStamp != 0)
+               {
+                       int prestigeBar = (game.stepCounter - 
game.prestigeLeaderTimeStamp) * 80 / game.prestigeTimeOut;
+                       if (prestigeBar > 80) prestigeBar = 80;
+                       globalContainer->gfx->drawFilledRect (dec+0, 0, 80, 14, 
0, 255, 0);
+                       globalContainer->gfx->drawFilledRect (dec+0, 0, 
prestigeBar, 14, 255, 0, 255);
+               }
+               globalContainer->gfx->drawString(dec+2, 0, 
globalContainer->littleFont, FormatableString("%0 / 
%1").arg(localTeam->prestige).arg(game.prestigeLeaderScore).c_str());
+       }
+
        dec += 90;
        
        // draw unit conversion stats

reply via email to

[Prev in Thread] Current Thread [Next in Thread]