System Screen Resolution

Sevion

The DIY Ninja
Screen Resolution
1.2.0.2
By Sevion

Very efficient method of getting a player's screen resolution. Requires players to "calibrate" the screen.
V1.3.0.0 will appear with a separate module library to allow for the easier creation of dialogs (eliminates the scripters' need to multiply all values by aspect ratio).


Docs
  • What Screen Resolution does:
    Screen Resolution allows scripters to get a player's screen resolution and aspect ratio to easily display the correct sizes and x/y offests for dialogs and other on-screen objects.
  • How Screen Resolution was made:
    While making some dialogs, I got the idea that while they display correctly in my 1920 x 1080 resolution, it may not display correctly in any others. So, I tested around and was correct. With this, you just have to use the getAsPercent functions and you'll get the proper values.

  • Get a player's screen properties:
    • [ljass]lib_sr_getResX( EventPlayer() )[/ljass]
    • [ljass]lib_sr_getResY( EventPlayer() )[/ljass]
    • [ljass]lib_sr_getRatio( EventPlayer() )[/ljass]
    • [ljass]lib_sr_isCalibrated( EventPlayer() )[/ljass]
    • [ljass]lib_sr_getXAsPercent( value, EventPlayer() )[/ljass]
    • [ljass]lib_sr_getYAsPercent( value, EventPlayer() )[/ljass]
  • Calibrate a player's screen:

    • [ljass]lib_sr_calibrate( EventPlayer() )[/ljass]

JASS:
//==================================================================================================
// 
// Library
// 
// Name:   Screen Resolution
// Author: Sevion
// 
//==================================================================================================
include "TriggerLibs/NativeLib"
include "Libraries/DebugMode"

//==================================================================================================
//
// System Globals
//
//==================================================================================================

static bank[16] lib_sr__banks;
static bool[16] lib_sr__calibrated;
static int[16] lib_sr__resX;
static int[16] lib_sr__resY;
static fixed[16] lib_sr__ratio;
static bool[16] lib_sr__gettingResolution;
static const int lib_sr__RESOLUTION_COUNT = 97;
static int[lib_sr__RESOLUTION_COUNT][2] lib_sr__resolutions;

//==================================================================================================
//
// System Script
//
//==================================================================================================

int lib_sr_getResX ( int whichPlayer ) {
    if ( !lib_sr__calibrated[whichPlayer] ) {
        if (DEBUG_MODE)
        {
            lib_dm_debugMsg("ERROR (Screen Resolution): Attempted to get uncalibrated Resolution Width!");
        }
        return -1;
    }
    return lib_sr__resX[whichPlayer];
}

int lib_sr_getResY ( int whichPlayer ) {
    if ( !lib_sr__calibrated[whichPlayer] ) {
        if (DEBUG_MODE)
        {
            lib_dm_debugMsg("ERROR (Screen Resolution): Attempted to get uncalibrated Resolution Height!");
        }
        return -1;
    }
    return lib_sr__resY[whichPlayer];
}

fixed lib_sr_getRatio ( int whichPlayer ) {
    if ( !lib_sr__calibrated[whichPlayer] ) {
        if (DEBUG_MODE)
        {
            lib_dm_debugMsg("ERROR (Screen Resolution): Attempted to get uncalibrated Resolution Ratio!");
        }
        return -1;
    }
    return lib_sr__ratio[whichPlayer];
}

int lib_sr_getXAsPercent ( int value, int whichPlayer ) {
    if ( !lib_sr__calibrated[whichPlayer] ) {
        if (DEBUG_MODE)
        {
            lib_dm_debugMsg("ERROR (Screen Resolution): Attempted to get uncalibrated Resolution X Percentage!");
        }
        return -1;
    }
    return value / lib_sr__resX[whichPlayer];
}

int lib_sr_getYAsPercent ( int value, int whichPlayer ) {
    if ( !lib_sr__calibrated[whichPlayer] ) {
        if (DEBUG_MODE)
        {
            lib_dm_debugMsg("ERROR (Screen Resolution): Attempted to get uncalibrated Resolution Y Percentage!");
        }
        return -1;
    }
    return value / lib_sr__resY[whichPlayer];
}

bool lib_sr_isCalibrated ( int whichPlayer ) {
    return lib_sr__calibrated[whichPlayer];
}

bool lib_sr_getResolutions (bool testConds, bool runActions) {
    int lv_x;
    int lv_y;
    int lv_p;
    int lv_i;
    int lv_temp;
    if (!runActions) {
        return true;
    }
    
    lv_x = EventMouseClickedPosXUI() + 1;
    lv_y = EventMouseClickedPosYUI() + 1;
    lv_p = EventPlayer();
    
    lv_i = lib_sr__RESOLUTION_COUNT - 1;
    lv_temp = 0;
    while ( lv_i >= 0 ) {
        if ( lv_x == lib_sr__resolutions[lv_i][0] && lv_y == lib_sr__resolutions[lv_i][1] ) {
            lv_temp = lv_i;
            lv_i = -1;
        }
        if ( lv_x > lib_sr__resolutions[lv_i][0] || lv_y > lib_sr__resolutions[lv_i][1] ) {
            lv_temp = lv_i;
        }
        lv_i -= 1;
    }
    
    lib_sr__resX[lv_p] = lib_sr__resolutions[lv_temp][0];
    lib_sr__resY[lv_p] = lib_sr__resolutions[lv_temp][1];
    lib_sr__ratio[lv_p] = lib_sr__resX[lv_p] / lib_sr__resY[lv_p];
    
    BankValueSetFromInt(lib_sr__banks[lv_p], "screenData", "resolutionX", lib_sr__resX[lv_p]);
    BankValueSetFromInt(lib_sr__banks[lv_p], "screenData", "resolutionY", lib_sr__resY[lv_p]);
    BankValueSetFromFixed(lib_sr__banks[lv_p], "screenData", "aspectratio", lib_sr__ratio[lv_p]);
    lib_sr__gettingResolution[lv_p] = false;
    return false;
}

void lib_sr_calibrate ( int whichPlayer ) {
    trigger lv_tempTrig;
    
    libNtve_gf_HideGameUI(false, PlayerGroupSingle(whichPlayer));
    
    lv_tempTrig = TriggerCreate("getResolutions");
    TriggerAddEventMouseClicked(lv_tempTrig, whichPlayer, c_mouseButtonLeft, true);
    UIDisplayMessage(PlayerGroupSingle(whichPlayer), c_messageAreaDirective, StringToText("Please calibrate your resolution by clicking in the bottom right corner."));
    lib_sr__gettingResolution[whichPlayer] = true;
    
    while ( lib_sr__gettingResolution[whichPlayer] && PlayerGroupHasPlayer(PlayerGroupActive(), whichPlayer) ) {
        Wait(0.0, c_timeGame);
    }
    
    TriggerDestroy(lv_tempTrig);
    BankValueSetFromFlag(lib_sr__banks[whichPlayer], "screenData", "lib_sr__calibrated", true);
    lib_sr__calibrated[whichPlayer] = true;
    
    UIClearMessages(PlayerGroupSingle(whichPlayer), c_messageAreaDirective);
    libNtve_gf_HideGameUI(true, PlayerGroupSingle(whichPlayer));
}

//--------------------------------------------------------------------------------------------------
// Library Initialization
//--------------------------------------------------------------------------------------------------
static void lib_sr__InitVariables() {
    int lv_i = 15;
    while ( lv_i >= 0 ) {
        lib_sr__banks[lv_i] = BankLoad("lib_sr__screenData", lv_i);
        lib_sr__calibrated[lv_i] = BankValueGetAsFlag(lib_sr__banks[lv_i], "screenData", "lib_sr__calibrated");
        if ( lib_sr__calibrated[lv_i] ) {
            lib_sr__resX[lv_i] = BankValueGetAsInt(lib_sr__banks[lv_i], "screenData", "resolutionX");
            lib_sr__resX[lv_i] = BankValueGetAsInt(lib_sr__banks[lv_i], "screenData", "resolutionY");
            lib_sr__resX[lv_i] = BankValueGetAsInt(lib_sr__banks[lv_i], "screenData", "aspectratio");
        }
        lib_sr__gettingResolution[lv_i] = false;
        lv_i -= 1;
    }
    lib_sr__resolutions[0][0] = 1024;
    lib_sr__resolutions[0][1] = 768;
    lib_sr__resolutions[1][0] = 1280;
    lib_sr__resolutions[1][1] = 800;
    lib_sr__resolutions[2][0] = 1280;
    lib_sr__resolutions[2][1] = 1024;
    lib_sr__resolutions[3][0] = 1440;
    lib_sr__resolutions[3][1] = 900;
    lib_sr__resolutions[4][0] = 1680;
    lib_sr__resolutions[4][1] = 1050;
    lib_sr__resolutions[5][0] = 1366;
    lib_sr__resolutions[5][1] = 768;
    lib_sr__resolutions[6][0] = 800;
    lib_sr__resolutions[6][1] = 600;
    lib_sr__resolutions[7][0] = 1152;
    lib_sr__resolutions[7][1] = 864;
    lib_sr__resolutions[8][0] = 1920;
    lib_sr__resolutions[8][1] = 1080;
    lib_sr__resolutions[9][0] = 1280;
    lib_sr__resolutions[9][1] = 768;
    lib_sr__resolutions[10][0] = 1600;
    lib_sr__resolutions[10][1] = 900;
    lib_sr__resolutions[11][0] = 1024;
    lib_sr__resolutions[11][1] = 600;
    lib_sr__resolutions[12][0] = 1280;
    lib_sr__resolutions[12][1] = 720;
    lib_sr__resolutions[13][0] = 1280;
    lib_sr__resolutions[13][1] = 960;
    lib_sr__resolutions[14][0] = 320;
    lib_sr__resolutions[14][1] = 396;
    lib_sr__resolutions[15][0] = 320;
    lib_sr__resolutions[15][1] = 480;
    lib_sr__resolutions[16][0] = 1360;
    lib_sr__resolutions[16][1] = 768;
    lib_sr__resolutions[17][0] = 1600;
    lib_sr__resolutions[17][1] = 1200;
    lib_sr__resolutions[18][0] = 1400;
    lib_sr__resolutions[18][1] = 1050;
    lib_sr__resolutions[19][0] = 1024;
    lib_sr__resolutions[19][1] = 640;
    lib_sr__resolutions[20][0] = 1152;
    lib_sr__resolutions[20][1] = 720;
    lib_sr__resolutions[21][0] = 1093;
    lib_sr__resolutions[21][1] = 614;
    lib_sr__resolutions[22][0] = 768;
    lib_sr__resolutions[22][1] = 1024;
    lib_sr__resolutions[23][0] = 1024;
    lib_sr__resolutions[23][1] = 819;
    lib_sr__resolutions[24][0] = 1344;
    lib_sr__resolutions[24][1] = 840;
    lib_sr__resolutions[25][0] = 819;
    lib_sr__resolutions[25][1] = 614;
    lib_sr__resolutions[26][0] = 1024;
    lib_sr__resolutions[26][1] = 576;
    lib_sr__resolutions[27][0] = 2560;
    lib_sr__resolutions[27][1] = 1440;
    lib_sr__resolutions[28][0] = 1536;
    lib_sr__resolutions[28][1] = 864;
    lib_sr__resolutions[29][0] = 1311;
    lib_sr__resolutions[29][1] = 737;
    lib_sr__resolutions[30][0] = 240;
    lib_sr__resolutions[30][1] = 320;
    lib_sr__resolutions[31][0] = 1280;
    lib_sr__resolutions[31][1] = 854;
    lib_sr__resolutions[32][0] = 960;
    lib_sr__resolutions[32][1] = 600;
    lib_sr__resolutions[33][0] = 2560;
    lib_sr__resolutions[33][1] = 1600;
    lib_sr__resolutions[34][0] = 320;
    lib_sr__resolutions[34][1] = 240;
    lib_sr__resolutions[35][0] = 1536;
    lib_sr__resolutions[35][1] = 960;
    lib_sr__resolutions[36][0] = 480;
    lib_sr__resolutions[36][1] = 360;
    lib_sr__resolutions[37][0] = 1441;
    lib_sr__resolutions[37][1] = 810;
    lib_sr__resolutions[38][0] = 640;
    lib_sr__resolutions[38][1] = 480;
    lib_sr__resolutions[39][0] = 1080;
    lib_sr__resolutions[39][1] = 810;
    lib_sr__resolutions[40][0] = 480;
    lib_sr__resolutions[40][1] = 320;
    lib_sr__resolutions[41][0] = 1249;
    lib_sr__resolutions[41][1] = 702;
    lib_sr__resolutions[42][0] = 1120;
    lib_sr__resolutions[42][1] = 700;
    lib_sr__resolutions[43][0] = 234;
    lib_sr__resolutions[43][1] = 282;
    lib_sr__resolutions[44][0] = 983;
    lib_sr__resolutions[44][1] = 737;
    lib_sr__resolutions[45][0] = 1067;
    lib_sr__resolutions[45][1] = 800;
    lib_sr__resolutions[46][0] = 1024;
    lib_sr__resolutions[46][1] = 614;
    lib_sr__resolutions[47][0] = 1192;
    lib_sr__resolutions[47][1] = 670;
    lib_sr__resolutions[48][0] = 1067;
    lib_sr__resolutions[48][1] = 600;
    lib_sr__resolutions[49][0] = 1024;
    lib_sr__resolutions[49][1] = 1024;
    lib_sr__resolutions[50][0] = 480;
    lib_sr__resolutions[50][1] = 800;
    lib_sr__resolutions[51][0] = 853;
    lib_sr__resolutions[51][1] = 533;
    lib_sr__resolutions[52][0] = 1600;
    lib_sr__resolutions[52][1] = 1000;
    lib_sr__resolutions[53][0] = 1600;
    lib_sr__resolutions[53][1] = 1024;
    lib_sr__resolutions[54][0] = 911;
    lib_sr__resolutions[54][1] = 512;
    lib_sr__resolutions[55][0] = 1140;
    lib_sr__resolutions[55][1] = 641;
    lib_sr__resolutions[56][0] = 1229;
    lib_sr__resolutions[56][1] = 983;
    lib_sr__resolutions[57][0] = 1680;
    lib_sr__resolutions[57][1] = 945;
    lib_sr__resolutions[58][0] = 800;
    lib_sr__resolutions[58][1] = 480;
    lib_sr__resolutions[59][0] = 1229;
    lib_sr__resolutions[59][1] = 768;
    lib_sr__resolutions[60][0] = 480;
    lib_sr__resolutions[60][1] = 854;
    lib_sr__resolutions[61][0] = 1525;
    lib_sr__resolutions[61][1] = 857;
    lib_sr__resolutions[62][0] = 1382;
    lib_sr__resolutions[62][1] = 864;
    lib_sr__resolutions[63][0] = 1170;
    lib_sr__resolutions[63][1] = 936;
    lib_sr__resolutions[64][0] = 983;
    lib_sr__resolutions[64][1] = 576;
    lib_sr__resolutions[65][0] = 1143;
    lib_sr__resolutions[65][1] = 857;
    lib_sr__resolutions[66][0] = 1120;
    lib_sr__resolutions[66][1] = 840;
    lib_sr__resolutions[67][0] = 1058;
    lib_sr__resolutions[67][1] = 595;
    lib_sr__resolutions[68][0] = 2048;
    lib_sr__resolutions[68][1] = 1152;
    lib_sr__resolutions[69][0] = 853;
    lib_sr__resolutions[69][1] = 683;
    lib_sr__resolutions[70][0] = 922;
    lib_sr__resolutions[70][1] = 691;
    lib_sr__resolutions[71][0] = 240;
    lib_sr__resolutions[71][1] = 160;
    lib_sr__resolutions[72][0] = 2560;
    lib_sr__resolutions[72][1] = 1024;
    lib_sr__resolutions[73][0] = 1613;
    lib_sr__resolutions[73][1] = 1008;
    lib_sr__resolutions[74][0] = 360;
    lib_sr__resolutions[74][1] = 640;
    lib_sr__resolutions[75][0] = 936;
    lib_sr__resolutions[75][1] = 702;
    lib_sr__resolutions[76][0] = 1088;
    lib_sr__resolutions[76][1] = 614;
    lib_sr__resolutions[77][0] = 1117;
    lib_sr__resolutions[77][1] = 894;
    lib_sr__resolutions[78][0] = 360;
    lib_sr__resolutions[78][1] = 480;
    lib_sr__resolutions[79][0] = 1350;
    lib_sr__resolutions[79][1] = 844;
    lib_sr__resolutions[80][0] = 1152;
    lib_sr__resolutions[80][1] = 870;
    lib_sr__resolutions[81][0] = 1440;
    lib_sr__resolutions[81][1] = 960;
    lib_sr__resolutions[82][0] = 683;
    lib_sr__resolutions[82][1] = 512;
    lib_sr__resolutions[83][0] = 1080;
    lib_sr__resolutions[83][1] = 633;
    lib_sr__resolutions[84][0] = 1069;
    lib_sr__resolutions[84][1] = 855;
    lib_sr__resolutions[85][0] = 1317;
    lib_sr__resolutions[85][1] = 823;
    lib_sr__resolutions[86][0] = 1365;
    lib_sr__resolutions[86][1] = 1024;
    lib_sr__resolutions[87][0] = 1350;
    lib_sr__resolutions[87][1] = 1080;
    lib_sr__resolutions[88][0] = 819;
    lib_sr__resolutions[88][1] = 480;
    lib_sr__resolutions[89][0] = 1170;
    lib_sr__resolutions[89][1] = 731;
    lib_sr__resolutions[90][0] = 1017;
    lib_sr__resolutions[90][1] = 572;
    lib_sr__resolutions[91][0] = 1024;
    lib_sr__resolutions[91][1] = 1280;
    lib_sr__resolutions[92][0] = 1117;
    lib_sr__resolutions[92][1] = 698;
    lib_sr__resolutions[93][0] = 1519;
    lib_sr__resolutions[93][1] = 949;
    lib_sr__resolutions[94][0] = 854;
    lib_sr__resolutions[94][1] = 480;
    lib_sr__resolutions[95][0] = 1300;
    lib_sr__resolutions[95][1] = 2300;
    lib_sr__resolutions[96][0] = 1276;
    lib_sr__resolutions[96][1] = 733;
}

static bool lib_sr__InitLib_completed = false;

void lib_sr_InitLib() {
    if (lib_sr__InitLib_completed) {
        return;
    }

    lib_sr__InitVariables();

    lib_sr__InitLib_completed = true;
}


Change Log
1.0.0.0 said:
Initial Release
1.0.0.1 said:
Fixed a minor bug on calibration boolean not saving
1.0.0.2 said:
Fixed a minor bug on array initialization.
1.1.0.0 said:
Added the misclick algorithm.
1.2.0.0 said:
Changed function names and added Dialog module.
1.2.0.1 said:
Added a bunch of resolutions. Ninety-seven in total now. All from here and listed from most common to least common.
1.2.0.2 said:
Added [ljass]lib_sr_getXAsPercent ( value, EventPlayer() )[/ljass] and [ljass]lib_sr_getYAsPercent( value, EventPlayer() )[/ljass].
 

Frozenwind

System maker
This was what I was looking for 1,5 week ago, yet calibrating isn't the perfect solution. But I guess there is no way to detect the screen resolution without calibrating? At least, nothing I tried seemed to work. Yet I didn't want to make a calibration system by myself as I highly doubted it would work out. I mean, calibrating is a solution, yet I doubt it's very efficient as a lot of people are simply too retarded to do it. In wc3 I made a game, very simple with only 1 skill (morph skill). Only 70% of the people understood what it did (change from water to land / land to water form). That can't be that hard, or is it?

Good job anyway. +rep.
 

Sevion

The DIY Ninja
Well, calibration is really simple and efficient ( in this ) anyhow. It's a simple click. And you only have to calibrate once every time you change your resolution ( and how many times do you do that unless you're moving around the windowed mode :p )

Also, maybe sometime I'll make it GUIable.

Edit: I just saw an error in the code. I forget to save the calibrated boolean :eek:
 

The Undaddy

Creating with the power of rage
Well I haven't used dialogs so far but I don't see how this would not be useful.If I get around to creating some (because I'm addicted to triggering random stuff) I'll be sure to post something more constructive.
 

Sevion

The DIY Ninja
Update: V1.1.0.0 has been released with the Misclick Algorithm.

DialogX has been pushed back to V1.2.0.0 (I am considering releasing as a separate library instead of a module)
 

Sevion

The DIY Ninja
Update: V1.2.0.1 has been released with a massive increase (83 new resolutions) in resolutions and are now ordered in most commonly used.

DialogX has been pushed back to 1.3.0.0.

Update: V1.2.0.2 has been released with the additions of the getAsPercent functions.
 

X-maul

AKA: Demtrod
I feel slightly retarded for not knowing this.. How do I use it? First I create a custom script trigger and copy paste your code, and then what?
If I (on my 1920x1080 resolution screen) got 500x400 dialog box, then what do I do with you function to make it scale with other resolutions??
 

Sevion

The DIY Ninja
You have to call "lib_sr_calibrate" on a player. Once it's calibrated, you can get the resolution values with "lib_sr_getResX" and "lib_sr_getResY".
 

X-maul

AKA: Demtrod
Uhm, If I wan't to check it for all players, how would that look? (I'm not expirienced with custom script)

I will have to multiply the value by a percentage (0.5 for 50%) value and scale it for a % of the screen.
BTW, I'm getting these two errors when I import the script:
 

Sevion

The DIY Ninja
Unfortunately I believe an update has ruined the system. :-/

And yes, DebugMode is my library linked by Siretu.
 
General chit-chat
Help Users
  • No one is chatting at the moment.
  • C Cherry.Grove:
    My boyfriend is super into Bethesda modding so I'm probably going to join him in that for a bit, then move on to making mobile/browser games.
  • C Cherry.Grove:
    I mostly just want to look at my old projects because I know I posted uploads on here somewhere.
  • C Cherry.Grove:
    My one game was basically Among Us but you sabotaged an entire medieval city simulated drastically inefficiently with dynamic NPCs :S
  • C Cherry.Grove:
    of course I never finished it x D
  • jonas jonas:
    xD
  • jonas jonas:
    I think you can still run the original game, just there's a chance your map won't work with the newer patches
  • jonas jonas:
    what development framework have you been looking at for mobile development?
  • jonas jonas:
    I'm currently creating (as a hobby) a space invaders like game for mobile using Xamarin, after starting a few larger projects that I also may not have finished :rolleyes::p
  • The Helper The Helper:
    Awesome! you should look at the Atari VCS platform it does not have a huge user base but the one it has is super active at around 11k and they have no games in there store
  • The Helper The Helper:
    basically it is linux
  • The Helper The Helper:
    OMG it is BanLord as Blackveiled on the forum
  • The Helper The Helper:
    what is up buddy
  • jonas jonas:
    thanks for the tip, that sounds cool. Never heard about the VCS before but seems like it should be a good match
  • tom_mai78101 tom_mai78101:
    The winter vacation left a toll on me. I missed staying up late and sleeping in late.
  • C Cherry.Grove:
    i haven't looked into it yet
  • C Cherry.Grove:
    If I could use something Python compatible it would save me some learning
  • C Cherry.Grove:
    But Unity might be easiest
  • C Cherry.Grove:
    looking at old posts here makes me happy. Makes me be all like "wow I was pretty smart in 2009"
  • C Cherry.Grove:
    mostly failing at life through adulthood really demotivated me for a while
  • C Cherry.Grove:
    ....what I don't get is why the fuck they would force us to permanently convert to a version of the game everyone fucking hated : \
  • C Cherry.Grove:
    Raid Shadow Legends texture pack smh
  • jonas jonas:
    Most people fail at life throughout their adulthood. Sometimes we get to learn from it. Usually it just feels like crap.
  • The Helper The Helper:
    What does not kill you makes you stronger is what they say
  • C Cherry.Grove:
    for real! :cool:

    Members online

    No members online now.

    Affiliates

    Hive Workshop NUON Dome
    Top