splashscreen.inc
splashscreen.inc
CPP1#include "string.inc"2#include "leaderboard.inc"3#include "graphics.inc"4#include "topology.inc"5#include "log.inc"67/****d* PawnLibs/splashscreen/e_ssScreensType8 * Summary9 * Enum the main preset types of screens.10 * Synopsis11 */12const e_ssScreensType: {13 ssEmpty = 0,14 ssFirstLeaderGroup,15 ssSecondLeaderGroup,16 ssHighScore,17 ssLeaderboardSprite,18 ssAppName,19 ssMainImage,20 ssLastResultsSprite,21 ssLastParameter1,22 ssLastParameter2,23 ssLastParameter3,24 ssTwistIcon,25 ssTwistLabelWithIcon,26 ssTwistLabelWithoutIcon,27 ssPatIcon,28 ssPatLabelWithIcon,29 ssPatLabelWithoutIcon,30 ssQRCode,31 ssTypeMax,32}33/*34 * Description35 * * ssEmpty - A blank screen, only the background is displayed36 * * ssFirstLeaderGroup - Leaderboard screen with 1-5 positions37 * * ssSecondLeaderGroup - Leaderboard screen with 6-10 positions38 * * ssHighScore - The display screen of the personal best or39 * the top score of the leaderboard40 * * ssLeaderboardSprite - Leaderboard sprite screen41 * * ssAppName - App title screen42 * * ssMainImage - App logo screen43 * * ssLastResultsSprite - Last results sprite screen44 * * ssLastParameter1 - Parameter1 screen45 * * ssLastParameter2 - Parameter2 screen46 * * ssLastParameter3 - Parameter3 screen47 * * ssTwistIcon - Twist icon screen without label48 * * ssTwistLabelWithIcon - Twist label screen with icon49 * * ssTwistLabelWithoutIcon - Twist label screen without label50 * * ssPatIcon - Pat icon screen without label51 * * ssPatLabelWithIcon - Pat label screen with icon52 * * ssPatLabelWithoutIcon - Pat label screen without label53 * * ssQRCode - QR code screen54 * * ssTypeMax - The maximum value of the types is used as the55 first value of the user-defined types56 ******/5758/****d* PawnLibs/splashscreen/SPLASH_SCREEN_MAX_LEADERS59 * Summary60 * How many leaders can be displayed on the splash screen.61 * Synopsis62 */63#define SPLASH_SCREEN_MAX_LEADERS 1064/******/6566/****d* PawnLibs/splashscreen/SPLASH_SCREEN_MAX_PARAMETERS67 * Summary68 * How many different detailed parametr types exist.69 * Synopsis70 */71#define SPLASH_SCREEN_MAX_PARAMETERS 372/******/7374/****d* PawnLibs/splashscreen/LEADERBOARD_SIZE75 * Summary76 * The size of the leaderboard array obtained in LB_getScore.77 * Synopsis78 */79#define LEADERBOARD_SIZE 3080/******/8182/****d* PawnLibs/splashscreen/STRING_VALUE_SIZE83 * Summary84 * The maximum length of a string to output a value.85 * Synopsis86 */87#define STRING_VALUE_SIZE 1588/******/8990/****s* PawnLibs/splashscreen/LEADER_DATA91 * Summary92 * Array with named fields which represents a line in score table.93 * Synopsis94 */95#define LEADER_DATA .name{16}, .value{STRING_VALUE_SIZE}96/*97 * Description98 * Fields:99 * * name - user name100 * * value - user score101 * See also102 ******/103104/****s* PawnLibs/splashscreen/LEADER_DATA105 * Summary106 * An array with named fields, which represents the values on107 * the parameters screen.108 * Synopsis109 */110#define PARAMETRS_DATA .name{10}, .value{STRING_VALUE_SIZE}, .fontSize111/*112 * Description113 * Fields:114 * * name - user name115 * * value - user score116 * * fontSize - font size117 * See also118 ******/119120/****s* PawnLibs/splashscreen/LEADER_DATA121 * Summary122 * An array with named fields, which represents the values on123 * the record screen.124 * Synopsis125 */126#define RECORD_DATA .value{STRING_VALUE_SIZE}, .fontSize127/*128 * Description129 * Fields:130 * * name - user name131 * * value - user score132 * * fontSize - font size133 * See also134 ******/135136const SPLASH_SCREEN_FONT_ID = 0;137const LEADER_TABLE_FONT = 6;138139/****c* PawnLibs/splashscreen/e_ssLeadersDataType140 * Summary141 * Enumeration of results type in the leader board.142 * Synopsis143 */144const e_ssLeadersDataType: {145 ssTypeNumber = 1,146 ssTypeTime = 2,147}148/*149 * Description150 * * ssTypeNumber - display scores in the leader board151 * * ssTypeTime - display time in the leader board152 ******/153154/****c* PawnLibs/splashscreen/e_ssLeaderBoardType155 * Summary156 * Enumeration of the leader board types.157 * Synopsis158 */159const e_ssLeaderBoardType: {160 ssWithoutSaves = 0,161 ssWithSaves = 1,162}163/*164 * Description165 * * ssWithoutSaves - first run of the application and it does not have saves and166 * previous results167 * * ssWithSaves - application has a save to continue from168 ******/169170// Default texts for splashscreen171new leaderBoardText { 12 } = "LEADERBOARD";172new lastResultsText { 16 } = "LAST RESULTS";173new twistWithIcon { 64 } = "twist|to continue";174new twistWithoutIcon { 64 } = "twist|to start";175new patWithIcon { 64 } = "triple Pat|to start new";176new patWithoutIcon { 64 } = "triple Pat|to continue";177new separator = '|';178179new ssAppNameText { 64 } = " ";180new ssQRCodeLink { 32 } = " ";181182// Default leaderboard for splashscreen183new leadersSplashScreen[SPLASH_SCREEN_MAX_LEADERS][LEADER_DATA] = [184 ["Alex", "5000"],185 ["Kim", "4000"],186 ["Beth", "3000"],187 ["Ethan", "2000"],188 ["Mia", "1000"],189 ["Lucas", "900"],190 ["Jonas", "800"],191 ["Diego", "700"],192 ["Chloe", "500"],193 ["Simon", "100"],194];195196// Special sprites197new ssSprites[.background, .leaderboard, .resultsIcon, .mainImage, .twist1, .twist2, .pat1, .pat2, .qrCode, .name, .borderYou] = [-1, ...];198199new baseColor = 0xFFFFFFFF;200new keyColor = 0xFFFFFFFF;201202new leaderBoardMapping[TOPOLOGY_FACES_MAX] { TOPOLOGY_POSITIONS_MAX };203204new ssParameters[SPLASH_SCREEN_MAX_PARAMETERS][PARAMETRS_DATA];205new ssRecord[RECORD_DATA];206207new splashscreen_basicInfo[LB_INFO];208new splashscreen_leadTableScore[LEADERBOARD_SIZE];209210new splashscreenPlayerScore { STRING_VALUE_SIZE };211new splashscreenInScriptRecord = 0;212new splashscreenInWebRecord = 0;213214new threeDots { 3 } = "...";215new zeroValue { STRING_VALUE_SIZE } = "0";216new ssApplicationVersionStr { STRING_VALUE_SIZE } = "v";217218new init[bool:.basic, bool:.places] = [false, false];219new ssPlaybackSpeed[.twist, .pat] = [500, 500];220new ssIconsFrame[.twist, .pat] = [500, 500];221222new ssPlaces[SCREENS_MAX][TOPOLOGY_PLACE] = [223 [TOPOLOGY_FACES_MAX, TOPOLOGY_POSITIONS_MAX],224 [TOPOLOGY_FACES_MAX, TOPOLOGY_POSITIONS_MAX],225 [TOPOLOGY_FACES_MAX, TOPOLOGY_POSITIONS_MAX]226];227228// Preset table for displaying a splash screen without saving229new leaderBoardTableWithoutSaves[TOPOLOGY_FACES_MAX] { TOPOLOGY_POSITIONS_MAX } = [230 { ssTwistLabelWithoutIcon, ssTwistIcon, ssMainImage, ssAppName, },231 { ssTwistLabelWithoutIcon, ssTwistIcon, ssQRCode, ssAppName, },232 { ssTwistLabelWithoutIcon, ssTwistIcon, ssEmpty, ssEmpty, },233 { ssEmpty, ssEmpty, ssTwistIcon, ssTwistLabelWithoutIcon, },234 { ssHighScore, ssSecondLeaderGroup, ssFirstLeaderGroup, ssLeaderboardSprite, },235 { ssHighScore, ssSecondLeaderGroup, ssFirstLeaderGroup, ssLeaderboardSprite, },236];237// Preset table for displaying a splash screen with saving238new leaderBoardTableWithSaves[TOPOLOGY_FACES_MAX] { TOPOLOGY_POSITIONS_MAX } = [239 { ssTwistLabelWithIcon, ssPatLabelWithIcon, ssMainImage, ssAppName, },240 { ssTwistLabelWithIcon, ssPatLabelWithIcon, ssQRCode, ssAppName, },241 { ssLastParameter1, ssLastParameter2, ssLastResultsSprite, ssLastParameter3, },242 { ssLastParameter1, ssLastParameter2, ssLastResultsSprite, ssLastParameter3, },243 { ssHighScore, ssSecondLeaderGroup, ssFirstLeaderGroup, ssLeaderboardSprite, },244 { ssHighScore, ssSecondLeaderGroup, ssFirstLeaderGroup, ssLeaderboardSprite, },245];246247new ssPosition[.x, .y, .angle];248249/****f* PawnLibs/splashscreen/ssON_Render250 * Summary251 * Splash screen ON_Render252 * Synopsis253 */254stock ssON_Render()255/*256 * Description257 * Splash screen rendering258 * Inputs259 * Source260 */261{262263 for (new screen = 0; screen < SCREENS_MAX; screen++) {264 GFX_setRenderTarget(screen);265 ssRenderScreen(screen);266 GFX_render();267 }268}269/******/270271/****f* PawnLibs/splashscreen/ssON_Tick272 * Summary273 * Splash screen ON_Tick274 * Synopsis275 */276stock ssON_Tick(dt)277/*278 * Description279 * Splash screen rendering280 * Inputs281 * * dt - Delta time between ticks282 * Source283 */284{285 static ssDeltaTime[.pat, .twist];286287 ssDeltaTime.pat += dt;288 ssDeltaTime.twist += dt;289290 if (ssDeltaTime.pat > ssPlaybackSpeed.pat) {291 ssIconsFrame.pat++;292 ssIconsFrame.pat %= 2;293 ssDeltaTime.pat = 0;294 }295296 if (ssDeltaTime.twist > ssPlaybackSpeed.twist) {297 ssIconsFrame.twist++;298 ssIconsFrame.twist %= 2;299 ssDeltaTime.twist = 0;300 }301 ssON_Tick_UserDefined(dt);302}303/******/304305/****f* PawnLibs/splashscreen/ssSetPlaces306 * Summary307 * Customize topology308 * Synopsis309 */310stock ssSetPlaces(place0[TOPOLOGY_PLACE], place1[TOPOLOGY_PLACE], place2[TOPOLOGY_PLACE])311/*312 * Description313 * Set user-defined topology314 * Inputs315 * * place0 - the place for the 0 screen316 * * place1 - the place for the 1 screen317 * * place2 - the place for the 2 screen318 * Source319 */320{321 ssPlaces[0] = place0;322 ssPlaces[1] = place1;323 ssPlaces[2] = place2;324325 init.places = true;326}327/******/328329/****f* PawnLibs/splashscreen/ssSetPlaces330 * Summary331 * Get topology for customize332 * Synopsis333 */334stock ssGetPlace(screen)335/*336 * Description337 * Get topology for customize screens338 * Inputs339 * * screen - The ID of the screen340 * Source341 */342{343 return ssPlaces[screen];344}345/******/346347/****f* PawnLibs/splashscreen/ssSetSplashScreenNamedValue348 * Summary349 * Set named value, for example: 'time', 'level' etc350 * Synopsis351 */352stock ssSetSplashScreenNamedValue(name { 10 }, value, e_ssLeadersDataType:valueType = e_ssLeadersDataType:ssTypeNumber)353/*354 * Description355 * Set named value, for example: 'time', 'level' etc356 * Inputs357 * * name - name of the parameter358 * * value - value of the parameter359 * * valueType - type of the parameter value360 * Source361 */362{363 static counter = 0;364365 ssParameters[counter].name = name;366 ssParameters[counter].value = ssToString(value, valueType, ssParameters[counter].fontSize, false);367368 counter = (counter + 1) % SPLASH_SCREEN_MAX_PARAMETERS;369}370/******/371372/****f* PawnLibs/splashscreen/ssSetSplashScreenRecord373 * Summary374 * Customize record375 * Synopsis376 */377stock ssSetSplashScreenRecord(value, e_ssLeadersDataType:valueType = e_ssLeadersDataType:ssTypeNumber)378/*379 * Description380 * Set user-defined record381 * Inputs382 * * value - value of the record383 * * valueType - type of the record value384 * Source385 */386{387 static counter = 0;388389 ssRecord.value = ssToString(value, valueType, ssRecord.fontSize, false);390}391/******/392393/****f* PawnLibs/splashscreen/SetSeparator394 * Summary395 * Customize twist and Pat labels396 * Synopsis397 */398stock ssSetSeparator(l_separator)399/*400 * Description401 * Set user-defined separator402 * Inputs403 * * l_separator - text separator for splitting into 2 lines404 * Source405 */406{407 separator = l_separator;408}409/******/410411/****f* PawnLibs/splashscreen/ssSetTexts412 * Summary413 * Customize twist and Pat labels414 * Synopsis415 */416stock ssSetTexts(patWI[] = "", patWoI[] = "", twistWI[] = "", twistWoI[] = "")417/*418 * Description419 * Set user-defined twist and Pat labels420 * Inputs421 * * patWI - the text for pat screen with icon422 * * patWoI - the text for pat screen without icon423 * * twistWI - the text for twist screen with icon424 * * twistWoI - the text for twist screen without icon425 * Source426 */427{428 strcopy(patWithIcon, patWI);429 strcopy(patWithoutIcon, patWoI);430 strcopy(twistWithIcon, twistWI);431 strcopy(twistWithoutIcon, twistWoI);432}433/******/434435/****f* PawnLibs/splashscreen/ssSetApplicationNameText436 * Summary437 * Customize text of the application name438 * Synopsis439 */440stock ssSetApplicationNameText(title { 64 })441/*442 * Description443 * Set user-defined text of the application name. Used if the s444 * prite of the application title is missing445 * Inputs446 * * title - name of application447 * Source448 */449{450 strcopy(ssAppNameText, title);451}452/******/453454/****f* PawnLibs/splashscreen/ssSetLeaderBoardTablePreset455 * Summary456 * Customize leaderboard table from preset457 * Synopsis458 */459stock ssSetLeaderBoardTablePreset(e_ssLeaderBoardType:type)460/*461 * Description462 * Set leaderBoardMapping from preset by type463 * Inputs464 * * type - The type of the preset table465 * See also466 * * e_ssLeaderBoardType467 * * e_ssLeadersDataType468 * Source469 */470{471 switch (type) {472 case ssWithoutSaves: {473 leaderBoardMapping = leaderBoardTableWithoutSaves;474 }475 case ssWithSaves: {476 leaderBoardMapping = leaderBoardTableWithSaves;477 }478 }479}480/******/481482/****f* PawnLibs/splashscreen/ssSetLeaderBoardTable483 * Summary484 * Customize leaderboard table from user-defined table485 * Synopsis486 */487stock ssSetLeaderBoardTable(e_ssLeaderBoardType:leaderBoardTable[TOPOLOGY_FACES_MAX] { TOPOLOGY_POSITIONS_MAX })488/*489 * Description490 * Set leaderBoardMapping from user-defined table491 * Inputs492 * * leaderBoardTable - user-defined table493 * See also494 * * e_ssLeaderBoardType495 * * e_ssLeadersDataType496 * Source497 */498{499 leaderBoardMapping = leaderBoardTable;500}501502/****f* PawnLibs/splashscreen/ssSetQRCodeLink503 * Summary504 * Customize playback speed for animated icons505 * Synopsis506 */507stock ssSetPlaybackSpeed(pat, twist)508/*509 * Description510 * Set playback speed for animated icons511 * Inputs512 * * pat - playback speed for pat icon513 * * twist - playback speed for twist icon514 * Source515 */516{517 ssPlaybackSpeed.pat = pat;518 ssPlaybackSpeed.twist = twist;519}520/******/521522/****f* PawnLibs/splashscreen/ssSetQRCodeLink523 * Summary524 * Customize link for a QR Code525 * Synopsis526 */527stock ssSetQRCodeLink(qrCodeLink { 32 })528/*529 * Description530 * Set link for a QR Code. If not specified, the QR code sprite will be displayed531 * Inputs532 * * qrCodeLink - qrCodeLink533 * Source534 */535{536 strcopy(ssQRCodeLink, qrCodeLink);537}538/******/539540/****f* PawnLibs/splashscreen/InitSplashScreenSprites541 * Summary542 * Customize splash screen.543 * Synopsis544 */545stock InitSplashScreenSprites(backgroundSprite = -1,546 mainImageSprite = -1,547 gameNameSprite = -1,548 QRcodeSprite = -1,549 leaderboardIcon = -1,550 resultsIcon = -1,551 twistIcon_1 = -1,552 twistIcon_2 = -1,553 patIcon_1 = -1,554 patIcon_2 = -1,555 borderYou = -1)556/*557 * Description558 * Set IDs of sprite used to draw different elements of the splash screen.559 * Inputs560 * * backgroundSprite - ID of a background image. If ID=-1, then a user defined render will be called561 * * mainImageSprite - ID of an application logo, may differ from a menu562 * icon563 * * gameNameSprite - ID of an image with application name, to display it with564 * some custom font565 * * QRcodeSprite - ID of a QR code566 * * leaderboardIcon - ID of a leader board icon567 * * resultsIcon - ID of a result icon568 * * twistIcon_1, twistIcon_2 - IDs of twist animation images569 * * patIcon_1, patIcon_2 - IDs of Pat animation images570 * * borderYou - a border that highlights you in the leaderboard571 * Source572 */573{574 ssSprites.background = backgroundSprite;575 ssSprites.mainImage = mainImageSprite;576 ssSprites.name = gameNameSprite;577 ssSprites.qrCode = QRcodeSprite;578 ssSprites.leaderboard = leaderboardIcon;579 ssSprites.resultsIcon = resultsIcon;580 ssSprites.twist1 = twistIcon_1;581 ssSprites.twist2 = twistIcon_2;582 ssSprites.pat1 = patIcon_1;583 ssSprites.pat2 = patIcon_2;584 ssSprites.borderYou = borderYou;585586 if (ssSprites.background < 0) {587 LOG_w("splashscreen.inc: Background sprite is not initialized");588 }589 if (ssSprites.mainImage < 0) {590 LOG_w("splashscreen.inc: Main image sprite is not initialized");591 }592 if (ssSprites.name < 0) {593 LOG_w("splashscreen.inc: App name sprite is not initialized");594 }595 if (ssSprites.qrCode < 0) {596 LOG_w("splashscreen.inc: QR code sprite is not initialized");597 }598 if (ssSprites.leaderboard < 0) {599 LOG_w("splashscreen.inc: Leaderboard icon sprite is not initialized");600 }601 if (ssSprites.resultsIcon < 0) {602 LOG_w("splashscreen.inc: Results icon sprite is not initialized");603 }604 if (ssSprites.twist1 < 0) {605 LOG_w("splashscreen.inc: Twist icon 1-st sprite is not initialized");606 }607 if (ssSprites.twist2 < 0) {608 LOG_w("splashscreen.inc: Twist icon 2-nd sprite is not initialized");609 }610 if (ssSprites.pat1 < 0) {611 LOG_w("splashscreen.inc: Pat icon 1-st sprite is not initialized");612 }613 if (ssSprites.pat2 < 0) {614 LOG_w("splashscreen.inc: Pat icon 2-nd sprite is not initialized");615 }616}617/******/618619/****f* PawnLibs/splashscreen/InitSplashScreenBasics620 * Summary621 * Set how splash screen should be displayed.622 * Synopsis623 */624stock InitSplashScreenBasics(base = 0xFFFFFFFF, key = 0xFFFFFFFF,625 e_ssLeadersDataType:dataType = ssTypeNumber)626/*627 * Inputs628 * * base - base color for all text labels in ARGB8888 format629 * * key - accent color for text labels in ARGB8888 format630 * * leaderBoardType - type of splash screen631 * * dataType - type of results in the leader board632 * See also633 * * e_ssLeaderBoardType634 * * e_ssLeadersDataType635 * Source636 */637{638 new size;639 baseColor = base;640 keyColor = key;641642 ssGetApplicationVersion();643644 LB_getInfo(splashscreen_basicInfo);645 LB_getScore(splashscreen_leadTableScore);646647 for (new leaderI = 0; leaderI < SPLASH_SCREEN_MAX_LEADERS; ++leaderI) {648 if (leaderI < splashscreen_basicInfo.leadCount) {649 for (new i = 0; i < 5; i++) {650 leadersSplashScreen[leaderI].name { i } = GetByte(splashscreen_leadTableScore[leaderI * 3 + i / 4], i % 4);651 }652653 if (splashscreen_leadTableScore[leaderI * 3 + 1] & 0xffffff00) {654 leadersSplashScreen[leaderI].name { 5 } = '.';655 leadersSplashScreen[leaderI].name { 6 } = '.';656 leadersSplashScreen[leaderI].name { 7 } = '.';657 }658659 leadersSplashScreen[leaderI].value = ssToString(splashscreen_leadTableScore[leaderI * 3 + 2], dataType, size);660661 } else if (splashscreen_basicInfo.leadCount > 0) {662 leadersSplashScreen[leaderI].value = zeroValue;663 } else {664 if (dataType == e_ssLeadersDataType:ssTypeNumber)665 leadersSplashScreen[leaderI].value = ssToString((SPLASH_SCREEN_MAX_LEADERS - leaderI) * 1000, dataType, size);666 else667 leadersSplashScreen[leaderI].value = ssToString((leaderI + 1) * 1000, dataType, size);668 }669 }670 splashscreenInWebRecord = splashscreen_basicInfo.selfScore;671 splashscreenPlayerScore = ssToString(splashscreen_basicInfo.selfScore, dataType, size);672673 if (!init.places) {674 ssGetTopologyPlaces();675 init.places = true;676 }677678 init.basic = true;679}680/******/681682/****f* PawnLibs/splashscreen/InitSplashScreenBasics683 * Summary684 * Calculation of coordinates and rotation angle relative to screen685 * rotation in topology686 * Synopsis687 */688stock ssSetPosition(screen, x = 120, y = 120, angle = 0)689/*690 * Inputs691 * * screen - The ID of the screen relative to which the coordinates692 * and rotation angle will be transformed693 * * x - X coordinate694 * * y - Y coordinate695 * * angle - angle of rotation of sprite or text696 * Source697 */698{699 ssPosition.x = x;700 ssPosition.y = y;701 ssPosition.angle = angle;702 ssSetPositionRotate(screen);703}704/******/705706/****f* PawnLibs/splashscreen/InitSplashScreenBasics707 * Summary708 * Rendering image709 * Synopsis710 */711stock ssRenderImage(id)712/*713 * Inputs714 * * id - Image ID715 * Source716 */717{718 GFX_drawImageXY(ssPosition.x, ssPosition.y, 0xff, 0xff00ff, 100, 100, ssPosition.angle, MIRROR_BLANK, id);719}720/******/721722/****f* PawnLibs/splashscreen/InitSplashScreenBasics723 * Summary724 * Rendering text725 * Synopsis726 */727stock ssRenderText(text[], size, color, align = TEXT_ALIGN_CENTER)728/*729 * Inputs730 * * text - text to display731 * * size - text size732 * * color - text color733 * * align - text align734 * Source735 */736{737 GFX_drawTextXY(ssPosition.x, ssPosition.y, size, ssPosition.angle, SPLASH_SCREEN_FONT_ID, align, color, text);738}739/******/740741stock ssSplitString(const strsrc[], strdest[][], l_separator) {742 new i = 0, li;743 new aNum = 0;744 new len = 0;745 while (i <= strlen(strsrc)) {746 if ((strsrc { i } == l_separator || i == strlen(strsrc))) {747 len = strmid(strdest[aNum], strsrc, li, i, 128);748 strdest[aNum][len] = 0;749 li = i + 1;750 aNum++;751 }752 i++;753 }754 return 1;755}756757stock GetByte(dword, i) {758 return (dword >> i * 8) & 0xff;759}760761stock ssToString(data, dataType, & size, bool:short = true) {762 new dataStr { STRING_VALUE_SIZE };763 new leaderData = data;764765 new time[5];766 new divider[5] = [100, 24, 60, 60, 1000];767 new timeMask[3] { 3 } = ["dhm", "hms", "ms"];768769 new number[4];770 new numberMask[3] { 2 } = [".b", ".m", ".k"];771772 new countSymbols = 0;773774 dataStr = zeroValue;775776 if (data > 0) {777 if (dataType == e_ssLeadersDataType:ssTypeTime) {778 for (new i = 4; i >= 0; i--) {779 time[i] = leaderData % divider[i];780 leaderData /= divider[i];781 }782783 if (short) {784 if (data < 60000) {785 strformat(dataStr, sizeof(dataStr), true, "%d.%ds", time[3], time[4] / 100 % 10);786 } else {787 for (new i = 0; i < 3; i++) {788 if (time[i] != 0) {789 strformat(dataStr, sizeof(dataStr), true, "%d%c %d%c", time[i], timeMask[i] { 0 }, time[i + 1], timeMask[i] { 1 });790 break;791 }792 }793 }794 } else {795 if (data < 60000) {796 strformat(dataStr, sizeof(dataStr), true, "%d.%ds", time[3], time[4] / 100 % 10);797 countSymbols = 3 + (time[3] < 10 ? 1 : 2);798 } else if (data < 3600000) {799 strformat(dataStr, sizeof(dataStr), true, "%dm %ds", time[2], time[3]);800 countSymbols = 3 + (time[2] < 10 ? 1 : 2) + (time[3] < 10 ? 1 : 2);801 } else {802 for (new i = 0; i < 2; i++) {803 if (time[i] != 0) {804 strformat(dataStr, sizeof(dataStr), true, "%d%c %d%c %d%c", time[i], timeMask[i] { 0 }, time[i + 1], timeMask[i] { 1 }, time[i + 2], timeMask[i] { 2 });805 countSymbols = 5 + (time[i] < 10 ? 1 : 2) + (time[i + 1] < 10 ? 1 : 2) + (time[i + 2] < 10 ? 1 : 2);806 break;807 }808 }809 }810 }811 } else {812 for (new i = 3; i >= 0; i--) {813 number[i] = leaderData % 1000;814 leaderData /= 1000;815 }816 if (!short) {817 for (new i = 0; i < 4; i++) {818 if (number[i] != 0 || dataStr != "0") {819 if (dataStr == "0") {820 strformat(dataStr, sizeof(dataStr), true, "%d", number[i]);821 countSymbols = (number[i] < 10 ? 1 : (number[i] < 100 ? 2 : 3));822 } else {823 strformat(dataStr, sizeof(dataStr), true, "%s %03d", dataStr, number[i]);824 countSymbols += 4;825 }826 }827 }828 } else {829 if (data <= 999) {830 strformat(dataStr, sizeof(dataStr), true, "%d", number[3]);831 } else if (data <= 99999) {832 strformat(dataStr, sizeof(dataStr), true, "%d %03d", number[2], number[3]);833 countSymbols = 5;834 } else {835 for (new i = 0; i < 3; i++) {836 if (number[i] != 0) {837 strformat(dataStr, sizeof(dataStr), true, "%d%c%d%c", number[i], numberMask[i] { 0 }, number[i + 1] / 100 % 10, numberMask[i] { 1 });838 break;839 }840 }841 }842 }843844 }845 }846847 if (countSymbols <= 9) {848 size = 14;849 } else if (countSymbols <= 11) {850 size = 12;851 } else {852 size = 10;853 }854855 return dataStr;856}857858stock ssGetApplicationVersion() {859 new version[APP_VERSION];860 getAppVersion(version);861 strformat(ssApplicationVersionStr, sizeof(ssApplicationVersionStr), true, "v %d.%d.%d", version.major, version.minor, version.patch);862}863864stock ssSetPositionRotate(screen) {865 new temp = ssPosition.x;866 switch (ssPlaces[screen].position) {867 case 1 : {868 ssPosition.x = ssPosition.y;869 ssPosition.y = 240 - temp;870 ssPosition.angle = 270;871 }872 case 2 : {873 ssPosition.x = 240 - ssPosition.x;874 ssPosition.y = 240 - ssPosition.y;875 ssPosition.angle = 180;876 }877 case 3 : {878 ssPosition.x = 240 - ssPosition.y;879 ssPosition.y = temp;880 ssPosition.angle = 90;881 }882 }883}884885stock ssGetTopologyPlaces() {886 new ssFacelet[TOPOLOGY_FACELET];887 for (ssFacelet.module = SELF_ID, ssFacelet.screen = 0; ssFacelet.screen < SCREENS_MAX; ssFacelet.screen++) {888 ssPlaces[ssFacelet.screen] = TOPOLOGY_getPlace(ssFacelet, TOPOLOGY_orientation_mode:ORIENTATION_MODE_SPLASH);889 ssPlaces[ssFacelet.screen].face = TOPOLOGY_getPlaceOrientation(ssPlaces[ssFacelet.screen]);890 }891}892893stock ssRenderBackground(screen) {894 GFX_clear(0xffffffff);895 if (ssSprites.background != -1) {896 ssSetPosition(screen);897 ssRenderImage(ssSprites.background);898 } else {899 ssRenderBackgroundUserDefined(screen, leaderBoardMapping[ssPlaces[screen].face] { ssPlaces[screen].position });900 }901}902903stock ssRenderMainImage(screen) {904 if (ssSprites.mainImage >= 0) {905 ssSetPosition(screen);906 ssRenderImage(ssSprites.mainImage);907 }908}909910stock ssRenderAppName(screen) {911 if (ssSprites.name >= 0) {912 ssSetPosition(screen);913 ssRenderImage(ssSprites.name);914 } else if (ssAppNameText != " ") {915 new text[2] { 64 };916 ssSplitString(ssAppNameText, text, separator);917 ssSetPosition(screen, .y = 100);918 ssRenderText(text[0], 14, keyColor);919 ssSetPosition(screen, .y = 140);920 ssRenderText(text[1], 14, keyColor);921 }922}923924stock ssRenderLeaderBoardSprite(screen) {925 if (ssSprites.leaderboard >= 0) {926 ssSetPosition(screen);927 ssRenderImage(ssSprites.leaderboard);928 }929930 ssSetPosition(screen, .y = 200);931 ssRenderText(leaderBoardText, 10, baseColor, TEXT_ALIGN_BOTTOM_CENTER);932}933934stock ssRenderQRCode(screen) {935 if (ssQRCodeLink != " ") {936 ssSetPosition(screen, .y = 110);937 GFX_drawQrCodeXY(ssPosition.x, ssPosition.y, 8, 0xffffffff, 0xff000000, ssPosition.angle, 0, ssQRCodeLink);938 } else if (ssSprites.qrCode >= 0) {939 ssSetPosition(screen, .y = 110);940 ssRenderImage(ssSprites.qrCode);941 }942 ssSetPosition(screen, .y = 225);943 ssRenderText(ssApplicationVersionStr, 9, baseColor);944}945946stock ssRenderLeaderGroup(screen, bool:isFirstGroup) {947 new nameColor = baseColor;948 new text[1];949 new num = 0;950951 new leaderName { 9 };952 new leaderScore { 10 };953 for (new i = 0; i < 5; ++i) {954 nameColor = baseColor;955956 if (i == 4 && !isFirstGroup && splashscreen_basicInfo.selfPosition > SPLASH_SCREEN_MAX_LEADERS) {957 num = splashscreen_basicInfo.selfPosition;958 strformat(leaderScore, sizeof(leaderScore), true, "%s", splashscreenPlayerScore);959 } else if (i == 3 && !isFirstGroup && splashscreen_basicInfo.selfPosition > SPLASH_SCREEN_MAX_LEADERS) {960 num = 0;961 } else {962 num = i + 1 + (isFirstGroup ? 0 : 5);963 strformat(leaderName, sizeof(leaderName), true, "%d %s", i + 1 + (isFirstGroup ? 0 : 5), leadersSplashScreen[num - 1].name);964 strformat(leaderScore, sizeof(leaderScore), true, "%s", leadersSplashScreen[num - 1].value);965 }966967 if (splashscreen_basicInfo.selfPosition == num) {968 nameColor = keyColor;969 strformat(leaderName, sizeof(leaderName), true, "%d you", splashscreen_basicInfo.selfPosition);970 ssRenderBorderYou(screen, 30 + 40 * i);971 }972973 if (num > 0) {974 ssSetPosition(screen, 10, 30 + 40 * i);975 ssRenderText(leaderName, LEADER_TABLE_FONT, nameColor, TEXT_ALIGN_LEFT_CORNER);976977 ssSetPosition(screen, 230, 30 + 40 * i);978 ssRenderText(leaderScore, LEADER_TABLE_FONT, keyColor, TEXT_ALIGN_RIGHT_CORNER);979 } else {980 ssSetPosition(screen, 50, 30 + 40 * i);981 ssRenderText(threeDots, LEADER_TABLE_FONT, baseColor, TEXT_ALIGN_LEFT_CORNER);982983 }984 }985}986987stock ssRenderBorderYou(screen, y) {988 if (ssSprites.borderYou >= 0) {989 ssSetPosition(screen, .x = 120, .y = y);990 ssRenderImage(ssSprites.borderYou);991 }992}993stock ssRenderResultsSprite(screen) {994 if (ssSprites.resultsIcon >= 0) {995 ssSetPosition(screen);996 ssRenderImage(ssSprites.resultsIcon);997 }998999 ssSetPosition(screen, .y = 200);1000 ssRenderText(lastResultsText, 10, baseColor);1001}10021003stock ssRenderParameter(screen, counter) {10041005 ssSetPosition(screen, .y = 110);1006 ssRenderText(ssParameters[counter].value, 15, keyColor);10071008 ssSetPosition(screen, .y = 150);1009 ssRenderText(ssParameters[counter].name, 10, baseColor);1010}10111012stock ssRenderBest(screen) {1013 new score { STRING_VALUE_SIZE };1014 new label { STRING_VALUE_SIZE };1015 if (strval(ssRecord.value) == 0) {1016 strformat(score, sizeof(score), true, "%s", leadersSplashScreen[0].value);1017 label = "Top Score";1018 } else {1019 if (splashscreenInScriptRecord > splashscreenInWebRecord) {1020 strformat(score, sizeof(score), true, "%s", ssRecord.value);1021 } else {1022 strformat(score, sizeof(score), true, "%s", splashscreenPlayerScore);1023 }1024 strformat(score, sizeof(score), true, "%s", ssRecord.value);10251026 label = "Personal best";1027 }1028 ssSetPosition(screen, .y = 110);1029 ssRenderText(score, ssRecord.fontSize, keyColor);10301031 ssSetPosition(screen, .y = 150);1032 ssRenderText(label, 8, baseColor);1033}10341035stock ssRenderTwistIcon(screen) {1036 if (ssSprites.twist1 == -1 && ssSprites.twist2 == -1)1037 return;10381039 new id = ssSprites.twist2 == -1 ? ssSprites.twist1 : ssIconsFrame.twist ? ssSprites.twist1 : ssSprites.twist2;10401041 ssSetPosition(screen);1042 ssRenderImage(id);1043}10441045stock ssRenderTwistLabelWithoutIcon(screen) {1046 new text[3] { 64 };1047 ssSplitString(twistWithoutIcon, text, separator);10481049 ssSetPosition(screen);1050 ssRenderText(text[0], 17, keyColor);10511052 ssSetPosition(screen, .y = 160);1053 ssRenderText(text[1], 10, baseColor);105410551056 ssSetPosition(screen, .y = 190);1057 ssRenderText(text[2], 10, baseColor);1058}10591060stock ssRenderPatLabelWithoutIcon(screen) {1061 new text[3] { 64 };1062 ssSplitString(patWithoutIcon, text, separator);10631064 ssSetPosition(screen);1065 ssRenderText(text[0], 10, keyColor);10661067 ssSetPosition(screen, .y = 160);1068 ssRenderText(text[1], 8, baseColor);106910701071 ssSetPosition(screen, .y = 190);1072 ssRenderText(text[2], 8, baseColor);1073}10741075stock ssRenderPatIcon(screen) {1076 if (ssSprites.pat1 == -1 && ssSprites.pat2 == -1)1077 return;10781079 new id = ssSprites.pat2 == -1 ? ssSprites.pat1 : ssIconsFrame.pat ? ssSprites.pat1 : ssSprites.pat2;10801081 ssSetPosition(screen);1082 ssRenderImage(id);1083}10841085stock ssRenderLabelWithIcon(screen, txt {}) {1086 new text[2] { 64 };1087 ssSplitString(txt, text, separator);10881089 ssSetPosition(screen, .y = 190);1090 ssRenderText(text[0], 8, keyColor);10911092 ssSetPosition(screen, .y = 220);1093 ssRenderText(text[1], 8, baseColor);1094}10951096stock ssRenderScreen(screen) {1097 if (!init.basic) {1098 LOG_w("Please call InitSplashScreenBasics() before rendering!");1099 return;1100 }1101 ssRenderBackground(screen);11021103 switch (leaderBoardMapping[ssPlaces[screen].face] { ssPlaces[screen].position }) {1104 case ssEmpty: {}1105 case ssFirstLeaderGroup: {1106 ssRenderLeaderGroup(screen, true);1107 }1108 case ssSecondLeaderGroup: {1109 ssRenderLeaderGroup(screen, false);1110 }1111 case ssHighScore: {1112 ssRenderBest(screen);1113 }1114 case ssLeaderboardSprite: {1115 ssRenderLeaderBoardSprite(screen);1116 }1117 case ssAppName: {1118 ssRenderAppName(screen);1119 }1120 case ssMainImage: {1121 ssRenderMainImage(screen);1122 }1123 case ssLastResultsSprite: {1124 ssRenderResultsSprite(screen);1125 }1126 case ssLastParameter1: {1127 ssRenderParameter(screen, 0);1128 }1129 case ssLastParameter2: {1130 ssRenderParameter(screen, 1);1131 }1132 case ssLastParameter3: {1133 ssRenderParameter(screen, 2);1134 }1135 case ssTwistIcon: {1136 ssRenderTwistIcon(screen);1137 }1138 case ssTwistLabelWithIcon: {1139 ssRenderTwistIcon(screen);1140 ssRenderLabelWithIcon(screen, twistWithIcon);1141 }1142 case ssTwistLabelWithoutIcon: {1143 ssRenderTwistLabelWithoutIcon(screen);1144 }1145 case ssPatIcon: {1146 ssRenderPatIcon(screen);1147 }1148 case ssPatLabelWithIcon: {1149 ssRenderPatIcon(screen);1150 ssRenderLabelWithIcon(screen, patWithIcon);1151 }1152 case ssPatLabelWithoutIcon: {1153 ssRenderPatLabelWithoutIcon(screen);1154 }1155 case ssQRCode: {1156 ssRenderQRCode(screen);1157 }1158 default: {1159 ssON_Render_UserDefined(screen, leaderBoardMapping[ssPlaces[screen].face] { ssPlaces[screen].position });1160 }1161 }1162}1163
Wrapped for easier reading. Turn wrap off to inspect exact line lengths.