aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Game/Code/Classes/UCore.pas25
-rw-r--r--Game/Code/Classes/UMain.pas31
-rw-r--r--Game/Code/Classes/UParty.pas994
-rw-r--r--Game/Code/Classes/UServices.pas2
-rw-r--r--Game/Code/Screens/UScreenPartyNewRound.pas46
-rw-r--r--Game/Code/Screens/UScreenPartyOptions.pas7
-rw-r--r--Game/Code/Screens/UScreenPartyPlayer.pas8
-rw-r--r--Game/Code/Screens/UScreenPartyScore.pas19
-rw-r--r--Game/Code/Screens/UScreenPartyWin.pas14
-rw-r--r--Game/Code/Screens/UScreenSong.pas23
-rw-r--r--Game/Code/Screens/UScreenSongMenu.pas10
-rw-r--r--Modis/SDK/UPartyDefs.pas27
12 files changed, 733 insertions, 473 deletions
diff --git a/Game/Code/Classes/UCore.pas b/Game/Code/Classes/UCore.pas
index e0f9fec2..5b144b45 100644
--- a/Game/Code/Classes/UCore.pas
+++ b/Game/Code/Classes/UCore.pas
@@ -47,6 +47,12 @@ type
Modules: Array [0..High(CORE_MODULES_TO_LOAD)] of TModuleListItem;
+ //Cur + Last Executed Setting and Getting ;)
+ iCurExecuted: Integer;
+ iLastExecuted: Integer;
+
+ Procedure SetCurExecuted(Value: Integer);
+
//Function Get all Modules and Creates them
Function GetModules: Boolean;
@@ -75,14 +81,14 @@ type
Hooks: THookManager; //Teh Hook Manager ;)
Services: TServiceManager;//The Service Manager
- CurExecuted: Integer; //ID of Plugin or Module curently Executed
-
Name: String; //Name of this Application
Version: LongWord; //Version of this ". For Info Look PluginDefs Functions
LastErrorReporter:String; //Who Reported the Last Error String
LastErrorString: String; //Last Error String reported
+ property CurExecuted: Integer read iCurExecuted write SetCurExecuted; //ID of Plugin or Module curently Executed
+ property LastExecuted: Integer read iLastExecuted;
//---------------
//Main Methods to control the Core:
@@ -124,7 +130,8 @@ Constructor TCore.Create(const cName: String; const cVersion: LongWord);
begin
Name := cName;
Version := cVersion;
- CurExecuted := 0;
+ iLastExecuted := 0;
+ iCurExecuted := 0;
LastErrorReporter := '';
LastErrorString := '';
@@ -498,4 +505,16 @@ begin
Result := hInstance;
end;
+//-------------
+// Called when setting CurExecuted
+//-------------
+Procedure TCore.SetCurExecuted(Value: Integer);
+begin
+ //Set Last Executed
+ iLastExecuted := iCurExecuted;
+
+ //Set Cur Executed
+ iCurExecuted := Value;
+end;
+
end.
diff --git a/Game/Code/Classes/UMain.pas b/Game/Code/Classes/UMain.pas
index 48928cbd..b1469f00 100644
--- a/Game/Code/Classes/UMain.pas
+++ b/Game/Code/Classes/UMain.pas
@@ -38,6 +38,11 @@ type
TPlayer = record
Name: string;
+ //Index in Teaminfo record
+ TeamID: Byte;
+ PlayerID: Byte;
+
+ //Scores
Score: real;
ScoreLine: real;
ScoreGolden: real;
@@ -51,26 +56,6 @@ type
//LineBonus Mod
ScoreLast: Real;//Last Line Score
- {ScorePercent: integer;//Aktual Fillstate of the SingBar
- ScorePercentTarget: integer;//Target Fillstate of the SingBar
- //end Singbar Mod
-
- //PhrasenBonus - Line Bonus Mod
- LineBonus_PosX: Single;
- LineBonus_PosY: Single;
- LineBonus_Alpha: Single;
- LineBonus_Visible: boolean;
- LineBonus_Text: string;
- LineBonus_Color: TRGB;
- LineBonus_Age: Integer;
- LineBonus_Rating: Integer;
- //Variable vor Positioning -> Set on ScreenShow, different when Playercount Changes
- LineBonus_TargetX: integer;
- LineBonus_TargetY: integer;
- LineBonus_StartX: integer;
- LineBonus_StartY: integer;
- //PhrasenBonus - Line Bonus Mod End }
-
//PerfectLineTwinkle Mod (effect)
LastSentencePerfect: Boolean;
@@ -316,13 +301,13 @@ begin
Log.BenchmarkEnd(1);
Log.LogBenchmark('Loading PluginManager', 1);
- // Party Mode Manager
+ {// Party Mode Manager
Log.BenchmarkStart(1);
Log.LogStatus('PartySession Manager', 'Initialization');
- PartySession := TParty_Session.Create; //Load PartySession
+ PartySession := TPartySession.Create; //Load PartySession
Log.BenchmarkEnd(1);
- Log.LogBenchmark('Loading PartySession Manager', 1);
+ Log.LogBenchmark('Loading PartySession Manager', 1); }
// Sound
Log.BenchmarkStart(1);
diff --git a/Game/Code/Classes/UParty.pas b/Game/Code/Classes/UParty.pas
index 36a40858..1db8f3e1 100644
--- a/Game/Code/Classes/UParty.pas
+++ b/Game/Code/Classes/UParty.pas
@@ -1,381 +1,613 @@
-unit UParty;
-
-interface
-
-{$IFDEF FPC}
- {$MODE Delphi}
-{$ENDIF}
-
-
-{$I switches.inc}
-
-uses ModiSDK;
-
-type
- TRoundInfo = record
- Plugin: Word;
- Winner: Byte;
- end;
-
- TeamOrderEntry = record
- Teamnum: Byte;
- Score: Byte;
- end;
-
- TeamOrderArray = Array[0..5] of Byte;
-
- TParty_Session = class
- private
- function GetRandomPlayer(Team: Byte): Byte;
- function IsWinner(Player, Winner: Byte): boolean;
- procedure GenScores;
- public
- Teams: TTeamInfo;
- Rounds: array of TRoundInfo;
- CurRound: Byte;
-
- constructor Create;
-
- procedure StartNewParty(NumRounds: Byte);
- procedure StartRound;
- procedure EndRound;
- function GetTeamOrder: TeamOrderArray;
- function GetWinnerString(Round: Byte): String;
- end;
-
-var
- PartySession: TParty_Session;
-
-implementation
-
-uses UDLLManager, UGraphic, UMain, ULanguage, ULog;
-
-//----------
-//Constructor - Prepares the Class
-//----------
-constructor TParty_Session.Create;
-begin
-// - Nothing in here atm
-end;
-
-//----------
-//StartNewParty - Clears the Class and Prepares for new Party
-//----------
-procedure TParty_Session.StartNewParty(NumRounds: Byte);
-var
- Plugins: Array of record
- ID: Byte;
- TimesPlayed: Byte;
- end;
- TeamMode: Boolean;
- Len: Integer;
- I, J: Integer;
-
- function GetRandomPlugin: Byte;
- var
- LowestTP: Byte;
- NumPwithLTP: Word;
- I: Integer;
- R: Word;
- begin
- LowestTP := high(Byte);
- NumPwithLTP := 0;
-
- //Search for Plugins not often played yet
- For I := 0 to high(Plugins) do
- begin
- if (Plugins[I].TimesPlayed < lowestTP) then
- begin
- lowestTP := Plugins[I].TimesPlayed;
- NumPwithLTP := 1;
- end
- else if (Plugins[I].TimesPlayed = lowestTP) then
- begin
- Inc(NumPwithLTP);
- end;
- end;
-
- //Create Random No
- R := Random(NumPwithLTP);
-
- //Search for Random Plugin
- For I := 0 to high(Plugins) do
- begin
- if Plugins[I].TimesPlayed = lowestTP then
- begin
- //Plugin Found
- if (R = 0) then
- begin
- Result := Plugins[I].ID;
- Inc(Plugins[I].TimesPlayed);
- Break;
- end;
-
- Dec(R);
- end;
- end;
- end;
-begin
- //Set cur Round to Round 1
- CurRound := 255;
-
- PlayersPlay := Teams.NumTeams;
-
- //Get Teammode and Set Joker, also set TimesPlayed
- TeamMode := True;
- For I := 0 to Teams.NumTeams-1 do
- begin
- if Teams.Teaminfo[I].NumPlayers < 2 then
- begin
- TeamMode := False;
- end;
- //Set Player Attributes
- For J := 0 to Teams.TeamInfo[I].NumPlayers-1 do
- begin
- Teams.TeamInfo[I].Playerinfo[J].TimesPlayed := 0;
- end;
- Teams.Teaminfo[I].Joker := Round(NumRounds*0.7);
- Teams.Teaminfo[I].Score := 0;
- end;
-
- //Fill Plugin Array
- SetLength(Plugins, 0);
- For I := 0 to high(DLLMan.Plugins) do
- begin
- if TeamMode or (Not DLLMan.Plugins[I].TeamModeOnly) then
- begin //Add only Plugins Playable with cur. PlayerConfiguration
- Len := Length(Plugins);
- SetLength(Plugins, Len + 1);
- Plugins[Len].ID := I;
- Plugins[Len].TimesPlayed := 0;
- end;
- end;
-
- //Set Rounds
- If (Length(Plugins) >= 1) then
- begin
- SetLength (Rounds, NumRounds);
- For I := 0 to NumRounds-1 do
- begin
- PartySession.Rounds[I].Plugin := GetRandomPlugin;
- PartySession.Rounds[I].Winner := 255;
- end;
- end
- else SetLength (Rounds, 0);
-end;
-
-//----------
-//GetRandomPlayer - Gives back a Random Player to Play next Round
-//----------
-function TParty_Session.GetRandomPlayer(Team: Byte): Byte;
-var
- I, R: Integer;
- lowestTP: Byte;
- NumPwithLTP: Byte;
-begin
- LowestTP := high(Byte);
- NumPwithLTP := 0;
- Result := 0;
-
- //Search for Players that have not often played yet
- For I := 0 to Teams.Teaminfo[Team].NumPlayers-1 do
- begin
- if (Teams.Teaminfo[Team].Playerinfo[I].TimesPlayed < lowestTP) then
- begin
- lowestTP := Teams.Teaminfo[Team].Playerinfo[I].TimesPlayed;
- NumPwithLTP := 1;
- end
- else if (Teams.Teaminfo[Team].Playerinfo[I].TimesPlayed = lowestTP) then
- begin
- Inc(NumPwithLTP);
- end;
- end;
-
- //Create Random No
- R := Random(NumPwithLTP);
-
- //Search for Random Player
- For I := 0 to Teams.Teaminfo[Team].NumPlayers-1 do
- begin
- if Teams.Teaminfo[Team].Playerinfo[I].TimesPlayed = lowestTP then
- begin
- //Player Found
- if (R = 0) then
- begin
- Result := I;
- Break;
- end;
-
- Dec(R);
- end;
- end;
- {//Get lowest TimesPlayed
- lowestTP := high(Byte);
- J := -1;
- for I := 0 to Teams.Teaminfo[Team].NumPlayers-1 do
- begin
- if (Teams.Teaminfo[Team].Playerinfo[I].TimesPlayed < lowestTP) then
- begin
- lowestTP := Teams.Teaminfo[Team].Playerinfo[I].TimesPlayed;
- J := I;
- end
- else if (Teams.Teaminfo[Team].Playerinfo[I].TimesPlayed = lowestTP) then
- begin
- J := -1;
- end;
- end;
-
- //If more than one Person has lowestTP then Select Random Player
- if (J < 0) then
- repeat
- Result := Random(Teams.Teaminfo[Team].NumPlayers);
- until (Teams.Teaminfo[Team].Playerinfo[Result].TimesPlayed = lowestTP)
- else //Else Select the one with lowest TP
- Result:= J;}
-end;
-
-//----------
-//StartNextRound - Prepares ScreenSingModi for Next Round And Load Plugin
-//----------
-procedure TParty_Session.StartRound;
-var
- I: Integer;
-begin
- if ((CurRound < high(Rounds)) OR (CurRound = high(CurRound))) then
- begin
- //Increase Current Round
- Inc (CurRound);
-
- Rounds[CurRound].Winner := 255;
- DllMan.LoadPlugin(Rounds[CurRound].Plugin);
-
- //Select Players
- for I := 0 to Teams.NumTeams-1 do
- Teams.Teaminfo[I].CurPlayer := GetRandomPlayer(I);
-
- //Set ScreenSingModie Variables
- ScreenSingModi.TeamInfo := Teams;
-
- //Set
- end;
-end;
-
-//----------
-//IsWinner - Returns True if the Players Bit is set in the Winner Byte
-//----------
-function TParty_Session.IsWinner(Player, Winner: Byte): boolean;
-var
- Bit: Byte;
-begin
- Case Player of
- 0: Bit := 1;
- 1: Bit := 2;
- 2: Bit := 4;
- 3: Bit := 8;
- 4: Bit := 16;
- 5: Bit := 32;
- end;
-
- Result := ((Winner AND Bit) = Bit);
-end;
-
-//----------
-//GenScores - Inc Scores for Cur. Round
-//----------
-procedure TParty_Session.GenScores;
-var
- I: Byte;
-begin
- for I := 0 to Teams.NumTeams-1 do
- begin
- if isWinner(I, Rounds[CurRound].Winner) then
- Inc(Teams.Teaminfo[I].Score);
- end;
-end;
-
-//----------
-//GetWinnerString - Get String with WinnerTeam Name, when there is more than one Winner than Connect with and or ,
-//----------
-function TParty_Session.GetWinnerString(Round: Byte): String;
-var
- Winners: Array of String;
- I: Integer;
-begin
- Result := Language.Translate('PARTY_NOBODY');
-
- if (Round > High(Rounds)) then
- exit;
-
- if (Rounds[Round].Winner = 0) then
- begin
- exit;
- end;
-
- if (Rounds[Round].Winner = 255) then
- begin
- Result := Language.Translate('PARTY_NOTPLAYEDYET');
- exit;
- end;
-
- SetLength(Winners, 0);
- for I := 0 to Teams.NumTeams-1 do
- begin
- if isWinner(I, Rounds[Round].Winner) then
- begin
- SetLength(Winners, Length(Winners) + 1);
- Winners[high(Winners)] := Teams.TeamInfo[I].Name;
- end;
- end;
- Result := Language.Implode(Winners);
-end;
-
-//----------
-//EndRound - Get Winner from ScreenSingModi and Save Data to RoundArray
-//----------
-procedure TParty_Session.EndRound;
-var
- I: Integer;
-begin
- //Copy Winner
- Rounds[CurRound].Winner := ScreenSingModi.Winner;
- //Set Scores
- GenScores;
-
- //Increase TimesPlayed 4 all Players
- For I := 0 to Teams.NumTeams-1 do
- Inc(Teams.Teaminfo[I].Playerinfo[Teams.Teaminfo[I].CurPlayer].TimesPlayed);
-
-end;
-
-//----------
-//GetTeamOrder - Gives back the Placing of eacb Team [First Position of Array is Teamnum of first placed Team, ...]
-//----------
-function TParty_Session.GetTeamOrder: TeamOrderArray;
-var
- I, J: Integer;
- ATeams: array [0..5] of TeamOrderEntry;
- TempTeam: TeamOrderEntry;
-begin
- //Fill Team Array
- For I := 0 to Teams.NumTeams-1 do
- begin
- ATeams[I].Teamnum := I;
- ATeams[I].Score := Teams.Teaminfo[I].Score;
- end;
-
- //Sort Teams
- for J := 0 to Teams.NumTeams-1 do
- for I := 1 to Teams.NumTeams-1 do
- if ATeams[I].Score > ATeams[I-1].Score then
- begin
- TempTeam := ATeams[I-1];
- ATeams[I-1] := ATeams[I];
- ATeams[I] := TempTeam;
- end;
-
- //Copy to Result
- For I := 0 to Teams.NumTeams-1 do
- Result[I] := ATeams[I].TeamNum;
-end;
-
-end.
+unit UParty;
+
+interface
+
+{$IFDEF FPC}
+ {$MODE DELPHI}
+{$ENDIF}
+
+{$I switches.inc}
+
+uses UPartyDefs, UCoreModule, UPluginDefs;
+
+type
+ ARounds = Array [0..252] of Integer; //0..252 needed for
+ PARounds = ^ARounds;
+
+ TRoundInfo = record
+ Modi: Cardinal;
+ Winner: Byte;
+ end;
+
+ TeamOrderEntry = record
+ Teamnum: Byte;
+ Score: Byte;
+ end;
+
+ TeamOrderArray = Array[0..5] of Byte;
+
+ TUS_ModiInfoEx = record
+ Info: TUS_ModiInfo;
+ Owner: Integer;
+ TimesPlayed: Byte; //Helper for setting Round Plugins
+ end;
+
+ TPartySession = class (TCoreModule)
+ private
+ bPartyMode: Boolean; //Is this Party or Singleplayer
+ CurRound: Byte;
+
+ Modis: Array of TUS_ModiInfoEx;
+ Teams: TTeamInfo;
+
+ function IsWinner(Player, Winner: Byte): boolean;
+ procedure GenScores;
+ function GetRandomPlugin(TeamMode: Boolean): Cardinal;
+ function GetRandomPlayer(Team: Byte): Byte;
+ public
+ //Teams: TTeamInfo;
+ Rounds: array of TRoundInfo;
+
+ //TCoreModule methods to inherit
+ Constructor Create; override;
+ Procedure Info(const pInfo: PModuleInfo); override;
+ Function Load: Boolean; override;
+ Function Init: Boolean; override;
+ Procedure DeInit; override;
+ Procedure Free; override;
+
+ //Register Modi Service
+ Function RegisterModi(pModiInfo, nothin: DWord): integer; //Registers a new Modi. wParam: Pointer to TUS_ModiInfo
+
+ //Start new Party
+ Function StartParty(NumRounds, PAofIRounds: DWord): integer; //Starts new Party Mode. Returns Non Zero on Success
+ Function GetCurModi(wParam, lParam: DWord): integer; //Returns Pointer to Cur. Modis TUS_ModiInfo (to Use with Singscreen)
+ Function StopParty(wParam, lParam: DWord): integer; //Stops Party Mode. Returns 1 If Partymode was enabled before.
+ Function NextRound(wParam, lParam: DWord): integer; //Increases CurRound by 1; Returns num of Round or -1 if last Round is already played
+
+ Function CallModiInit(wParam, lParam: DWord): integer; //Calls CurModis Init Proc. If an Error occurs, Returns Nonzero. In this Case a New Plugin was Selected. Please renew Loading
+ Function CallModiDeInit(wParam, lParam: DWord): integer; //Calls DeInitProc and does the RoundEnding
+
+ Function GetTeamInfo(wParam, pTeamInfo: DWord): integer; //Writes TTeamInfo Record to Pointer at lParam. Returns Zero on Success
+ Function SetTeamInfo(wParam, pTeamInfo: DWord): integer; //Read TTeamInfo Record from Pointer at lParam. Returns Zero on Success
+
+ Function GetTeamOrder(wParam, lParam: DWord): integer; //Returns Team Order. Structure: Bits 1..3: Team at Place1; Bits 4..6: Team at Place2 ...
+ Function GetWinnerString(wParam, lParam: DWord): integer; //wParam is Roundnum. If (Pointer = nil) then Return Length of the String. Otherwise Write the String to Address at lParam
+ end;
+
+const
+ StandardModi = 0; //Modi ID that will be played in non party Mode
+
+implementation
+
+uses UCore, UGraphic, UMain, ULanguage, ULog, SysUtils;
+
+{*********************
+ TPluginLoader
+ Implentation
+*********************}
+
+//-------------
+// Function that gives some Infos about the Module to the Core
+//-------------
+Procedure TPartySession.Info(const pInfo: PModuleInfo);
+begin
+ pInfo^.Name := 'TPartySession';
+ pInfo^.Version := MakeVersion(1,0,0,chr(0));
+ pInfo^.Description := 'Manages Party Modi and Party Game';
+end;
+
+//-------------
+// Just the Constructor
+//-------------
+Constructor TPartySession.Create;
+begin
+ //UnSet PartyMode
+ bPartyMode := False;
+end;
+
+//-------------
+//Is Called on Loading.
+//In this Method only Events and Services should be created
+//to offer them to other Modules or Plugins during the Init process
+//If False is Returned this will cause a Forced Exit
+//-------------
+Function TPartySession.Load: Boolean;
+begin
+ //Add Register Party Modi Service
+ Result := True;
+ Core.Services.AddService('Party/RegisterModi', nil, Self.RegisterModi);
+ Core.Services.AddService('Party/StartParty', nil, Self.StartParty);
+ Core.Services.AddService('Party/GetCurModi', nil, Self.GetCurModi);
+end;
+
+//-------------
+//Is Called on Init Process
+//In this Method you can Hook some Events and Create + Init
+//your Classes, Variables etc.
+//If False is Returned this will cause a Forced Exit
+//-------------
+Function TPartySession.Init: Boolean;
+begin
+ //Just set Prvate Var to true.
+ Result := true;
+end;
+
+//-------------
+//Is Called if this Module has been Inited and there is a Exit.
+//Deinit is in backwards Initing Order
+//-------------
+Procedure TPartySession.DeInit;
+begin
+ //Force DeInit
+
+end;
+
+//-------------
+//Is Called if this Module will be unloaded and has been created
+//Should be used to Free Memory
+//-------------
+Procedure TPartySession.Free;
+begin
+ //Just save some Memory if it wasn't done now..
+ SetLength(Modis, 0);
+end;
+
+//-------------
+// Registers a new Modi. wParam: Pointer to TUS_ModiInfo
+// Service for Plugins
+//-------------
+Function TPartySession.RegisterModi(pModiInfo, nothin: DWord): integer;
+var
+ Len: Integer;
+ Info: PUS_ModiInfo;
+begin
+ Info := ptr(PModiInfo);
+ //Copy Info if cbSize is correct
+ If (Info.cbSize = SizeOf(TUS_ModiInfo)) then
+ begin
+ Len := Length(Modis);
+ SetLength(Modis, Len + 1);
+
+ Modis[Len].Info := Info^;
+ end
+ else
+ Core.ReportError(Integer(PChar('Plugins try to Register Modi with wrong Pointer, or wrong TUS_ModiInfo Record.')), Integer(PChar('TPartySession')));
+end;
+
+//----------
+// Returns a Number of a Random Plugin
+//----------
+Function TPartySession.GetRandomPlugin(TeamMode: Boolean): Cardinal;
+var
+ LowestTP: Byte;
+ NumPwithLTP: Word;
+ I: Integer;
+ R: Word;
+begin
+ Result := StandardModi; //If there are no matching Modis, Play StandardModi
+ LowestTP := high(Byte);
+ NumPwithLTP := 0;
+
+ //Search for Plugins not often played yet
+ For I := 0 to high(Modis) do
+ begin
+ if (Modis[I].TimesPlayed < lowestTP) And (((Modis[I].Info.LoadingSettings AND MLS_TeamOnly) <> 0) = TeamMode) then
+ begin
+ lowestTP := Modis[I].TimesPlayed;
+ NumPwithLTP := 1;
+ end
+ else if (Modis[I].TimesPlayed = lowestTP) And (((Modis[I].Info.LoadingSettings AND MLS_TeamOnly) <> 0) = TeamMode) then
+ begin
+ Inc(NumPwithLTP);
+ end;
+ end;
+
+ //Create Random No
+ R := Random(NumPwithLTP);
+
+ //Search for Random Plugin
+ For I := 0 to high(Modis) do
+ begin
+ if (Modis[I].TimesPlayed = lowestTP) And (((Modis[I].Info.LoadingSettings AND MLS_TeamOnly) <> 0) = TeamMode) then
+ begin
+ //Plugin Found
+ if (R = 0) then
+ begin
+ Result := I;
+ Inc(Modis[I].TimesPlayed);
+ Break;
+ end;
+
+ Dec(R);
+ end;
+ end;
+end;
+
+//----------
+// Starts new Party Mode. Returns Non Zero on Success
+//----------
+Function TPartySession.StartParty(NumRounds, PAofIRounds: DWord): integer;
+var
+ I: Integer;
+ aiRounds: PARounds;
+ TeamMode: Boolean;
+begin
+ Result := 0;
+ If (Teams.NumTeams >= 1) AND (NumRounds < High(Byte)-1) then
+ begin
+ bPartyMode := false;
+ aiRounds := Ptr(PAofIRounds);
+
+ Try
+ //Is this Teammode(More then one Player per Team) ?
+ TeamMode := True;
+ For I := 0 to Teams.NumTeams-1 do
+ TeamMode := TeamMode AND (Teams.Teaminfo[I].NumPlayers > 1);
+
+ For I := 0 to High(NumRounds) do
+ begin //Set Plugins
+ If (aiRounds[I] = -1) then
+ Rounds[I].Modi := GetRandomPlugin(TeamMode)
+ Else If (aiRounds[I] >= 0) AND (aiRounds[I] <= High(Modis)) AND (TeamMode OR ((Modis[aiRounds[I]].Info.LoadingSettings AND MLS_TeamOnly) = 0)) then
+ Rounds[I].Modi := aiRounds[I]
+ Else
+ Rounds[I].Modi := StandardModi;
+
+ Rounds[I].Winner := High(Byte); //Set Winner to Not Played
+ end;
+
+ CurRound := High(Byte); //Set CurRound to not defined
+
+ //Return teh true and Set PartyMode
+ bPartyMode := True;
+ Result := 1;
+
+ Except
+ Core.ReportError(Integer(PChar('Can''t start PartyMode.')), Integer(PChar('TPartySession')));
+ end;
+ end;
+end;
+
+//----------
+// Returns Pointer to Cur. ModiInfoEx (to Use with Singscreen)
+//----------
+Function TPartySession.GetCurModi(wParam, lParam: DWord): integer;
+begin
+ If (bPartyMode) AND (CurRound <= High(Rounds)) then
+ begin //If PartyMode is enabled:
+ //Return the Plugin of the Cur Round
+ Result := Integer(@Modis[Rounds[CurRound].Modi]);
+ end
+ else
+ begin //Return StandardModi
+ Result := Integer(@Modis[StandardModi]);
+ end;
+end;
+
+//----------
+// Stops Party Mode. Returns 1 If Partymode was enabled before. And -1 if Change was not possible
+//----------
+Function TPartySession.StopParty(wParam, lParam: DWord): integer;
+begin
+ Result := -1;
+ If (bPartyMode) then
+ begin
+ // to-do : Whitü: Check here if SingScreen is not Shown atm.
+ bPartyMode := False;
+ Result := 1;
+ end
+ else
+ Result := 0;
+end;
+
+//----------
+//GetRandomPlayer - Gives back a Random Player to Play next Round
+//----------
+function TPartySession.GetRandomPlayer(Team: Byte): Byte;
+var
+ I, R: Integer;
+ lowestTP: Byte;
+ NumPwithLTP: Byte;
+begin
+ LowestTP := high(Byte);
+ NumPwithLTP := 0;
+ Result := 0;
+
+ //Search for Players that have not often played yet
+ For I := 0 to Teams.Teaminfo[Team].NumPlayers-1 do
+ begin
+ if (Teams.Teaminfo[Team].Playerinfo[I].TimesPlayed < lowestTP) then
+ begin
+ lowestTP := Teams.Teaminfo[Team].Playerinfo[I].TimesPlayed;
+ NumPwithLTP := 1;
+ end
+ else if (Teams.Teaminfo[Team].Playerinfo[I].TimesPlayed = lowestTP) then
+ begin
+ Inc(NumPwithLTP);
+ end;
+ end;
+
+ //Create Random No
+ R := Random(NumPwithLTP);
+
+ //Search for Random Player
+ For I := 0 to Teams.Teaminfo[Team].NumPlayers-1 do
+ begin
+ if Teams.Teaminfo[Team].Playerinfo[I].TimesPlayed = lowestTP then
+ begin
+ //Player Found
+ if (R = 0) then
+ begin
+ Result := I;
+ Break;
+ end;
+
+ Dec(R);
+ end;
+ end;
+end;
+
+//----------
+// NextRound - Increases CurRound by 1; Returns num of Round or -1 if last Round is already played
+//----------
+Function TPartySession.NextRound(wParam, lParam: DWord): integer;
+var I: Integer;
+begin
+ If ((CurRound < high(Rounds)) OR (CurRound = high(CurRound))) then
+ begin //everythings OK! -> Start the Round, maaaaan
+ Inc(CurRound);
+
+ //Set Players to play this Round
+ for I := 0 to Teams.NumTeams-1 do
+ Teams.Teaminfo[I].CurPlayer := GetRandomPlayer(I);
+ end
+ else
+ Result := -1;
+end;
+
+//----------
+//IsWinner - Returns True if the Players Bit is set in the Winner Byte
+//----------
+function TPartySession.IsWinner(Player, Winner: Byte): boolean;
+var
+ Bit: Byte;
+begin
+ Bit := 1 shl Player;
+
+ Result := ((Winner AND Bit) = Bit);
+end;
+
+//----------
+//GenScores - Inc Scores for Cur. Round
+//----------
+procedure TPartySession.GenScores;
+var
+ I: Byte;
+begin
+ for I := 0 to Teams.NumTeams-1 do
+ begin
+ if isWinner(I, Rounds[CurRound].Winner) then
+ Inc(Teams.Teaminfo[I].Score);
+ end;
+end;
+
+//----------
+// CallModiInit - Calls CurModis Init Proc. If an Error occurs, Returns Nonzero. In this Case a New Plugin was Selected. Please renew Loading
+//----------
+Function TPartySession.CallModiInit(wParam, lParam: DWord): integer;
+begin
+ If (not bPartyMode) then
+ begin //Set Rounds if not in PartyMode
+ SetLength(Rounds, 1);
+ Rounds[0].Modi := StandardModi;
+ Rounds[0].Winner := High(Byte);
+ CurRound := 0;
+ end;
+
+ Try
+ //Core.
+ Except
+ on E : Exception do
+ begin
+ Core.ReportError(Integer(PChar('Error starting Modi: ' + Modis[Rounds[CurRound].Modi].Info.Name + ' ErrorStr: ' + E.Message)), Integer(PChar('TPartySession')));
+ If (Rounds[CurRound].Modi = StandardModi) then
+ begin
+ Core.ReportError(Integer(PChar('Can''t start StandardModi, will exit now!')), Integer(PChar('TPartySession')));
+ Halt;
+ end
+ Else //Select StandardModi
+ begin
+ Rounds[CurRound].Modi := StandardModi
+ end;
+ end;
+ End;
+end;
+
+//----------
+// CallModiDeInit - Calls DeInitProc and does the RoundEnding
+//----------
+Function TPartySession.CallModiDeInit(wParam, lParam: DWord): integer;
+var
+ I: Integer;
+ MaxScore: Word;
+begin
+ If (bPartyMode) then
+ begin
+ //Get Winner Byte!
+ if (@Modis[Rounds[CurRound].Modi].Info.ModiDeInit <> nil) then //get Winners from Plugin
+ Rounds[CurRound].Winner := Modis[Rounds[CurRound].Modi].Info.ModiDeInit(Modis[Rounds[CurRound].Modi].Info.ID)
+ else
+ begin //Create winners by Score :/
+ Rounds[CurRound].Winner := 0;
+ MaxScore := 0;
+ for I := 0 to Teams.NumTeams-1 do
+ begin
+ // to-do : recode Percentage stuff
+ //PlayerInfo.Playerinfo[I].Percentage := PlayerInfo.Playerinfo[I].Score div 9999;
+ if (Player[I].ScoreTotalI > MaxScore) then
+ begin
+ MaxScore := Player[I].ScoreTotalI;
+ Rounds[CurRound].Winner := 1 shl I;
+ end
+ else if (Player[I].ScoreTotalI = MaxScore) AND (Player[I].ScoreTotalI <> 0) then
+ begin
+ Rounds[CurRound].Winner := Rounds[CurRound].Winner or (1 shl I);
+ end;
+ end;
+
+
+ //When nobody has Points -> Everybody loose
+ if (MaxScore = 0) then
+ Rounds[CurRound].Winner := 0;
+
+ end;
+
+ //Generate teh Scores
+ GenScores;
+
+ //Inc Players TimesPlayed
+ If ((Modis[Rounds[CurRound-1].Modi].Info.LoadingSettings AND MLS_IncTP) = MLS_IncTP) then
+ begin
+ For I := 0 to Teams.NumTeams-1 do
+ Inc(Teams.TeamInfo[I].Playerinfo[Teams.TeamInfo[I].CurPlayer].TimesPlayed);
+ end;
+ end
+ else if (@Modis[Rounds[CurRound].Modi].Info.ModiDeInit <> nil) then
+ Modis[Rounds[CurRound].Modi].Info.ModiDeInit(Modis[Rounds[CurRound].Modi].Info.ID);
+end;
+
+//----------
+// GetTeamInfo - Writes TTeamInfo Record to Pointer at lParam. Returns Zero on Success
+//----------
+Function TPartySession.GetTeamInfo(wParam, pTeamInfo: DWord): integer;
+var Info: ^TTeamInfo;
+begin
+ Result := -1;
+ Info := ptr(pTeamInfo);
+ If (Info <> nil) then
+ begin
+ Try
+ // to - do : Check Delphi memory management in this case
+ //Not sure if i had to copy PChars to a new address or if delphi manages this o0
+ Info^ := Teams;
+ Result := 0;
+ Except
+ Result := -2;
+ End;
+ end;
+end;
+
+//----------
+// SetTeamInfo - Read TTeamInfo Record from Pointer at lParam. Returns Zero on Success
+//----------
+Function TPartySession.SetTeamInfo(wParam, pTeamInfo: DWord): integer;
+var
+ TeamInfobackup: TTeamInfo;
+ Info: ^TTeamInfo;
+begin
+ Result := -1;
+ Info := ptr(pTeamInfo);
+ If (Info <> nil) then
+ begin
+ Try
+ TeamInfoBackup := Teams;
+ // to - do : Check Delphi memory management in this case
+ //Not sure if i had to copy PChars to a new address or if delphi manages this o0
+ Teams := Info^;
+ Result := 0;
+ Except
+ Teams := TeamInfoBackup;
+ Result := -2;
+ End;
+ end;
+end;
+
+//----------
+// GetTeamOrder - Returns Team Order. Structure: Bits 1..3: Team at Place1; Bits 4..6: Team at Place2 ...
+//----------
+Function TPartySession.GetTeamOrder(wParam, lParam: DWord): integer;
+var
+ I, J: Integer;
+ ATeams: array [0..5] of TeamOrderEntry;
+ TempTeam: TeamOrderEntry;
+begin
+ // to-do : PartyMode: Write this in another way, so that teams with the same scire get the same Placing
+ //Fill Team Array
+ For I := 0 to Teams.NumTeams-1 do
+ begin
+ ATeams[I].Teamnum := I;
+ ATeams[I].Score := Teams.Teaminfo[I].Score;
+ end;
+
+ //Sort Teams
+ for J := 0 to Teams.NumTeams-1 do
+ for I := 1 to Teams.NumTeams-1 do
+ if ATeams[I].Score > ATeams[I-1].Score then
+ begin
+ TempTeam := ATeams[I-1];
+ ATeams[I-1] := ATeams[I];
+ ATeams[I] := TempTeam;
+ end;
+
+ //Copy to Result
+ Result := 0;
+ For I := 0 to Teams.NumTeams-1 do
+ Result := Result or (ATeams[I].TeamNum Shl I*3);
+end;
+
+//----------
+// GetWinnerString - wParam is Roundnum. If (Pointer = nil) then Return Length of the String. Otherwise Write the String to Address at lParam
+//----------
+Function TPartySession.GetWinnerString(wParam, lParam: DWord): integer;
+var
+ Winners: Array of String;
+ I: Integer;
+ ResultStr: String;
+ S: ^String;
+begin
+ ResultStr := Language.Translate('PARTY_NOBODY');
+
+ if (wParam <= High(Rounds)) then
+ begin
+ if (Rounds[wParam].Winner <> 0) then
+ begin
+ if (Rounds[wParam].Winner = 255) then
+ begin
+ ResultStr := Language.Translate('PARTY_NOTPLAYEDYET');
+ end
+ else
+ begin
+ SetLength(Winners, 0);
+ for I := 0 to Teams.NumTeams-1 do
+ begin
+ if isWinner(I, Rounds[wParam].Winner) then
+ begin
+ SetLength(Winners, Length(Winners) + 1);
+ Winners[high(Winners)] := Teams.TeamInfo[I].Name;
+ end;
+ end;
+ ResultStr := Language.Implode(Winners);
+ end;
+ end;
+ end;
+
+ //Now Return what we have got
+ If (ptr(lParam) = nil) then
+ begin //ReturnString Length
+ Result := Length(ResultStr);
+ end
+ Else
+ begin //Return String
+ Try
+ S := Ptr(lParam);
+ S^ := ResultStr;
+ Result := 0;
+ Except
+ Result := -1;
+
+ End;
+ end;
+end;
+
+end.
diff --git a/Game/Code/Classes/UServices.pas b/Game/Code/Classes/UServices.pas
index c8761df0..094c3fed 100644
--- a/Game/Code/Classes/UServices.pas
+++ b/Game/Code/Classes/UServices.pas
@@ -247,7 +247,7 @@ end;
Function TServiceManager.NametoHash(const ServiceName: TServiceName): Integer;
asm
{ CL: Counter; EAX: Result; EDX: Current Memory Address }
- Mov CL, 14 {Init Counter, Fold 14 Times to became 4 Bytes out of 60}
+ Mov ECX, 14 {Init Counter, Fold 14 Times to get 4 Bytes out of 60}
Mov EDX, ServiceName {Save Address of String that should be "Hashed"}
diff --git a/Game/Code/Screens/UScreenPartyNewRound.pas b/Game/Code/Screens/UScreenPartyNewRound.pas
index 33543211..6f039080 100644
--- a/Game/Code/Screens/UScreenPartyNewRound.pas
+++ b/Game/Code/Screens/UScreenPartyNewRound.pas
@@ -181,23 +181,25 @@ var
var
Players: Array of String;
J: Byte;
- begin
- if (Num-1 >= PartySession.Teams.NumTeams) then
+ begin // to-do : Party
+ if (Num-1 >= {PartySession.Teams.NumTeams}0) then
exit;
- //Create Players Array
+ {//Create Players Array
SetLength(Players, PartySession.Teams.TeamInfo[Num-1].NumPlayers);
For J := 0 to PartySession.Teams.TeamInfo[Num-1].NumPlayers-1 do
- Players[J] := String(PartySession.Teams.TeamInfo[Num-1].PlayerInfo[J].Name);
+ Players[J] := String(PartySession.Teams.TeamInfo[Num-1].PlayerInfo[J].Name);}
//Implode and Return
Result := Language.Implode(Players);
end;
begin
- PartySession.StartRound;
+ // to-do : Party
+ //PartySession.StartRound;
//Set Visibility of Round Infos
- I := Length(PartySession.Rounds);
+ // to-do : Party
+ I := {Length(PartySession.Rounds)}0;
if (I >= 1) then
begin
Static[StaticRound1].Visible := True;
@@ -205,8 +207,8 @@ begin
Text[TextWinner1].Visible := True;
//Texts:
- Text[TextRound1].Text := Language.Translate(DllMan.Plugins[PartySession.Rounds[0].Plugin].Name);
- Text[TextWinner1].Text := PartySession.GetWinnerString(0);
+ //Text[TextRound1].Text := Language.Translate(DllMan.Plugins[PartySession.Rounds[0].Plugin].Name);
+ //Text[TextWinner1].Text := PartySession.GetWinnerString(0);
end
else
begin
@@ -222,8 +224,8 @@ begin
Text[TextWinner2].Visible := True;
//Texts:
- Text[TextRound2].Text := Language.Translate(DllMan.Plugins[PartySession.Rounds[1].Plugin].Name);
- Text[TextWinner2].Text := PartySession.GetWinnerString(1);
+ //Text[TextRound2].Text := Language.Translate(DllMan.Plugins[PartySession.Rounds[1].Plugin].Name);
+ //Text[TextWinner2].Text := PartySession.GetWinnerString(1);
end
else
begin
@@ -239,8 +241,8 @@ begin
Text[TextWinner3].Visible := True;
//Texts:
- Text[TextRound3].Text := Language.Translate(DllMan.Plugins[PartySession.Rounds[2].Plugin].Name);
- Text[TextWinner3].Text := PartySession.GetWinnerString(2);
+ //Text[TextRound3].Text := Language.Translate(DllMan.Plugins[PartySession.Rounds[2].Plugin].Name);
+ //Text[TextWinner3].Text := PartySession.GetWinnerString(2);
end
else
begin
@@ -256,8 +258,8 @@ begin
Text[TextWinner4].Visible := True;
//Texts:
- Text[TextRound4].Text := Language.Translate(DllMan.Plugins[PartySession.Rounds[3].Plugin].Name);
- Text[TextWinner4].Text := PartySession.GetWinnerString(3);
+ //Text[TextRound4].Text := Language.Translate(DllMan.Plugins[PartySession.Rounds[3].Plugin].Name);
+ //Text[TextWinner4].Text := PartySession.GetWinnerString(3);
end
else
begin
@@ -273,8 +275,8 @@ begin
Text[TextWinner5].Visible := True;
//Texts:
- Text[TextRound5].Text := Language.Translate(DllMan.Plugins[PartySession.Rounds[4].Plugin].Name);
- Text[TextWinner5].Text := PartySession.GetWinnerString(4);
+ //Text[TextRound5].Text := Language.Translate(DllMan.Plugins[PartySession.Rounds[4].Plugin].Name);
+ //Text[TextWinner5].Text := PartySession.GetWinnerString(4);
end
else
begin
@@ -290,8 +292,8 @@ begin
Text[TextWinner6].Visible := True;
//Texts:
- Text[TextRound6].Text := Language.Translate(DllMan.Plugins[PartySession.Rounds[5].Plugin].Name);
- Text[TextWinner6].Text := PartySession.GetWinnerString(5);
+ //Text[TextRound6].Text := Language.Translate(DllMan.Plugins[PartySession.Rounds[5].Plugin].Name);
+ //Text[TextWinner6].Text := PartySession.GetWinnerString(5);
end
else
begin
@@ -307,8 +309,8 @@ begin
Text[TextWinner7].Visible := True;
//Texts:
- Text[TextRound7].Text := Language.Translate(DllMan.Plugins[PartySession.Rounds[6].Plugin].Name);
- Text[TextWinner7].Text := PartySession.GetWinnerString(6);
+ //Text[TextRound7].Text := Language.Translate(DllMan.Plugins[PartySession.Rounds[6].Plugin].Name);
+ //Text[TextWinner7].Text := PartySession.GetWinnerString(6);
end
else
begin
@@ -318,7 +320,7 @@ begin
end;
//Display Scores
- if (PartySession.Teams.NumTeams >= 1) then
+ {if (PartySession.Teams.NumTeams >= 1) then
begin
Text[TextScoreTeam1].Text := InttoStr(PartySession.Teams.TeamInfo[0].Score);
Text[TextNameTeam1].Text := String(PartySession.Teams.TeamInfo[0].Name);
@@ -406,7 +408,7 @@ begin
Text[TextNextPlayer3].Visible := True;
end
else
- Text[TextNextPlayer3].Visible := False;
+ Text[TextNextPlayer3].Visible := False; }
// LCD.WriteText(1, ' Choose mode: ');
diff --git a/Game/Code/Screens/UScreenPartyOptions.pas b/Game/Code/Screens/UScreenPartyOptions.pas
index 1c5e8461..85ee65bc 100644
--- a/Game/Code/Screens/UScreenPartyOptions.pas
+++ b/Game/Code/Screens/UScreenPartyOptions.pas
@@ -81,10 +81,10 @@ begin
//Save Num Teams:
- PartySession.Teams.NumTeams := NumTeams + 2;
+ {PartySession.Teams.NumTeams := NumTeams + 2;
PartySession.Teams.Teaminfo[0].NumPlayers := NumPlayer1+1;
PartySession.Teams.Teaminfo[1].NumPlayers := NumPlayer2+1;
- PartySession.Teams.Teaminfo[2].NumPlayers := NumPlayer3+1;
+ PartySession.Teams.Teaminfo[2].NumPlayers := NumPlayer3+1;}
//Save Playlist
PlaylistMan.Mode := Playlist;
@@ -113,7 +113,8 @@ begin
PlaylistMan.CurPlayList := Playlist2;
//Start Party
- PartySession.StartNewParty(Rounds + 2);
+ // to-do : Party
+ //PartySession.StartNewParty(Rounds + 2);
AudioPlayback.PlayStart;
//Go to Player Screen
diff --git a/Game/Code/Screens/UScreenPartyPlayer.pas b/Game/Code/Screens/UScreenPartyPlayer.pas
index 4aaa5a3e..3bd33a5c 100644
--- a/Game/Code/Screens/UScreenPartyPlayer.pas
+++ b/Game/Code/Screens/UScreenPartyPlayer.pas
@@ -193,7 +193,7 @@ begin
SDLK_RETURN:
begin
- //Save PlayerNames
+ {//Save PlayerNames
for I := 0 to PartySession.Teams.NumTeams-1 do
begin
PartySession.Teams.Teaminfo[I].Name := PChar(Button[I*5].Text[0].Text);
@@ -205,7 +205,7 @@ begin
end;
AudioPlayback.PlayStart;
- FadeTo(@ScreenPartyNewRound);
+ FadeTo(@ScreenPartyNewRound);}
end;
// Up and Down could be done at the same time,
@@ -267,7 +267,7 @@ begin
Button[10].Text[0].Text := Ini.NameTeam[2];
// Templates for Names Mod end
- If (PartySession.Teams.NumTeams>=1) then
+ {If (PartySession.Teams.NumTeams>=1) then
begin
Button[0].Visible := True;
Button[1].Visible := (PartySession.Teams.Teaminfo[0].NumPlayers >=1);
@@ -316,7 +316,7 @@ begin
Button[12].Visible := False;
Button[13].Visible := False;
Button[14].Visible := False;
- end;
+ end; }
end;
diff --git a/Game/Code/Screens/UScreenPartyScore.pas b/Game/Code/Screens/UScreenPartyScore.pas
index ea9b944b..6215e65a 100644
--- a/Game/Code/Screens/UScreenPartyScore.pas
+++ b/Game/Code/Screens/UScreenPartyScore.pas
@@ -60,21 +60,22 @@ begin
SDLK_BACKSPACE :
begin
AudioPlayback.PlayStart;
- if (PartySession.CurRound < High(PartySession.Rounds)) then
+ {if (PartySession.CurRound < High(PartySession.Rounds)) then
FadeTo(@ScreenPartyNewRound)
- else
+ else // to-do : Party
begin
- PartySession.EndRound;
+ PartySession.EndRound; }
FadeTo(@ScreenPartyWin);
- end;
+ //end;
end;
SDLK_RETURN:
begin
AudioPlayback.PlayStart;
- if (PartySession.CurRound < High(PartySession.Rounds)) then
+ // to-do : Party
+ {if (PartySession.CurRound < High(PartySession.Rounds)) then
FadeTo(@ScreenPartyNewRound)
- else
+ else }
FadeTo(@ScreenPartyWin);
end;
end;
@@ -182,11 +183,11 @@ begin
if Static[StaticTeam2].Texture.ScaleW > 99 then Static[StaticTeam2].Texture.ScaleW := 99;
if Static[StaticTeam3].Texture.ScaleW > 99 then Static[StaticTeam3].Texture.ScaleW := 99;
- //End Last Round
- PartySession.EndRound;
+ //End Last Round // to-do : Party
+ //PartySession.EndRound;
//Set Winnertext
- Text[TextWinner].Text := Format(Language.Translate('PARTY_SCORE_WINS'), [PartySession.GetWinnerString(PartySession.CurRound)]);
+ //Text[TextWinner].Text := Format(Language.Translate('PARTY_SCORE_WINS'), [PartySession.GetWinnerString(PartySession.CurRound)]);
if (ScreenSingModi.PlayerInfo.NumPlayers >= 1) then
begin
diff --git a/Game/Code/Screens/UScreenPartyWin.pas b/Game/Code/Screens/UScreenPartyWin.pas
index 9806159a..d8a3bd71 100644
--- a/Game/Code/Screens/UScreenPartyWin.pas
+++ b/Game/Code/Screens/UScreenPartyWin.pas
@@ -96,7 +96,7 @@ end;
procedure TScreenPartyWin.onShow;
var
I: Integer;
- Placing: TeamOrderArray;
+ Placing: Integer;
Function GetTeamColor(Team: Byte): Cardinal;
var
NameString: String;
@@ -106,13 +106,13 @@ var
Result := ColorExists(NameString);
end;
begin
+ // to-do : Party
//Get Team Placing
- Placing := PartySession.GetTeamOrder;
-
- //Set Winnertext
- Text[TextWinner].Text := Format(Language.Translate('PARTY_SCORE_WINS'), [PartySession.Teams.Teaminfo[Placing[0]].Name]);
+ //Placing := PartySession.GetTeamOrder;
- if (PartySession.Teams.NumTeams >= 1) then
+ //Set Winnertext
+ //Text[TextWinner].Text := Format(Language.Translate('PARTY_SCORE_WINS'), [PartySession.Teams.Teaminfo[Placing[0]].Name]);
+ {if (PartySession.Teams.NumTeams >= 1) then
begin
Text[TextScoreTeam1].Text := InttoStr(PartySession.Teams.TeamInfo[Placing[0]].Score);
Text[TextNameTeam1].Text := String(PartySession.Teams.TeamInfo[Placing[0]].Name);
@@ -239,7 +239,7 @@ begin
Static[StaticTeam3].Visible := False;
Static[StaticTeam3BG].Visible := False;
Static[StaticTeam3Deco].Visible := False;
- end;
+ end; }
// LCD.WriteText(1, ' Choose mode: ');
diff --git a/Game/Code/Screens/UScreenSong.pas b/Game/Code/Screens/UScreenSong.pas
index bd9e5e67..8123ef03 100644
--- a/Game/Code/Screens/UScreenSong.pas
+++ b/Game/Code/Screens/UScreenSong.pas
@@ -660,36 +660,36 @@ begin
end;
SDLK_1:
- begin //Jocker
- if (Mode = 1) AND (PartySession.Teams.NumTeams >= 1) AND (PartySession.Teams.Teaminfo[0].Joker > 0) then
+ begin //Jocker // to-do : Party
+ {if (Mode = 1) AND (PartySession.Teams.NumTeams >= 1) AND (PartySession.Teams.Teaminfo[0].Joker > 0) then
begin
//Joker spielen
Dec(PartySession.Teams.Teaminfo[0].Joker);
SelectRandomSong;
SetJoker;
- end;
+ end; }
end;
SDLK_2:
begin //Jocker
- if (Mode = 1) AND (PartySession.Teams.NumTeams >= 2) AND (PartySession.Teams.Teaminfo[1].Joker > 0) then
+ {if (Mode = 1) AND (PartySession.Teams.NumTeams >= 2) AND (PartySession.Teams.Teaminfo[1].Joker > 0) then
begin
//Joker spielen
Dec(PartySession.Teams.Teaminfo[1].Joker);
SelectRandomSong;
SetJoker;
- end;
+ end; }
end;
SDLK_3:
begin //Jocker
- if (Mode = 1) AND (PartySession.Teams.NumTeams >= 3) AND (PartySession.Teams.Teaminfo[2].Joker > 0) then
+ {if (Mode = 1) AND (PartySession.Teams.NumTeams >= 3) AND (PartySession.Teams.Teaminfo[2].Joker > 0) then
begin
//Joker spielen
Dec(PartySession.Teams.Teaminfo[2].Joker);
SelectRandomSong;
SetJoker;
- end;
+ end; }
end;
end;
end;
@@ -1991,7 +1991,8 @@ end;
procedure TScreenSong.SetJoker;
begin
- //If Party Mode
+ {//If Party Mode
+ // to-do : Party
if Mode = 1 then //Show Joker that are available
begin
if (PartySession.Teams.NumTeams >= 1) then
@@ -2064,7 +2065,7 @@ begin
Static[StaticTeam3Joker3].Visible := False;
Static[StaticTeam3Joker4].Visible := False;
Static[StaticTeam3Joker5].Visible := False;
- end;
+ end; }
end;
procedure TScreenSong.SetStatics;
@@ -2132,13 +2133,13 @@ end;
//Team No of Team (0-5)
procedure TScreenSong.DoJoker (Team: Byte);
begin
- if (Mode = 1) AND (PartySession.Teams.NumTeams >= Team + 1) AND (PartySession.Teams.Teaminfo[Team].Joker > 0) then
+ {if (Mode = 1) AND (PartySession.Teams.NumTeams >= Team + 1) AND (PartySession.Teams.Teaminfo[Team].Joker > 0) then
begin
//Joker spielen
Dec(PartySession.Teams.Teaminfo[Team].Joker);
SelectRandomSong;
SetJoker;
- end;
+ end; }
end;
//Detailed Cover Unloading. Unloads the Detailed, uncached Cover of the cur. Song
diff --git a/Game/Code/Screens/UScreenSongMenu.pas b/Game/Code/Screens/UScreenSongMenu.pas
index 90e56a54..88b0de32 100644
--- a/Game/Code/Screens/UScreenSongMenu.pas
+++ b/Game/Code/Screens/UScreenSongMenu.pas
@@ -373,16 +373,16 @@ begin
begin
CurMenu := sMenu;
Text[0].Text := Language.Translate('SONG_MENU_NAME_PARTY_JOKER');
-
- Button[0].Visible := (PartySession.Teams.NumTeams >= 1) AND (PartySession.Teams.Teaminfo[0].Joker > 0);
+ // to-do : Party
+ {Button[0].Visible := (PartySession.Teams.NumTeams >= 1) AND (PartySession.Teams.Teaminfo[0].Joker > 0);
Button[1].Visible := (PartySession.Teams.NumTeams >= 2) AND (PartySession.Teams.Teaminfo[1].Joker > 0);
- Button[2].Visible := (PartySession.Teams.NumTeams >= 3) AND (PartySession.Teams.Teaminfo[2].Joker > 0);
+ Button[2].Visible := (PartySession.Teams.NumTeams >= 3) AND (PartySession.Teams.Teaminfo[2].Joker > 0);}
Button[3].Visible := True;
SelectsS[0].Visible := False;
- Button[0].Text[0].Text := String(PartySession.Teams.Teaminfo[0].Name);
+ {Button[0].Text[0].Text := String(PartySession.Teams.Teaminfo[0].Name);
Button[1].Text[0].Text := String(PartySession.Teams.Teaminfo[1].Name);
- Button[2].Text[0].Text := String(PartySession.Teams.Teaminfo[2].Name);
+ Button[2].Text[0].Text := String(PartySession.Teams.Teaminfo[2].Name);}
Button[3].Text[0].Text := Language.Translate('SONG_MENU_CANCEL');
//Set right Interaction
diff --git a/Modis/SDK/UPartyDefs.pas b/Modis/SDK/UPartyDefs.pas
index 78b04bdd..08f5fd44 100644
--- a/Modis/SDK/UPartyDefs.pas
+++ b/Modis/SDK/UPartyDefs.pas
@@ -31,9 +31,9 @@ type
TUS_Party_Proc_Draw = Function (ID: Integer): integer; stdcall;
//----------------
- // TUS_Party_Proc_Init - Structure of the Party Init Proc
+ // TUS_Party_Proc_DeInit - Structure of the Party DeInit Proc
// This Function is called on SingScreen DeInit When Plugin abort Song or Song finishes
- // Return Non Zero to Abort Party Modi Loading... In this Case another Plugin will be loaded
+ // Return Winner
//----------------
TUS_Party_Proc_DeInit = Function (ID: Integer): integer; stdcall;
@@ -69,7 +69,7 @@ type
// 8 | Only Playable with 2 and more players
// 16 | Restrict Background Loading
// 32 | Restrict Video Loading
- // 64 | Not in Use, Don't set it!
+ // 64 | Increase TimesPlayed for Cur. Player
// 128 | Not in Use, Don't set it!
LoadingSettings: Byte;
@@ -111,6 +111,24 @@ type
ModiDeInit: TUS_Party_Proc_DeInit;
end;
+ //--------------
+ // Team Info Record. Used by "Party/GetTeamInfo" and "Party/SetTeamInfo"
+ //--------------
+ TTeamInfo = record
+ NumTeams: Byte;
+ Teaminfo: array[0..5] of record
+ Name: PChar; //Teamname
+ Score: Word; //TeamScore
+ Joker: Byte; //Team Jokers available
+ CurPlayer: Byte; //Id of Cur. Playing Player
+ NumPlayers: Byte;
+ Playerinfo: array[0..3] of record
+ Name: PChar; //Playername
+ TimesPlayed: Byte; //How often this Player has Sung
+ end;
+ end;
+ end;
+
//----------------
// Some Default Constants
//----------------
@@ -122,6 +140,7 @@ const
MLS_TeamOnly = 8; //Only Playable with 2 and more players
MLS_RestrictBG = 16; //Restrict Background Loading
MLS_RestrictVid = 32; //Restrict Video Loading
+ MLS_IncTP = 64; //Increase TimesPlayed for Cur. Player
// to use with TUS_ModiInfo.SingScreenSettings
MSS_ShowNotes = 1; //ShowNotes
@@ -130,7 +149,7 @@ const
MSS_AutoPlayback= 8; //Start Audio Playback automaticaly
//Standard (Duell) for TUS_ModiInfo.LoadingSettings and TUS_ModiInfo.SingScreenSettings
- MLS_Standard = MLS_LoadSong;
+ MLS_Standard = MLS_LoadSong or MLS_IncTP;
MSS_Standard = MSS_ShowNotes or MSS_ShowScores or MSS_ShowTime or MSS_AutoPlayback;
//-------------