{$CLEO .cs}
{$USE CLEO+, FILE, INI}
SCRIPT_NAME 'A_CGT'

IF IS_ON_SAMP
THEN TERMINATE_THIS_CUSTOM_SCRIPT
END

WHILE NOT IS_PLAYER_PLAYING 0
    WAIT 0
END
WAIT 1000
//***********************************************************************************//
///////////////////////////////////////////////////////////////////////////////////////
// Custom Gang Territories
// Author: AlvarynGTA
///////////////////////////////////////////////////////////////////////////////////////
// INI settings
INT isEnabled, debugFlag

// Variables
INT fileData, lineBuffer
//***********************************************************************************//


//-----------------------------------------------------------------------------------//
///////////////////////////////////////////////////////////////////////////////////////
//-----------------------------------------------------------------------------------//

//-----------------------------------------------------------------------------//
:START_SCRIPT
//-----------------------------------------------------------------------------//

GOSUB @read_INI // Read INI
lineBuffer = GET_LABEL_POINTER @BUFFER_STRING

GOSUB @read_dat


GOTO @END_SCRIPT

//-----------------------------------------------------------------------------//
:END_SCRIPT
//-----------------------------------------------------------------------------//
TERMINATE_THIS_CUSTOM_SCRIPT


//-----------------------------------------------------------------------------------//
///////////////////////////////////////////////////////////////////////////////////////
//-----------------------------------------------------------------------------------//


//_______________________________________________________________
:read_dat
//_______________________________________________________________
IF DOES_FILE_EXIST "cleo\CustomGangTerritories.dat"
THEN fileData = OPEN_FILE "cleo\CustomGangTerritories.dat" "rt"
ELSE
    IF debugFlag == 1
    THEN PRINT_STRING "[CGT] CGT.dat not found. Aborted!" 2000
    END
    GOTO @end_script
END

APPLY_GANG_ZONE_FROM_FILE(lineBuffer, fileData, debugFlag)

CLOSE_FILE fileData

CLEAR_SPECIFIC_ZONES_TO_TRIGGER_GANG_WAR // Refresh minimap

IF debugFlag == 1
THEN
    PRINT_STRING "[CGT] Process completed. End script!" 2000
    WAIT 2000
END
RETURN


//-----------------------------------------------------------------------------------//
///////////////////////////////////////////////////////////////////////////////////////
//-----------------------------------------------------------------------------------//


//=========================================================================//
FUNCTION APPLY_GANG_ZONE_FROM_FILE(buffer: INT, fileDat: INT, debugFlag: INT)
//=========================================================================//
    INT firstChar, inBlock = 0
    INT readCount, idGang, intDensity, zoneStringLength
    STRING zoneKey = '', lastZoneKey = ''
    
    INT indexGang, isGroveZone = 0, positiveCount = 0, densityTemp
    
    :read_loop
    WRITE_MEMORY buffer 128 0 0
    IF NOT READ_STRING_FROM_FILE fileDat buffer 128
    THEN CLEO_RETURN 0
    END
    
    firstChar = READ_MEMORY buffer 1 0
    IF firstChar == 0 // Ignore empty lines
    THEN GOTO @read_loop
    END
    
    IF firstChar == 123 // { (Start block)
    THEN
        inBlock = 1
        GOTO @read_loop
    END
    IF firstChar == 125 // } (End block)
    THEN CLEO_RETURN 0
    END
    
    IF inBlock == 0 // Ignore lines before {
    THEN GOTO @read_loop
    END
    
    IF OR // Ignore comments and whitespace
        firstChar == 35   // #
        firstChar == 59   // ;
        firstChar == 32   // space
        firstChar == 9    // tab
    THEN GOTO @read_loop
    END
    
    // Read line format
    readCount, idGang, intDensity, zoneKey = SCAN_STRING buffer "%i %i %s"
    IF debugFlag == 1
    THEN
        PRINT_FORMATTED "[CGT] Scanning line: [GangID:%i; Density:%i; Zone:%s]" 500 idGang intDensity zoneKey
        WAIT 500
    END
    IF readCount <> 3
    THEN
        IF debugFlag == 1
        THEN
            PRINT_FORMATTED "[CGT] Skipped invalid line, with readCount:%i" 1000 readCount
            WAIT 1000
        END
        GOTO @read_loop
    END
    
    // Validate Zone ID
    zoneStringLength = GET_STRING_LENGTH zoneKey // CLEO+
    IF OR
        zoneStringLength < 1
        zoneStringLength > 6
    THEN
        IF debugFlag == 1
        THEN
            PRINT_FORMATTED "[CGT] Skipped invalid line, with zoneStringLength:%i" 1000 zoneStringLength
            WAIT 1000
        END
        GOTO @read_loop
    END
    // Validate Gang ID
    IF OR
        idGang < 0
        idGang > 9
    THEN
        IF debugFlag == 1
        THEN
            PRINT_FORMATTED "[CGT] Skipped invalid line, with GangID:%i" 1000 idGang
            WAIT 1000
        END
        GOTO @read_loop
    END
    // Normalize Density Range
    IF intDensity < 0
    THEN intDensity = 0
    END
    IF intDensity > 127
    THEN intDensity = 127
    END
    
    GOSUB @is_grove_zone
    IF isGroveZone == 0
    THEN
        //Clean Zone
        IF lastZoneKey <> zoneKey
        THEN
            FOR indexGang = 0 TO 9
                SET_ZONE_GANG_STRENGTH zoneKey indexGang 0
            END
        END
        
        // Apply Gang Territory
        SET_ZONE_GANG_STRENGTH zoneKey idGang intDensity
        
        lastZoneKey = zoneKey
        
        IF debugFlag == 1
        THEN
            PRINT_FORMATTED "[CGT] Done! [Gang:%i; Density:%i; Zone:%s]" 1000 idGang intDensity zoneKey
            WAIT 1000
        END
    END
    
    GOTO @read_loop
    
    //_______________________________________________________________
    :is_grove_zone
    //_______________________________________________________________
    isGroveZone = 0
    positiveCount = 0
    
    FOR indexGang = 0 TO 9
        densityTemp = GET_ZONE_GANG_STRENGTH zoneKey indexGang
        IF densityTemp > 0
        THEN positiveCount++
        END
    END
    
    densityTemp = GET_ZONE_GANG_STRENGTH zoneKey 1
    IF AND
        positiveCount == 1
        densityTemp > 0
        idGang <> 1
    THEN isGroveZone = 1
    END
    
    RETURN
END


//-----------------------------------------------------------------------------------//
///////////////////////////////////////////////////////////////////////////////////////
//-----------------------------------------------------------------------------------//


//=========================================================================//
:read_INI
//=========================================================================//
IF NOT READ_INT_FROM_INI_FILE "cleo\CustomGangTerritories.ini" "Settings" "Enable_Mod" isEnabled
THEN isEnabled = 0
END
IF isEnabled <> 1
THEN GOTO @end_script
END

IF NOT READ_INT_FROM_INI_FILE "cleo\CustomGangTerritories.ini" "Settings" "Debug" debugFlag
THEN debugFlag = 0
END
IF debugFlag <> 1
THEN debugFlag = 0
END

RETURN


//-----------------------------------------------------------------------------------//
///////////////////////////////////////////////////////////////////////////////////////
//-----------------------------------------------------------------------------------//


:BUFFER_STRING
hex
    00(128)
end