blob: da89ca8a17e629f1b1a6de0cccdf4aafbc4f72b0 (
plain) (
tree)
|
|
unit UParty;
interface
uses ModiSDK;
type
TRoundInfo = record
Plugin: Word;
Winner: Byte;
end;
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;
procedure StartRound;
procedure EndRound;
function GetWinner: Byte;
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;
begin
//Set cur Round to Round 1
CurRound := 255;
PlayersPlay := Teams.NumTeams;
if isWinner(0,9) then
Log.LogError('Test');
end;
//----------
//GetRandomPlayer - Gives back a Random Player to Play next Round
//----------
function TParty_Session.GetRandomPlayer(Team: Byte): Byte;
var
I, J: Integer;
lowestTP: Byte;
begin
//Get lowest TP
lowestTP := high(Byte);
J := -1;
for I := 0 to Teams.Teaminfo[Team].NumPlayers 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 wth 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 := 0;
DllMan.LoadPlugin(Rounds[CurRound].Plugin);
//Select Players
for I := 0 to Teams.NumTeams 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 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
if (Rounds[Round].Winner = 0) then
begin
Result := 'Nobody';
exit;
end;
SetLength(Winners, 0);
for I := 0 to Teams.NumTeams 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 do
Inc(Teams.Teaminfo[I].Playerinfo[Teams.Teaminfo[0].CurPlayer].TimesPlayed);
end;
//----------
//Get Winner - Gives back the Number of the total Winner
//----------
function TParty_Session.GetWinner: Byte;
begin
end;
end.
|