• 🏆 Texturing Contest #33 is OPEN! Contestants must re-texture a SD unit model found in-game (Warcraft 3 Classic), recreating the unit into a peaceful NPC version. 🔗Click here to enter!
  • It's time for the first HD Modeling Contest of 2024. Join the theme discussion for Hive's HD Modeling Contest #6! Click here to post your idea!

CR - Sliders

JASS:
library Sliders initializer Init requires GUI, Main


define {
    private MAX_SLIDERS = 100
    private MAX_BORDERS = 50 
    private KNOB_HUMAN_ID = 'B01S'
    private KNOB_ORC_ID = 'B01T'
    private KNOB_ELF_ID = 'B01K'
    private KNOB_UNDEAD_ID = 'B01U'
    private SLIDER_BORDER = 'B01Q'
    private SLIDER_BORDER_END = 'B01R'
    private SLIDER_BUTTON_DOWN = 'B01V'
    private SLIDER_BUTTON_UP = 'B01W'
}

enum (knob) { NULL_KNOB, HUMAN_KNOB, ORC_KNOB, ELF_KNOB, UNDEAD_KNOB }

// globals
//========================================================
    int SlidersCount = 0
    bool array Slider_IsShowed[MAX_SLIDERS]
    real array Slider_Value[MAX_SLIDERS][3]
    real array Slider_StartCoords[MAX_SLIDERS][3]
    real array Slider_Length[MAX_SLIDERS]
    real array Slider_ScaleMod[MAX_SLIDERS][2]
    real array Slider_StepByTrack[MAX_SLIDERS]
    int array Slider_Variation[MAX_SLIDERS]
    int array Slider_TrackableCount[MAX_SLIDERS]
    destructable array Slider_Button[MAX_SLIDERS][2]
    destructable array Slider_Knob[MAX_SLIDERS]
    destructable array Slider_Borders[MAX_SLIDERS][MAX_BORDERS]
    trackable array Slider_ButtonTrackable[MAX_SLIDERS][2]
    trackable array Slider_Trackable[MAX_SLIDERS][MAX_BORDERS]
    texttag array Slider_Text[MAX_SLIDERS]
    real array Slider_TextSize[MAX_SLIDERS]
    bool array Slider_TextType[MAX_SLIDERS]
//========================================================
    int last_TriggeredSlider = 0
    private trigger ButtonClicked = CreateTrigger(), SliderClicked = CreateTrigger()
//========================================================
    
    private real GetPosition(real a, real b, real c){
        real x = c - a, y = b - a, B
            B = y / 100.
            return (x / B) * 0.01
    }
    
    public int GetBySliderTrackable(trackable clicked_trackable){
        int current_slider = 0, index
            while(current_slider++ < SlidersCount) { 
                index = 0
                while (index++ < MAX_BORDERS) {
                    if (Slider_Trackable[current_slider][index] == clicked_trackable and Slider_IsShowed[current_slider]) { return current_slider }
                }
            }
        return 0
    }
    
    public int GetByButtonTrackable(trackable clicked_trackable){
        int current_slider = 0
            while(current_slider++ < SlidersCount) {
                if ((Slider_ButtonTrackable[current_slider][1] == clicked_trackable or Slider_ButtonTrackable[current_slider][2] == clicked_trackable) and Slider_IsShowed[current_slider]) 
                { return current_slider }
            }
        return 0
    }
    
    
    public void Show(int slider){
        int c = 1
            if Slider_IsShowed[slider]{
                Slider_IsShowed[slider] = false
                ShowDestructable(Slider_Button[slider][1], false)
                ShowDestructable(Slider_Button[slider][2], false)
                ShowDestructable(Slider_Knob[slider], false)
                SetTextTagVisibility(Slider_Text[slider], false)
                while (Slider_Borders[slider][c] != null) { ShowDestructable(Slider_Borders[slider][c], false); c++ }
            }
            else {
                Slider_IsShowed[slider] = true
                ShowDestructable(Slider_Button[slider][1], true)
                ShowDestructable(Slider_Button[slider][2], true)
                ShowDestructable(Slider_Knob[slider], true)
                SetTextTagVisibility(Slider_Text[slider], true)
                while (Slider_Borders[slider][c] != null) { ShowDestructable(Slider_Borders[slider][c], true); c++ }
            }
    }
    
    private void ButtonClickedAct(){
        int slider = GetByButtonTrackable(GetTriggeringTrackable())
        real pos
            if Slider_IsShowed[slider] {
            StartSound(GUI_ClickSound)
                // min =>
                if (Slider_ButtonTrackable[slider][1] == GetTriggeringTrackable() and Slider_Value[slider][3] > Slider_Value[slider][1]) {
                    Slider_Value[slider][3]--
                    if Slider_Value[slider][3] < Slider_Value[slider][1] { Slider_Value[slider][3] = Slider_Value[slider][1] }
                    elseif Slider_Value[slider][3] > Slider_Value[slider][2] { Slider_Value[slider][3] = Slider_Value[slider][2] }
                        // min
                        if Slider_Value[slider][3] == Slider_Value[slider][1] {
                            pos = 0.
                        }
                        // =>
                        else {
                            if Slider_Value[slider][1] > 0 {
                                //msg(R2S(GetPosition(Slider_Value[slider][1], Slider_Value[slider][2], Slider_Value[slider][3])))
                                pos = Slider_Length[slider] * GetPosition(Slider_Value[slider][1], Slider_Value[slider][2], Slider_Value[slider][3])
                            }
                            else {
                                pos = Slider_Length[slider] * (Slider_Value[slider][3] / Slider_Value[slider][2])
                                    //if pos < Slider_StartCoords[slider][1] { pos = 0. }
                                    //elseif pos > (Slider_StartCoords[slider][1] + Slider_Length[slider]) { pos = Slider_Length[slider] }
                            }
                        }
                        // text
                        if Slider_Text[slider] != null {
                            if Slider_TextType[slider] {
                                SetTextTagText(Slider_Text[slider], R2S(Slider_Value[slider][3]), (Slider_TextSize[slider] * 0.023) / 10.)
                            }
                            else {
                                SetTextTagText(Slider_Text[slider], I2S(R2I(Slider_Value[slider][3])), (Slider_TextSize[slider] * 0.023) / 10.)
                            }
                        }
                    RemoveDestructable(Slider_Knob[slider])
                    Slider_Knob[slider] = CreateDestructable(Slider_Variation[slider], Slider_StartCoords[slider][1] + pos, Slider_StartCoords[slider][3], 0., Slider_ScaleMod[SlidersCount][1] - 0.1, 0)
                }
                // <= max
                elseif (Slider_ButtonTrackable[slider][2] == GetTriggeringTrackable() and Slider_Value[slider][3] < Slider_Value[slider][2]) {
                    Slider_Value[slider][3]++
                        // max
                        if Slider_Value[slider][3] == Slider_Value[slider][2] {
                            pos = Slider_Length[slider]
                        }
                        // <=
                        else {
                            if Slider_Value[slider][1] > 0 {
                                //msg(R2S(GetPosition(Slider_Value[slider][1], Slider_Value[slider][2], Slider_Value[slider][3])))
                                pos = Slider_Length[slider] * GetPosition(Slider_Value[slider][1], Slider_Value[slider][2], Slider_Value[slider][3])
                            }
                            else {
                                pos = Slider_Length[slider] * (Slider_Value[slider][3] / Slider_Value[slider][2])
                            }
                        }
                        // text
                        if Slider_Text[slider] != null {
                            if Slider_TextType[slider] {
                                SetTextTagText(Slider_Text[slider], R2S(Slider_Value[slider][3]), (Slider_TextSize[slider] * 0.023) / 10.)
                            }
                            else {
                                SetTextTagText(Slider_Text[slider], I2S(R2I(Slider_Value[slider][3])), (Slider_TextSize[slider] * 0.023) / 10.)
                            }
                        }
                    RemoveDestructable(Slider_Knob[slider])
                    Slider_Knob[slider] = CreateDestructable(Slider_Variation[slider], Slider_StartCoords[slider][1] + pos, Slider_StartCoords[slider][3], 0., Slider_ScaleMod[SlidersCount][1] - 0.1, 0)
                }
            }
    }
    
    private void SliderClickedAct(){
        int slider = GetBySliderTrackable(GetTriggeringTrackable()), track_number = LoadInteger(hash, H2I(GetTriggeringTrackable()), 0) - 1
        real pos
            if Slider_IsShowed[slider] {
                StartSound(GUI_ClickSound)
                RemoveDestructable(Slider_Knob[slider])
                Slider_Value[slider][3] = Slider_Value[slider][1] + (Slider_StepByTrack[slider] * I2R(track_number))
                    //if Slider_Value[slider][3] < Slider_Value[slider][1] { Slider_Value[slider][3] = Slider_Value[slider][1] }
                    //elseif Slider_Value[slider][3] > Slider_Value[slider][2] { Slider_Value[slider][3] = Slider_Value[slider][2] }
                    // min
                    if track_number == 0 {
                        Slider_Value[slider][3] = Slider_Value[slider][1]
                        pos = 0.
                    }
                    // max
                    elseif track_number == Slider_TrackableCount[slider] {
                        Slider_Value[slider][3] = Slider_Value[slider][2]
                        pos = Slider_Length[slider] * (Slider_Value[slider][3] / Slider_Value[slider][2])
                    }
                    // min <=> max
                    else {
                        if Slider_Value[slider][1] > 0 {
                            pos = Slider_Length[slider] * GetPosition(Slider_Value[slider][1], Slider_Value[slider][2], Slider_Value[slider][3])
                        }
                        else {
                            pos = Slider_Length[slider] * (Slider_Value[slider][3] / Slider_Value[slider][2])
                        }
                    }
                    // text
                        if Slider_Text[slider] != null {
                            if Slider_TextType[slider] {
                                SetTextTagText(Slider_Text[slider], R2S(Slider_Value[slider][3]), (Slider_TextSize[slider] * 0.023) / 10.)
                            }
                            else {
                                SetTextTagText(Slider_Text[slider], I2S(R2I(Slider_Value[slider][3])), (Slider_TextSize[slider] * 0.023) / 10.)
                            }
                        }
                Slider_Knob[slider] = CreateDestructable(Slider_Variation[slider], Slider_StartCoords[slider][1] + pos, Slider_StartCoords[slider][3], 0., Slider_ScaleMod[slider][1] - 0.1, 0)
            }
    }
    
    public void SetMinMaxCurrentValue(int slider_id, int min, int max, int current){
        real pos
            Slider_Value[slider_id][1] = min
            Slider_Value[slider_id][2] = max
            Slider_Value[slider_id][3] = current
            // start position is min
            if Slider_Value[slider_id][3] == Slider_Value[slider_id][1] 
                { pos = 0. }
            // start position is max
            elseif Slider_Value[slider_id][3] == Slider_Value[slider_id][2] 
                { pos = Slider_Length[slider_id] }
            // start position is min <=> max
            else {
                if Slider_Value[slider_id][1] > 0 {
                    pos = Slider_Length[slider_id] * GetPosition(Slider_Value[slider_id][1], Slider_Value[slider_id][2], Slider_Value[slider_id][3])
                }
                else {
                    pos = Slider_Length[slider_id] * (Slider_Value[slider_id][3] / Slider_Value[slider_id][2])
                }
            }
            Slider_Knob[slider_id] = CreateDestructable(Slider_Variation[slider_id], Slider_StartCoords[slider_id][1] + pos, Slider_StartCoords[slider_id][3], 0., Slider_ScaleMod[slider_id][1] - 0.1, 0)
            if Slider_TrackableCount[slider_id] < max {
                Slider_StepByTrack[slider_id] = (Slider_Value[slider_id][2] - Slider_Value[slider_id][1]) / I2R(Slider_TrackableCount[slider_id])
            }
            else {
                Slider_StepByTrack[slider_id] = I2R(max) / I2R(Slider_TrackableCount[slider_id])
            }
    }
    
    
    public int AddByX_EX(real start_x, real flat_y, int length, real scale, int variation){
        real x
        int index = 3, current_trackables = 0, current_length = 0
            SlidersCount++
            Slider_IsShowed[SlidersCount] = true
            Slider_ScaleMod[SlidersCount][1] = scale
            Slider_ScaleMod[SlidersCount][2] = (30. * scale)
            Slider_StartCoords[SlidersCount][1] = start_x + (60. * scale)
            Slider_StartCoords[SlidersCount][3] = flat_y
            Slider_Text[SlidersCount] = null
            Slider_TextType[SlidersCount] = false
            Slider_Length[SlidersCount] = 0.
            x = Slider_StartCoords[SlidersCount][1]
            
            // button down
            Slider_ButtonTrackable[SlidersCount][1] = CreateTrackable("war3mapImported\\GUI_Slider_Button_Trackable.mdx", start_x - (20. * scale), flat_y, 0.)
            TriggerRegisterTrackableHitEvent(ButtonClicked, Slider_ButtonTrackable[SlidersCount][1])
            Slider_Button[SlidersCount][1] = CreateDestructable(SLIDER_BUTTON_DOWN, start_x, flat_y, 270., scale - 0.2, 0)
            
            // slider edge
            Slider_Borders[SlidersCount][1] = CreateDestructable(SLIDER_BORDER_END, Slider_StartCoords[SlidersCount][1] - (12. * scale), flat_y, 180., scale, 0)
           
            // borders
            while (current_length <= length) {
                Slider_Borders[SlidersCount][index] = CreateDestructable(SLIDER_BORDER, x, flat_y, 0., scale, 0)
                x += Slider_ScaleMod[SlidersCount][2]
                Slider_Length[SlidersCount] += Slider_ScaleMod[SlidersCount][2]
                current_length++
                index++
            }
            
            Slider_StartCoords[SlidersCount][2] = x
            x = x + (60. * scale)
            
            // end border
            Slider_Borders[SlidersCount][index] = CreateDestructable(SLIDER_BORDER, Slider_StartCoords[SlidersCount][2], flat_y, 0., scale, 0)
            Slider_Borders[SlidersCount][2] = CreateDestructable(SLIDER_BORDER_END, Slider_StartCoords[SlidersCount][2] + (12. * scale), flat_y, 0., scale, 0)
            
            // button up
            Slider_ButtonTrackable[SlidersCount][2] = CreateTrackable("war3mapImported\\GUI_Slider_Button_Trackable.mdx", x + (30. * scale), flat_y, 0.)
            TriggerRegisterTrackableHitEvent(ButtonClicked, Slider_ButtonTrackable[SlidersCount][2])
            Slider_Button[SlidersCount][2] = CreateDestructable(SLIDER_BUTTON_UP, x, flat_y, 270., scale - 0.2, 0)
            
            
            // border trackables
            Slider_TrackableCount[SlidersCount] = R2I(Slider_Length[SlidersCount] / 15.) + 1
            x = Slider_StartCoords[SlidersCount][1]
            while(current_trackables++ <= Slider_TrackableCount[SlidersCount]){
                Slider_Trackable[SlidersCount][current_trackables] = CreateTrackable("war3mapImported\\GUI_Slider_Base_Trackable.mdx", x, flat_y, 0.)
                TriggerRegisterTrackableHitEvent(SliderClicked, Slider_Trackable[SlidersCount][current_trackables])
                SaveInteger(hash, H2I(Slider_Trackable[SlidersCount][current_trackables]), 0, current_trackables)
                x += 15.2
            }
            
            // knob
            if variation == HUMAN_KNOB { Slider_Variation[SlidersCount] = KNOB_HUMAN_ID }
            elseif variation == ORC_KNOB { Slider_Variation[SlidersCount] = KNOB_ORC_ID }
            elseif variation == ELF_KNOB { Slider_Variation[SlidersCount] = KNOB_ELF_ID }
            elseif variation == UNDEAD_KNOB { Slider_Variation[SlidersCount] = KNOB_UNDEAD_ID }
        return SlidersCount
    }

    private void Init(){
        TriggerAddAction(ButtonClicked, function ButtonClickedAct)
        TriggerAddAction(SliderClicked, function SliderClickedAct)
    }
    
endlibrary
Top