1. Are you planning to upload your awesome spell or system to Hive? Please review the rules here.
    Dismiss Notice
  2. Updated Resource Submission Rules: All model & skin resource submissions must now include an in-game screenshot. This is to help speed up the moderation process and to show how the model and/or texture looks like from the in-game camera.
    Dismiss Notice
  3. DID YOU KNOW - That you can unlock new rank icons by posting on the forums or winning contests? Click here to customize your rank or read our User Rank Policy to see a list of ranks that you can unlock. Have you won a contest and still haven't received your rank award? Then please contact the administration.
    Dismiss Notice
  4. Lead your forces to battle in the 15th Techtree Contest. The call is yours, commander!
    Dismiss Notice
  5. The reforging of the races is complete. Come see the 14th Techtree Contest Results.
    Dismiss Notice
  6. It's time to choose your horse in the race - the 32nd Modeling Contest Poll is up!
    Dismiss Notice
  7. Check out the Staff job openings thread.
    Dismiss Notice
Dismiss Notice
60,000 passwords have been reset on July 8, 2019. If you cannot login, read this.

Combat Multiboard System v1.02 [vJASS]

Submitted by Magtheridon96
This bundle is marked as substandard. It may contain bugs, not perform optimally or otherwise be in violation of the submission rules.
This system creates a multiboard that can (uptil now) support 2 teams.

The difference between this system and others on this site is the fact that
this system creates a very compact multiboard that leaves no empty slots.

It gives:
*Kills
*Deaths
*Hero Level
*Kills/Deaths Display in the title
*Team Kills/Deaths
*Player Gold display to ALL players (I

The code:
Code (vJASS):
library Multiboard initializer Init
//____________________________________________________________________
//                                                                    |
//                 Combat Multiboard System v1.02                     |
//                       by Magtheridon96                             |
//                                                                    |
//                        Copyright 2011                              |
//                                                                    |
//                        Coded in vJASS                              |
//                        [GUI Friendly]                              |
//                                                                    |
//                     www.hiveworkshop.com                           |
//____________________________________________________________________|
//                                                                    |
//    There are many multiboard systems on the hive like this one,    |
//  but this particular system stands out before all of them due to:  |
//                                                                    |
//      - The fact that this is written in vJass                      |
//      - It doesn't leave empty slots in the multiboard              |
//      - It's GUI Friendly                                           |
//      - It's not too complicated                                    |
//      - No Crap ^^                                                  |
//                                                                    |
//____________________________________________________________________|
//                                                                    |
//                            Changelog                               |
//                                                                    |
//    *** v1.00 ***                                                   |
//    Uploaded - First Release                                        |
//                                                                    |
//    *** v1.00b ***                                                  |
//    Removed one local variable                                      |
//                                                                    |
//    *** v1.01 ***                                                   |
//    Rewrote some parts of the system.                               |
//    It's now much more efficient and slightly shorter.              |
//                                                                    |
//    *** v1.02 ***                                                   |
//    Fixed a major bug                                               |
//    Added a Gold feature                                            |
//    Gave an ingame screenshot                                       |
//    Make GUI Implementation 10x easier :)                           |
//    Major Improvements :D                                           |
//                                                                    |
//____________________________________________________________________|
//                                                                    |
//                 Why should you use my system?                      |
//                                                                    |
//    My system has several pros and maybe a few cons, but it's       |
//  an overall "sufficient :p" system.                                |
//                                                                    |
//    PROS:                                                           |
//    - I'm not providing you with crap                               |
//      like HP bars and stuff that would affect                      |
//      visuals :)                                                    |
//    - No empty slots                                                |
//    - Compact Multiboards                                           |
//    - Efficiency ... i think                                        |
//    - MPI :D                                                        |
//                                                                    |
//    CONS:                                                           |
//    - I used 6 BJs :(                                               |
//    - Some people might want more features in                       |
//      a Multiboard, but it's all just crap to                       |
//      me, so I just gave you a Multiboard with                      |
//      the essentials :) (You might not like this :P)                |
//    - The update function is Overkill >.<                           |
//____________________________________________________________________|
//                                                                    |
//                        Implementation:                             |
//                                                                    |
//    *** Create a new trigger                                        |
//    *** Convert it to custom text                                   |
//    *** Paste all the contents of this trigger into it              |
//    *** Go to the "runtextmacro" line at the end of the code        |
//    *** Insert your variable names there :)                         |
//    *** Enjoy ^^                                                    |
//____________________________________________________________________|
    globals
   
        // CONFIGURABLES
       
        // The multiboard colors:
        private constant    string                  LeftColor   = "|cff080808"
        private constant    string                  KillsColor  = "|cffff0000"
        private constant    string                  DeathsColor = "|cff0036ff"
        private constant    string                  LevelsColor = "|cffa7a7a7"
        private constant    string                  GoldColor   = "|cffffcc00"
        // The Multiboard texts:
        private constant    string                  GAMETITLE   = "|cffffcc00Multiboard System v1.02 by Magtheridon96|r" // Also Optional, but you'll have to edit the code
        private constant    string                  MISCTITLE   = "" // This text will appear in column 0 row 0. (Column 1 Row 1 if you're a GUIer ;p) It is highly optional
        // The team names:
        private constant    string                  Name1       = "|cffffcc00Team 1|r"
        private constant    string                  Name2       = "|cffffcc00Team 2|r"
        // Integer Constants:
        private constant    integer                 MaxPlayers  = 12 // Will not function properly if this isn't an even number
       
        // NOTE: This may not function properly if the maximum number of players on
        // the first team is not the same as the number of players on the second team.
        // If your game is for 4 players for example, if it's a 1v3 game, this won't function properly :)
       
       
        // END OF CONFIGURABLES
       
       
        // The multiboard
        private             multiboard array        MB
        // A multipurpose temporary integer
        private             integer                 Tempint
        // An integer used for the loop in the update function
        private             integer                 int
        // The multiboard title(s)
        private             string                  MBtitle
        // The number of columns
        private constant    integer                 Cols        = 5 // Not Configurable
        // The number or rows (Do not touch)
        private             integer                 Rows
        // Two constants used for readability
        private constant    playerslotstate         left        = PLAYER_SLOT_STATE_LEFT
        private constant    playerslotstate         playing     = PLAYER_SLOT_STATE_PLAYING
        // Used for "local" reduction
        private             playerslotstate array   pss
    endglobals
   
    // I need the following function because for some strange reason,
    // GetPlayers() isn't working :/
   
    private function GetNumberPlayers takes nothing returns integer
        local integer i = 0
        local integer n = 0
        loop
            exitwhen i > MaxPlayers-1
            if GetPlayerSlotState(Player(i))==playing then
                set n = n + 1
            endif
            set i = i + 1
        endloop
        return n
    endfunction
   
    // DO NOT EDIT WITHIN THIS TEXTMACRO
   
    //! textmacro SYSTEMCODE takes k, d, l, c, g, tk, td
        // Used for code size reduction
        // It is used to evaluate each player's stats and update
        // his values
        private function Pf takes player p returns nothing
            local playerslotstate ps = GetPlayerSlotState(p)
            local string pn = GetPlayerName(p)
            local integer i = GetPlayerId(p)
            local multiboarditem mbi1
            local multiboarditem mbi2
            local multiboarditem mbi3
            local multiboarditem mbi4
            local multiboarditem mbi5
           
            set Tempint = Tempint + 1
           
            set mbi1 = MultiboardGetItem(MB[int], Tempint, 0)
            set mbi2 = MultiboardGetItem(MB[int], Tempint, 1)
            set mbi3 = MultiboardGetItem(MB[int], Tempint, 2)
            set mbi4 = MultiboardGetItem(MB[int], Tempint, 3)
            set mbi5 = MultiboardGetItem(MB[int], Tempint, 4)
           
            if ps == left then
                call MultiboardSetItemValue(mbi1, LeftColor + pn + "|r")
                call MultiboardSetItemValue(mbi2, LevelsColor + I2S(udg_$l$[i+1]+1) + "|r")
                call MultiboardSetItemValue(mbi3, KillsColor + I2S(udg_$k$[i+1]) + "|r")
                call MultiboardSetItemValue(mbi4, DeathsColor + I2S(udg_$d$[i+1]) + "|r")
                call MultiboardSetItemValue(mbi5, GoldColor + I2S(udg_$g$[i+1]) + "|r")
            else
                call MultiboardSetItemValue(mbi1, udg_$c$[i+1] + pn + "|r")
                call MultiboardSetItemValue(mbi2, LevelsColor + I2S(udg_$l$[i+1]+1) + "|r")
                call MultiboardSetItemValue(mbi3, KillsColor + I2S(udg_$k$[i+1]) + "|r")
                call MultiboardSetItemValue(mbi4, DeathsColor + I2S(udg_$d$[i+1]) + "|r")
                call MultiboardSetItemValue(mbi5, GoldColor + I2S(udg_$g$[i+1]) + "|r")
            endif
           
            call MultiboardReleaseItem(mbi1)
            call MultiboardReleaseItem(mbi2)
            call MultiboardReleaseItem(mbi3)
            call MultiboardReleaseItem(mbi4)
            call MultiboardReleaseItem(mbi5)
           
            set ps = null
            set mbi1 = null
            set mbi2 = null
            set mbi3 = null
            set mbi4 = null
            set mbi5 = null
        endfunction
       
        // CREATE MULTIBOARD FUNCTION
        //
        // This function is called at 0.01 seconds of gametime.
        // You don't need to call it :)
       
        private function CreateMB takes nothing returns nothing
            local integer i = 1
            local integer index = 0
            local multiboarditem tmbi
            local string s1
            local string s2
           
            loop
                exitwhen i > MaxPlayers
                set pss[i] = GetPlayerSlotState(Player(i-1))
                set i = i + 1
            endloop
           
            set int = 0
            loop
                exitwhen int > MaxPlayers
                set int = int + 1
                set MB[int] = CreateMultiboard()
                call MultiboardClear(MB[int])
                set s1 = I2S(udg_$k$[int])
                set s2 = I2S(udg_$d$[int])
                call MultiboardSetTitleText(MB[int], "|cffaaaaaa" + s1 + "/" + s2 + "|r - " + GAMETITLE)
                call MultiboardSetColumnCount(MB[int], Cols)
                call MultiboardSetRowCount(MB[int], GetNumberPlayers()+4)
                set tmbi = MultiboardGetItem(MB[int], 0, 0)
                call MultiboardSetItemValue(tmbi, MISCTITLE)
                call MultiboardReleaseItem(tmbi)
                set tmbi = MultiboardGetItem(MB[int], 0, 1)
                call MultiboardSetItemValue(tmbi, LevelsColor + "L|r")
                call MultiboardReleaseItem(tmbi)
                set tmbi = MultiboardGetItem(MB[int], 0, 2)
                call MultiboardSetItemValue(tmbi, KillsColor + "K|r")
                call MultiboardReleaseItem(tmbi)
                set tmbi = MultiboardGetItem(MB[int], 0, 3)
                call MultiboardSetItemValue(tmbi, DeathsColor + "D|r")
                call MultiboardReleaseItem(tmbi)
                set tmbi = MultiboardGetItem(MB[int], 0, 4)
                call MultiboardSetItemValue(tmbi, GoldColor + "G|r")
                call MultiboardReleaseItem(tmbi)
                set tmbi = MultiboardGetItem(MB[int], 1, 0)
                call MultiboardSetItemValue(tmbi, Name1)
                call MultiboardReleaseItem(tmbi)
                set tmbi = MultiboardGetItem(MB[int], 1, 2)
                call MultiboardSetItemValue(tmbi, KillsColor + "0|r")
                call MultiboardReleaseItem(tmbi)
                set tmbi = MultiboardGetItem(MB[int], 1, 3)
                call MultiboardSetItemValue(tmbi, DeathsColor + "0|r")
                call MultiboardReleaseItem(tmbi)
                set Tempint = 1
                loop
                    exitwhen index > MaxPlayers/2 - 1
                    if pss[index+1] == playing or pss[index+1] == left then
                        call Pf(Player(index))
                    endif
                    set index = index + 1
                endloop
                set Tempint = Tempint + 2
                set tmbi = MultiboardGetItem(MB[int], Tempint, 0)
                call MultiboardSetItemValue(tmbi, Name2)
                call MultiboardReleaseItem(tmbi)
                set tmbi = MultiboardGetItem(MB[int], Tempint, 2)
                call MultiboardSetItemValue(tmbi, KillsColor + "0|r")
                call MultiboardReleaseItem(tmbi)
                set tmbi = MultiboardGetItem(MB[int], Tempint, 3)
                call MultiboardSetItemValue(tmbi, DeathsColor + "0|r")
                call MultiboardReleaseItem(tmbi)
                loop
                    exitwhen index > MaxPlayers - 1
                    if pss[index+1] == playing or pss[index+1] == left then
                        call Pf(Player(index))
                    endif
                    set index = index + 1
                endloop
                // I'm ashamed :(
                call MultiboardSetItemStyleBJ(MB[int], 0, 0, true, false)
                call MultiboardSetItemWidthBJ(MB[int], 1, 0, 12.25)
                call MultiboardSetItemWidthBJ(MB[int], 2, 0, 3.00)
                call MultiboardSetItemWidthBJ(MB[int], 3, 0, 3.00)
                call MultiboardSetItemWidthBJ(MB[int], 4, 0, 3.00)
                call MultiboardSetItemWidthBJ(MB[int], 5, 0, 3.00)
                if GetLocalPlayer() == Player(int-1) then
                    call MultiboardDisplay(MB[int], true)
                endif
                set index = 0
            endloop
            set tmbi = null
        endfunction
       
        // This function is used to update the multiboard COMPLETELY
        // If you want to update something specific, use the alternate functions below
        function UpMB takes nothing returns nothing
            local integer i = 1
            local integer index = 0
            local multiboarditem tmbi
            local string s1
            local string s2
           
            loop
                exitwhen i > MaxPlayers
                set pss[i] = GetPlayerSlotState(Player(i-1))
                set i = i + 1
            endloop
           
            set int = 0
            loop
                exitwhen int > MaxPlayers
                set int = int + 1
                set s1 = I2S(udg_$k$[int])
                set s2 = I2S(udg_$d$[int])
                call MultiboardSetTitleText(MB[int], "|cffaaaaaa" + s1 + "/" + s2 + "|r - " + GAMETITLE)
                set udg_$tk$[1] = udg_$k$[1] + udg_$k$[2] + udg_$k$[3] + udg_$k$[4] + udg_$k$[5]
                set tmbi = MultiboardGetItem(MB[int], 1, 2)
                call MultiboardSetItemValue(tmbi, KillsColor + I2S(udg_$tk$[1]) + "|r")
                call MultiboardReleaseItem(tmbi)
                set udg_$td$[1] = udg_$d$[1] + udg_$d$[2] + udg_$d$[3] + udg_$d$[4] + udg_$d$[5]
                set tmbi = MultiboardGetItem(MB[int], 1, 3)
                call MultiboardSetItemValue(tmbi, DeathsColor + I2S(udg_$td$[1]) + "|r")
                call MultiboardReleaseItem(tmbi)
                set Tempint = 1
                loop
                    exitwhen index > MaxPlayers/2 - 1
                    if pss[index+1] == playing or pss[index+1] == left then
                        call Pf(Player(index))
                    endif
                    set index = index + 1
                endloop
                set Tempint = Tempint + 2
                set udg_$tk$[2] = udg_$k$[6] + udg_$k$[7] + udg_$k$[8] + udg_$k$[9] + udg_$k$[10]
                set tmbi = MultiboardGetItem(MB[int], Tempint, 2)
                call MultiboardSetItemValue(tmbi, KillsColor + I2S(udg_$tk$[2]) + "|r")
                call MultiboardReleaseItem(tmbi)
                set udg_$td$[2] = udg_$d$[6] + udg_$d$[7] + udg_$d$[8] + udg_$d$[9] + udg_$d$[10]
                set tmbi = MultiboardGetItem(MB[int], Tempint, 3)
                call MultiboardSetItemValue(tmbi, DeathsColor + I2S(udg_$td$[2]) + "|r")
                call MultiboardReleaseItem(tmbi)
                loop
                    exitwhen index > MaxPlayers - 1
                    if pss[index+1] == playing or pss[index+1] == left then
                        call Pf(Player(index))
                    endif
                    set index = index + 1
                endloop
                set index = 0
            endloop
            set tmbi = null
        endfunction
    //! endtextmacro
   
    //  !!!  A T T E N T I O N   A L L   G U I E R S  !!!
    // THIS IS YOUR CONFIGURATION LINE:
    // You're supposed to put the variable names in GUI
   
    //                              KILLS          DEATHS          LEVELS          COLORS         GOLD       TEAM KILLS   TEAM DEATHS
    //! runtextmacro SYSTEMCODE("PlayerKills", "PlayerDeaths", "PlayerLevels", "PlayerColors", "PlayerGold", "TeamKills", "TeamDeaths")
   
    private function Init takes nothing returns nothing
        local trigger t = CreateTrigger()
        call TriggerRegisterTimerEvent(t, 0.01, false)
        call TriggerAddAction(t, function CreateMB)
    endfunction
endlibrary
[/HIDDEN]

I accept constructive critisism, so feel free to comment, flame, steal, claim yours, kill me, ...
I don't care.

Most importantly and paradoxical with the above statement:

GIVE CREDITS IF USED


PS: This system is GUI friendly (sort of), so i included it in the GUI section too.

[highlight]UPDATE:[/highlight]
*Fixed some major bugs x)
*Added a screenshot
*Redid some parts of the system
*Made it 10x more GUI Friendly than it was in v1.01 ^^
*A more powerful Multiboard :D

[highlight]UPDATE:[/highlight]
*Gave a better screenshot.

If you can't see the thumbnail of this screenshot in the spells section, then clear your cache :)

Keywords:
Multiboard, AoS, Hero, Arena, Kills, Magtheridon96, vJASS, JASS, System, combat, system, board, score, leaderboard, status, stats, player, DotA
Contents

Just another Warcraft III map (Map)

Reviews
Moderator
12th Dec 2015 IcemanBo: Too long as NeedsFix. Rejected. 12 Nov 2011 Bribe: Your initializer is fine as a library initializer, however creating a trigger for the timer is quite unnecessary, you just need a normal timer here. You configuration...
  1. Xian

    Xian

    Joined:
    Mar 23, 2011
    Messages:
    945
    Resources:
    0
    Resources:
    0
    Isnt that in dota?
     
  2. Magtheridon96

    Magtheridon96

    Joined:
    Dec 12, 2008
    Messages:
    6,005
    Resources:
    26
    Maps:
    1
    Spells:
    8
    Tutorials:
    7
    JASS:
    10
    Resources:
    26
    It's a multiboard :p
    It appears in 40% of ALL maps on the hive x)


    EDIT: It DOES have an ingame screenshot!
    If you're talking about the thumbnail in the spells section,
    then if you clear your cache, it will go away :)

    If you wanted me to upload a BETTER screenshot, you could've said so :/
     
    Last edited: May 14, 2011
  3. baassee

    baassee

    Joined:
    Nov 14, 2008
    Messages:
    3,220
    Resources:
    17
    Spells:
    14
    Tutorials:
    3
    Resources:
    17
    This is not vJASS friendly as you use GUI variables in the textmacro itself and update function. Now you should make GUI function wrappers instead (will probably inline if JNGP is used) of the thing you are doing now with using GUI variables.

    And yeah really the system should be able to have vJASS section which updates itself according to a death or a kill (just make those GUI functions INSIDE the code).

    Also you could to make it vJASS friendly just have a few global variables that you named udg_name that are commented out in the first place so it will be easy to configure for both GUI and vJASSers.

    Sorry I messed up but I had a new idea while writing this, either way great system!

    EDIT:

    Like this

    Code (vJASS):
            /*
            private             integer array           udg_PlayerDeaths
            private             integer array           udg_PlayerGold  
            private             integer array           udg_PlayerKills  
            private             integer array           udg_PlayerLevels
            private             integer array           udg_TeamDeaths  
            private             integer array           udg_TeamKills  
            private             string array            udg_PlayerColors */

        endglobals  


    EDIT2:

    What is this?
    // If you want to update something specific, use the alternate functions below
     
    Last edited: May 28, 2011
  4. Magtheridon96

    Magtheridon96

    Joined:
    Dec 12, 2008
    Messages:
    6,005
    Resources:
    26
    Maps:
    1
    Spells:
    8
    Tutorials:
    7
    JASS:
    10
    Resources:
    26
    xD xD I was going to split the update function, but I decided not to :p
    I guess I forgot to remove that comment =P

    I'm updating this system since my knowledge of vJASS has .. "increased" .. since the time
    I uploaded it =P

    *working*
     
  5. mckill2009

    mckill2009

    Joined:
    Mar 10, 2009
    Messages:
    4,696
    Resources:
    34
    Maps:
    5
    Spells:
    27
    JASS:
    2
    Resources:
    34
    dude, you should use loops...
    Code (vJASS):

        loop
            set i = i+1
            set mbi[i] = MultiboardGetItem(MB[int], Tempint, 0)
            exitwhen i > 4
        endloop  
     


    Code (vJASS):

        set i = 1
        loop
            set i = i+1                
            call MultiboardSetItemWidth(MultiboardGetItem(MB[int], i, 0), 3.0)
            exitwhen i > 5
        endloop
     
     
  6. Magtheridon96

    Magtheridon96

    Joined:
    Dec 12, 2008
    Messages:
    6,005
    Resources:
    26
    Maps:
    1
    Spells:
    8
    Tutorials:
    7
    JASS:
    10
    Resources:
    26
    Wow this system is lame XD
     
  7. DsDarkMaster

    DsDarkMaster

    Joined:
    May 4, 2010
    Messages:
    607
    Resources:
    0
    Resources:
    0
    magtheridon please use constructive critism and not just say "wow its lame"
    1.say somthing thats wrong with it
    2.suggest a way to fix it
    3.suggest improvments
     
  8. mckill2009

    mckill2009

    Joined:
    Mar 10, 2009
    Messages:
    4,696
    Resources:
    34
    Maps:
    5
    Spells:
    27
    JASS:
    2
    Resources:
    34
    lol!, he doesnt mind coz it's his creation...
     
  9. Xian

    Xian

    Joined:
    Mar 23, 2011
    Messages:
    945
    Resources:
    0
    Resources:
    0
    its a joke,look at page 1
    by magtheridon96 XD
     
  10. DsDarkMaster

    DsDarkMaster

    Joined:
    May 4, 2010
    Messages:
    607
    Resources:
    0
    Resources:
    0
    opps my mistake sorry
     
  11. Magtheridon96

    Magtheridon96

    Joined:
    Dec 12, 2008
    Messages:
    6,005
    Resources:
    26
    Maps:
    1
    Spells:
    8
    Tutorials:
    7
    JASS:
    10
    Resources:
    26
    I think I'm going to change this to an implementation of Board :p
     
  12. RakEnRoL

    RakEnRoL

    Joined:
    Sep 2, 2011
    Messages:
    316
    Resources:
    0
    Resources:
    0
    Are you using your CDS in this system?
     
  13. Magtheridon96

    Magtheridon96

    Joined:
    Dec 12, 2008
    Messages:
    6,005
    Resources:
    26
    Maps:
    1
    Spells:
    8
    Tutorials:
    7
    JASS:
    10
    Resources:
    26
    This is a very bad system currently.
    I don't know when, but I'm going to update it.
    I'm trying to perfect all my resources, but I have way too many :/
     
  14. RakEnRoL

    RakEnRoL

    Joined:
    Sep 2, 2011
    Messages:
    316
    Resources:
    0
    Resources:
    0
    Awwww.. Please do update this with CDS if you have time.
     
  15. pred1980

    pred1980

    Joined:
    Mar 19, 2010
    Messages:
    842
    Resources:
    1
    Maps:
    1
    Resources:
    1
    Is the current version stable or are there still bugs?
     
  16. DsDarkMaster

    DsDarkMaster

    Joined:
    May 4, 2010
    Messages:
    607
    Resources:
    0
    Resources:
    0
    tip if it gets accepted then its stable
     
  17. pred1980

    pred1980

    Joined:
    Mar 19, 2010
    Messages:
    842
    Resources:
    1
    Maps:
    1
    Resources:
    1
  18. Magtheridon96

    Magtheridon96

    Joined:
    Dec 12, 2008
    Messages:
    6,005
    Resources:
    26
    Maps:
    1
    Spells:
    8
    Tutorials:
    7
    JASS:
    10
    Resources:
    26
    This is a horrible system :p
     
  19. DsDarkMaster

    DsDarkMaster

    Joined:
    May 4, 2010
    Messages:
    607
    Resources:
    0
    Resources:
    0
    remake it then
     
  20. Magtheridon96

    Magtheridon96

    Joined:
    Dec 12, 2008
    Messages:
    6,005
    Resources:
    26
    Maps:
    1
    Spells:
    8
    Tutorials:
    7
    JASS:
    10
    Resources:
    26
    If I have time for it, I will.