Ticket #2447: ready.patch

File ready.patch, 15.4 KB (added by scythetwirler, 10 years ago)

Side effect: deletes the player name column because it wouldn't fit otherwise.

  • binaries/data/mods/public/gui/common/modern/sprites.xml

     
    296296            size="0 0 22 22"
    297297        />
    298298    </sprite>
     299    <sprite name="ModernCheckOn">
     300        <image  texture="global/modern/checkbox-on.png"
     301            real_texture_placement="0 0 32 32"
     302        />
     303    </sprite>
     304    <sprite name="ModernCheckOff">
     305        <image  texture="global/modern/checkbox-off.png"
     306            real_texture_placement="0 0 32 32"
     307        />
     308    </sprite>
    299309</sprites>
  • binaries/data/mods/public/gui/gamesetup/gamesetup.js

     
    3535
    3636// Default game setup attributes
    3737var g_DefaultPlayerData = [];
     38var g_IsReady = false;
     39var g_ReadyData = {};
    3840var g_GameAttributes = {
    3941    settings: {}
    4042};
     
    281283    // Set up multiplayer/singleplayer bits:
    282284    if (!g_IsNetworked)
    283285    {
    284         Engine.GetGUIObjectByName("chatPanel").hidden = true;
     286        Engine.GetGUIObjectByName("chatPanel").hidden = true;       
     287        Engine.GetGUIObjectByName("toggleReady").hidden = true;
    285288        Engine.GetGUIObjectByName("enableCheats").checked = true;
    286289        g_GameAttributes.settings.CheatsEnabled = true;
    287290    }
    288291    else
    289292    {
     293        Engine.GetGUIObjectByName("toggleReady").hidden = false;
    290294        Engine.GetGUIObjectByName("enableCheatsDesc").hidden = false;
    291295        Engine.GetGUIObjectByName("enableCheats").checked = false;
    292296        g_GameAttributes.settings.CheatsEnabled = false;
     
    347351        // to allow easy keyboard selection of maps
    348352        Engine.GetGUIObjectByName("mapSelection").focus();
    349353    }
     354    resetReady();
    350355}
    351356
    352357function handleNetMessage(message)
     
    384389        // Find and report all joinings/leavings
    385390        for (var host in message.hosts)
    386391            if (! g_PlayerAssignments[host])
     392            {
    387393                addChatMessage({ "type": "connect", "username": message.hosts[host].name });
     394                g_ReadyData[host] = false;
     395                resetReady();
     396            }
    388397
    389398        for (var host in g_PlayerAssignments)
    390399            if (! message.hosts[host])
     400            {
    391401                addChatMessage({ "type": "disconnect", "guid": host });
     402                g_ReadyData[host] = false;
     403                resetReady();
     404            }
    392405
    393406        // Update the player list
    394407        g_PlayerAssignments = message.hosts;
     
    399412        break;
    400413
    401414    case "start":
     415        if (!g_IsController)
     416        {
     417            for (var guid in g_PlayerAssignments)
     418            {
     419                if (g_PlayerAssignments[guid].player != 255 && !g_ReadyData[guid])
     420                {
     421                    cancelSetup();
     422                    if (Engine.HasXmppClient())
     423                        Engine.SwitchGuiPage("page_lobby.xml");
     424                    else
     425                        Engine.SwitchGuiPage("page_pregame.xml");
     426                    reportDisconnect("The host has tampered with the code");
     427                    return;
     428                }
     429            }
     430        }
    402431        if (g_IsController && Engine.HasXmppClient())
    403432        {
    404433            var players = [ assignment.name for each (assignment in g_PlayerAssignments) ]
     
    413442        break;
    414443
    415444    case "chat":
    416         addChatMessage({ "type": "message", "guid": message.guid, "text": message.text });
     445        if (message.text == "/setready")
     446        {
     447            Engine.GetGUIObjectByName("playerReadySprite[" + String(g_PlayerAssignments[message.guid].player - 1) + "]").sprite = "ModernCheckOn";
     448            g_ReadyData[message.guid] = true;
     449            addChatMessage({ "type": "message", "guid": message.guid, "text": "/" + g_PlayerAssignments[message.guid].name + " is ready to start!" });             
     450        }
     451        else if (message.text == "/unsetready")
     452        {
     453            Engine.GetGUIObjectByName("playerReadySprite[" + String(g_PlayerAssignments[message.guid].player - 1) + "]").sprite = "ModernCheckOff";
     454            g_ReadyData[message.guid] = false;
     455            addChatMessage({ "type": "message", "guid": message.guid, "text": "/" + g_PlayerAssignments[message.guid].name + " is not ready to start." });
     456        }
     457        else
     458            addChatMessage({ "type": "message", "guid": message.guid, "text": message.text });
    417459        break;
    418460
    419461    default:
     
    587629
    588630function cancelSetup()
    589631{
     632    g_ReadyData = {};
     633    resetReady();
    590634    Engine.DisconnectNetworkGame();
    591635
    592636    if (Engine.HasXmppClient())
     
    809853    updateGameAttributes();
    810854}
    811855
     856function setReady(inputReady)
     857{
     858    if (inputReady == g_IsReady)
     859    {
     860        return;
     861    }
     862    for (var guid in g_PlayerAssignments)
     863    {
     864        if (g_PlayerAssignments[guid].name.split(" (")[0] == Engine.ConfigDB_GetValue("user", "playername"))
     865        {
     866            if (g_PlayerAssignments[guid].player == 255)
     867                addErrorMessage("You cannot be ready if you haven't been assigned yet!");
     868            if (inputReady)
     869                Engine.SendNetworkChat("/setready")
     870            else
     871                Engine.SendNetworkChat("/unsetready");
     872            g_IsReady = inputReady;
     873        }
     874    }
     875}
     876
     877function toggleReady()
     878{
     879    setReady(!g_IsReady);
     880}
     881
    812882function launchGame()
    813883{
    814884    if (g_IsNetworked && !g_IsController)
     
    817887        return;
    818888    }
    819889
     890    if (g_IsNetworked)
     891    {
     892        for (var guid in g_PlayerAssignments)
     893        {
     894            if (g_PlayerAssignments[guid].player != 255 && !g_ReadyData[guid])
     895            {
     896                addErrorMessage("All active players must be ready before starting!")
     897                return;
     898            }
     899        }
     900    }
     901
    820902    // Check that we have a map
    821903    if (!g_GameAttributes.map)
    822904        return;
     
    11401222        // Common to all game types
    11411223        var color = iColorToString(getSetting(pData, pDefs, "Colour"));
    11421224        pColor.sprite = "colour:"+color+" 100";
    1143         pName.caption = getSetting(pData, pDefs, "Name");
    11441225
    11451226        var team = getSetting(pData, pDefs, "Team");
    11461227        var civ = getSetting(pData, pDefs, "Civ");
     
    11771258
    11781259    // Game attributes include AI settings, so update the player list
    11791260    updatePlayerList();
     1261    resetReady();
    11801262}
    11811263
    11821264function updateGameAttributes()
     
    12041286        updatePlayerList();
    12051287}
    12061288
     1289function resetReady()
     1290{
     1291    g_IsReady = false;
     1292    // If we just joined, g_PlayerAssignments won't have been loaded yet.
     1293    if (Object.keys(g_PlayerAssignments).length == 0)
     1294        return;
     1295    // AI and unassigned are automatically ready.
     1296    for (var player = 0; player < MAX_PLAYERS; player++)
     1297    {
     1298        try
     1299        {
     1300            Engine.GetGUIObjectByName("playerReadySprite[" + String(player) + "]").sprite = "ModernCheckOn";
     1301        }
     1302        catch (TypeError) {}       
     1303    }
     1304    if (g_IsNetworked) // Set multiplayer readiness to default.
     1305    {
     1306        for (var guid in g_PlayerAssignments)
     1307        {
     1308            try
     1309            {
     1310                Engine.GetGUIObjectByName("playerReadySprite[" + String(g_PlayerAssignments[guid].player - 1) + "]").sprite = "ModernCheckOff";
     1311            }
     1312            catch (TypeError) {}           
     1313        }
     1314        for (var guid in g_ReadyData)
     1315        {
     1316            g_ReadyData[guid] = false;
     1317        }
     1318    }
     1319}
     1320
    12071321function updatePlayerList()
    12081322{
    12091323    g_IsInGuiUpdate = true;
     
    14121526
    14131527    // Remove AI from this player slot
    14141528    g_GameAttributes.settings.PlayerData[newSlot].AI = "";
     1529    resetReady();
    14151530}
    14161531
    14171532function submitChatInput()
     
    14201535    var text = input.caption;
    14211536    if (text.length)
    14221537    {
    1423         Engine.SendNetworkChat(text);
     1538        if (text[0] == "/")
     1539        {
     1540            if (text.substr(1).toLowerCase() == "setready" && !g_IsReady)
     1541                setReady(true);
     1542            else if (text.substr(1).toLowerCase()  == "unsetready" && g_IsReady)
     1543                setReady(false);               
     1544            else
     1545                addErrorMessage("The " + text.split(" ")[0] + " command is not supported.");
     1546        }
     1547        else
     1548            Engine.SendNetworkChat(text);
    14241549        input.caption = "";
    14251550    }
    14261551}
    14271552
     1553function addErrorMessage(message)
     1554{
     1555    var formatted = '[font="serif-bold-13"]<[color="255 0 0"]system[/color]>[/font] ' + message;
     1556    g_ChatMessages.push(formatted);
     1557    Engine.GetGUIObjectByName("chatText").caption = g_ChatMessages.join("\n");
     1558}
     1559
    14281560function addChatMessage(msg)
    14291561{
    14301562    var username = escapeText(msg.username || g_PlayerAssignments[msg.guid].name);
     
    14571589        break;
    14581590
    14591591    case "message":
    1460         formatted = '[font="serif-bold-13"]<[color="'+ color +'"]' + username + '[/color]>[/font] ' + message;
     1592        if (message[0] == '/')
     1593            if (Engine.HasXmppClient())
     1594                formatted = '[font="serif-bold-13"]*[color="'+ color +'"]' + username + '[/color][/font]' + message.substr(message.indexOf(") ") + 1);
     1595            else
     1596                formatted = '[font="serif-bold-13"]*[color="'+ color +'"]' + username + '[/color][/font]' + message.substr(message.indexOf(" "));
     1597        else
     1598            formatted = '[font="serif-bold-13"]<[color="'+ color +'"]' + username + '[/color]>[/font] ' + message;
    14611599        break;
    14621600
    14631601    default:
  • binaries/data/mods/public/gui/gamesetup/gamesetup.xml

     
    1414        <object style="TitleText" type="text" size="50%-128 4 50%+128 36">
    1515            Match Setup
    1616        </object>
    17    
     17
    1818        <object type="image" style="ModernDialog" size="50%-190 50%-80 50%+190 50%+80" name="loadingWindow">
    1919
    2020            <object type="text" style="TitleText" size="50%-128 0%-16 50%+128 16">
     
    3232            <action on="Tick">
    3333                onTick();
    3434            </action>
    35            
     35
    3636            <!-- Number of Players-->
    3737            <object size="24 26 224 54">
    3838
     
    4040                <object size="0 0 150 28">
    4141                    <object size="0 0 100% 100%" type="text" style="ModernRightLabelText">Number of players:</object>
    4242                </object>
    43                    
     43
    4444                <!-- Number of Players-->
    4545                <object size="150 0 200 28">
    4646                    <object name="numPlayersText" size="0 0 100% 100%" type="text" style="ModernLeftLabelText"/>
     
    5353                        <action on="SelectionChange">selectNumPlayers(this.list_data[this.selected]);</action>
    5454                    </object>
    5555                </object>
     56            </object>
    5657
    57             </object>
    58            
    5958            <!-- Player assignments -->
    6059            <object size="24 59 100%-440 358" type="image" sprite="ModernDarkBoxGold" name="playerAssignmentsPannel">
    6160                <object size="0 6 100% 30">
    62                     <object name="playerNameHeading" type="text" style="ModernLabelText" size="0 0 20% 100%">Player Name</object>
    63                     <object name="playerPlacementHeading" type="text" style="ModernLabelText" size="20%+5 0 50% 100%">Player Placement</object>
    64                     <object name="playerCivHeading" type="text" style="ModernLabelText" size="50%+65 0 85% 100%">Civilization</object>
     61                    <object name="playerPlacementHeading" type="text" style="ModernLabelText" size="5 0 40% 100%">Player Name</object>
     62                    <object name="playerCivHeading" type="text" style="ModernLabelText" size="40%+65 0 75%-26 100%">Civilization</object>
    6563                    <object name="civInfoButton"
    6664                        type="button"
    6765                        sprite="iconInfoGold"
    6866                        sprite_over="iconInfoWhite"
    69                         size="82%-8 0 82%+8 16"
     67                        size="57.5%+68 0 57.5%+84 16"
    7068                        tooltip_style="onscreenToolTip"
    7169                        tooltip="View civilization info"
    7270                    >
     
    7472                            Engine.PushGuiPage("page_civinfo.xml");
    7573                        ]]></action>
    7674                    </object>
    77                     <object name="playerTeamHeading" type="text" style="ModernLabelText" size="85%+5 0 100%-5 100%">Team</object>
     75                    <object name="playerTeamHeading" type="text" style="ModernLabelText" size="75%+5 0 90%-5 100%">Team</object>
     76                    <object name="playerReadyHeading" type="text" style="ModernLabelText" size="90%+5 0 100%-5 100%">Ready</object>
    7877                </object>
    7978                <object size="1 36 100%-1 100%">
    8079                    <repeat count="8">
    8180                        <object name="playerBox[n]" size="0 0 100% 32" hidden="true">
    8281                            <object name="playerColour[n]" type="image" size="0 0 100% 100%"/>
    83                             <object name="playerName[n]" type="text" style="ModernLabelText" size="0 2 20% 30"/>
    84                             <object name="playerAssignment[n]" type="dropdown" style="ModernDropDown" size="20%+5 2 50% 30" tooltip_style="onscreenToolTip" tooltip="Select player."/>
    85                             <object name="playerConfig[n]" type="button" style="StoneButton" size="50%+5 6 50%+60 26"
     82                            <object name="playerAssignment[n]" type="dropdown" style="ModernDropDown" size="5 2 40% 30" tooltip_style="onscreenToolTip" tooltip="Select player."/>
     83                            <object name="playerConfig[n]" type="button" style="StoneButton" size="40%+5 6 40%+60 26"
    8684                                tooltip_style="onscreenToolTip"
    8785                                tooltip="Configure AI settings."
    8886                                font="serif-bold-stroke-12"
    8987                            >Settings</object>
    90                             <object name="playerCiv[n]" type="dropdown" style="ModernDropDown" size="50%+65 2 85% 30" tooltip_style="onscreenToolTip" tooltip="Select player's civilization."/>
    91                             <object name="playerCivText[n]" type="text" style="ModernLabelText" size="50%+65 0 85% 30"/>
    92                             <object name="playerTeam[n]" type="dropdown" style="ModernDropDown" size="85%+5 2 100%-5 30" tooltip_style="onscreenToolTip" tooltip="Select player's team."/>
    93                             <object name="playerTeamText[n]" type="text" style="ModernLabelText" size="85%+5 0 100%-5 100%"/>
     88                            <object name="playerCiv[n]" type="dropdown" style="ModernDropDown" size="40%+65 2 75% 30" tooltip_style="onscreenToolTip" tooltip="Select player's civilization."/>
     89                            <object name="playerCivText[n]" type="text" style="ModernLabelText" size="40%+65 0 75% 30"/>
     90                            <object name="playerTeam[n]" type="dropdown" style="ModernDropDown" size="75%+5 2 90%-5 30" tooltip_style="onscreenToolTip" tooltip="Select player's team."/>
     91                            <object name="playerTeamText[n]" type="text" style="ModernLabelText" size="75%+5 0 90%-5 100%"/>
     92                            <object name="playerReadySprite[n]" type="image" sprite="ModernCheckOff" size="95%-16 0 95%+16 32"/>
    9493                        </object>
    9594                    </repeat>
    9695                </object>
    9796            </object>
    98             <object size="24 64 100%-460 358" type="image" sprite="CoverFillDark" name="playerAssignmentsPannelCover" hidden="true"/>
     97            <object size="24 64 100%-460 358" type="image" sprite="CoverFillDark" name="playerAssignmentsPanelCover" hidden="true"/>
    9998            <!-- Map selection -->
    10099           
    101100           
     
    112111                <object name="mapSelectionText" type="text" style="ModernLeftLabelText" size="0 64 100% 94"  hidden="true"/>
    113112                <object name="mapSizeText" type="text" style="ModernLeftLabelText" size="0 96 100% 126" hidden="true"/>
    114113            </object>
    115            
     114
    116115            <object name="mapTypeSelection"
    117116                type="dropdown"
    118117                style="ModernDropDown"
     
    159158            </object>
    160159
    161160            <!-- Chat window -->
    162             <object name="chatPanel" size="24 370 100%-440 100%-60" type="image" sprite="ModernDarkBoxGold">
     161            <object name="chatPanel" size="24 370 100%-440 100%-58" type="image" sprite="ModernDarkBoxGold">
    163162                <object name="chatText" size="2 2 100%-2 100%-26" type="text" style="ChatPanel"/>
    164163
    165164                <object name="chatInput" size="4 100%-24 100%-76 100%-4" type="input" style="ModernInput">
     
    179178                textcolor="white"
    180179                sprite="BackgroundTranslucent"
    181180                hidden="true"
    182                 size="100%-700 100%-56 100%-312 100%-24"
     181                size="25 100%-56 100%-445 100%-24"
    183182            >[Tooltip text]</object>
    184183
     184            <!-- Ready Button -->
     185            <object
     186                name="toggleReady"
     187                type="button"
     188                style="StoneButton"
     189                hidden="false"
     190                size="100%-425 100%-52 100%-305 100%-24"
     191                tooltip_style="onscreenToolTip"
     192                tooltip="Accept the current settings and state you are ready to play!"
     193                enabled="true"
     194            >
     195                Set/Unset Ready
     196                <action on="Press">toggleReady();</action>
     197            </object>
     198
    185199            <!-- Start Button -->
    186200            <object
    187201                name="startGame"
    188202                type="button"
    189203                style="StoneButton"
    190                 size="100%-308 100%-52 100%-168 100%-24"
     204                size="100%-285 100%-52 100%-165 100%-24"
    191205                tooltip_style="onscreenToolTip"
    192206                tooltip="Start a new game with the current settings."
    193207                enabled="false"
     
    202216                caption="Back"
    203217                type="button"
    204218                style="StoneButton"
    205                 size="100%-164 100%-52 100%-24 100%-24"
     219                size="100%-145 100%-52 100%-25 100%-24"
    206220                tooltip_style="onscreenToolTip"
    207221            >
    208222                <action on="Press">
     
    215229                    ]]>
    216230                </action>
    217231            </object>
    218            
     232
    219233            <!-- Options -->
    220234            <object name="gameOptionsBox" size="100%-425 497 100%-25 525">
    221235                <!-- More Options Button -->