system "Macao_System"

{Macao System
For instructions, download documentation
Note: the documentation has calculation errors.
Test this system throughly before using at casino.
}
method "main"
begin
    While Starting a New Session
    begin
        Call "Initialize New Session";
        exit;
    end
    
    Call "Determine session over";
    Call "First spin of new session";
    Call "Determine Win/Loss Even money";
    Call "Determine Win/Loss Split";
    Call "Place bets";
    Call "Determine Progression Increased";
end

method "Place bets"
begin
    While Flag "Next Stake is Red" is True
    begin
        Put 100 % of Record "Next Bet Progression on Even Money" data on Red;
        Put 100 % of Record "Next Bet Progression on Splits" data on Split(8-11);
        Put 100 % of Record "Next Bet Progression on Splits" data on Split(10-13);
        Put 100 % of Record "Next Bet Progression on Splits" data on Split(17-20);
        Put 100 % of Record "Next Bet Progression on Splits" data on Split(26-29);
        Put 100 % of Record "Next Bet Progression on Splits" data on Split(28-31);
        Set Flag "Next Stake is Red" to False;
    end
    Else
    begin
        Put 100 % of Record "Next Bet Progression on Even Money" data on Black;
        Put 100 % of Record "Next Bet Progression on Splits" data on Split(9-12);
        Put 100 % of Record "Next Bet Progression on Splits" data on Split(16-19);
        Put 100 % of Record "Next Bet Progression on Splits" data on Split(18-21);
        Put 100 % of Record "Next Bet Progression on Splits" data on Split(27-30);
        Set Flag "Next Stake is Red" to True;
    end
end

method "Determine Progression Increased"
begin
    While Flag "Progressed on Even Money" is True
    Or Flag "Progressed on Split" is True
    begin
        Set Flag "Progression Increased" to True;
        Return;
    end
    
    While Flag "Progressed on Even Money" is False
    And  Flag "Progressed on Split" is False
    begin
        Set Flag "Progression Increased" to False;
    end
end

method "Determine Win/Loss Even money"
begin
    While any red-black bet has won each time
    begin
        Subtract 1 on Record "Next Bet Progression on Even Money" data;
        Set Flag "Progressed on Even Money" to False;
    end
    
    While any red-black bet has lost each time
    begin
        Add 1  on Record "Next Bet Progression on Even Money" data;
        Set Flag "Progressed on Even Money" to True;
    end
    
    While Record "Next Bet Progression on Even Money" data <
                                        Record "Minimum Even Money Bet" data
    begin
        Put 100 % of Record "Minimum Even Money Bet" data on
                            Record "Next Bet Progression on Even Money" data;
    end
end

method "Determine Win/Loss Split"
begin
    While Any Split Bet has won each time
    begin
        Subtract 1 on Record "Next Bet Progression on Splits" data;
        Put 0 on Record "Split Loss Count" data;
        Set Flag "Progressed on Split" to False;
        Call "Check minimum bet for Split";
        Return;
    end
    
    While Any Split Bet has lost each time
    begin
        Add 1 on Record "Split Loss Count" data;
        Call "Determine Split progression";
        Call "Check minimum bet for Split";
    end
end

method "Check minimum bet for Split"
begin
    While Record "Next Bet Progression on Splits" data <
                                                Record "Minimum Split Bet" data
    begin
        Put 100 % of Record "Minimum Split Bet" data on
                                Record "Next Bet Progression on Splits" data;
    end
end

method "Determine Split progression"
begin
    While Record "Split Loss Count" data > 1
    begin
        Add 1  on Record "Next Bet Progression on Splits" data;
        Put 0  on Record "Split Loss Count" data;
        Set Flag "Progressed on Split" to True;
    end
end

method "Determine session over"
begin
    Call "Calculate Balance";
    
    While Record "Current Balance" data >= 20
    Or Record "Current Balance" data <= -75
    begin
        Call "Initialize New Session";
        exit;
    end
    
    While Record "Current Balance" data > 0
    begin
        Call "Check if had to increase progression";
    end
end

method "Calculate Balance"
begin
    Put 100 % of Bankroll on Record "Current Balance" data;
    Subtract 100 % of Record "Bankroll Balance" data on
                                                Record "Current Balance" data;
    
    While Record "Current Balance" data < 0
    begin
        Set Flag "Went into Negative Balance" to True;
    end
end

method "Check if had to increase progression"
begin
    While Flag "Progression Increased" is True
    begin
        Call "Initialize New Session";
        exit;
    end
end

method "Check if we went into a negative balance once"
begin
    While Flag "Went into Negative Balance" is True
    begin
        Call "Initialize New Session";
        exit;
    end
end

method "First spin of new session"
begin
    While Flag "First Spin of New Session" is True
    begin
        Call "Determine stake";
        Set Flag "First Spin of New Session" to False;
        Put 0 on Record "Current Balance" data;
        Put 0 on Record "Adjust Balance" data;
        Set Flag "Progression Increased" to False;
        Set Flag "Went into Negative Balance" to False;
    end
end

method "Determine stake"
begin
    While Black has hit each time
    begin
        Set Flag "Next Stake is Red" to True;
    end
    Else
    begin
        Set Flag "Next Stake is Red" to False;
    end
end

method "Initialize New Session"
begin
    Clear Record "Last spin" data;
    Clear Record "Minimum Even Money Bet" data;
    Clear Record "Minimum Split Bet" data;
    Clear Record "Next Bet Progression on Even Money" data;
    Clear Record "Next Bet Progression on Splits" data;
    Clear Record "Split Loss Count" data;
    Clear Record "Current Balance" data;
    Clear Record "Bankroll Balance" data;
    Clear Record "Adjust Balance" data;
    Put 5 on Record "Minimum Even Money Bet" data;
    Put 100 % of Record "Minimum Even Money Bet" data on
                            Record "Next Bet Progression on Even Money" data;
    Put 1 on Record "Minimum Split Bet" data;
    Put 100 % of Record "Minimum Split Bet" data on
                                Record "Next Bet Progression on Splits" data;
    Put 0 on Record "Split Loss Count" data;
    Put 0 on Record "Black Split Loss Count" data;
    Set Flag "First Spin of New Session" to false;
    Set Flag "Next Stake is Red" to false;
    Set Flag "Progressed on Even Money" to false;
    Set Flag "Progressed on Split" to false;
    Set Flag "Went into Negative Balance" to false;
    Set Flag "Progression Increased" to false;
    Set Flag "Next Stake is Red" to False;
    Set Flag "First Spin of New Session" to True;
    Set Flag "Progressed on Even Money" to False;
    Set Flag "Progressed on Split" to False;
    Put 100 % of Bankroll on Record "Bankroll Balance" data;
end

