• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

Return-To-The-Roots / s25client / 20194965430

13 Dec 2025 04:48PM UTC coverage: 50.052%. First build
20194965430

Pull #1720

github

web-flow
Merge f32c9b7c0 into a8dc3da9a
Pull Request #1720: Add leather addon

312 of 1143 new or added lines in 68 files covered. (27.3%)

22779 of 45511 relevant lines covered (50.05%)

35641.36 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/libs/s25main/ingameWindows/iwBuildOrder.cpp
1
// Copyright (C) 2005 - 2021 Settlers Freaks (sf-team at siedler25.org)
2
//
3
// SPDX-License-Identifier: GPL-2.0-or-later
4

5
#include "iwBuildOrder.h"
6
#include "AddonHelperFunctions.h"
7
#include "GamePlayer.h"
8
#include "GlobalGameSettings.h"
9
#include "LeatherLoader.h"
10
#include "Loader.h"
11
#include "WindowManager.h"
12
#include "WineLoader.h"
13
#include "addons/const_addons.h"
14
#include "controls/ctrlComboBox.h"
15
#include "controls/ctrlImage.h"
16
#include "controls/ctrlList.h"
17
#include "network/GameClient.h"
18
#include "world/GameWorldBase.h"
19
#include "world/GameWorldViewer.h"
20
#include "gameData/BuildingConsts.h"
21
#include "gameData/const_gui_ids.h"
22

NEW
23
void iwBuildOrder::fillBuildOrder(const BuildOrders& build_order)
×
24
{
NEW
25
    pendingBuildOrder.assign(build_order.begin(), build_order.end());
×
NEW
26
    helpers::erase_if(pendingBuildOrder, makeIsUnusedBuilding(gwv.GetWorld().GetGGS()));
×
27
}
×
28

29
iwBuildOrder::iwBuildOrder(const GameWorldViewer& gwv)
×
30
    : TransmitSettingsIgwAdapter(CGI_BUILDORDER, IngameWindow::posLastOrCenter, Extent(320, 300),
×
31
                                 _("Building sequence"), LOADER.GetImageN("io", 5)),
×
32
      gwv(gwv)
×
33
{
34
    ctrlList* list = AddList(0, DrawPoint(15, 60), Extent(150, 220), TextureColor::Grey, NormalFont);
×
35

NEW
36
    fillBuildOrder(GAMECLIENT.visual_settings.build_order);
×
37

38
    for(const auto buildOrder : pendingBuildOrder)
×
39
        list->AddString(_(BUILDING_NAMES[buildOrder])); //-V807
×
40

41
    // Nach ganz oben
42
    AddImageButton(1, DrawPoint(250, 194), Extent(48, 20), TextureColor::Grey, LOADER.GetImageN("io", 215), _("Top"));
×
43
    // Hoch
44
    AddImageButton(2, DrawPoint(250, 216), Extent(48, 20), TextureColor::Grey, LOADER.GetImageN("io", 33), _("Up"));
×
45
    // Runter
46
    AddImageButton(3, DrawPoint(250, 238), Extent(48, 20), TextureColor::Grey, LOADER.GetImageN("io", 34), _("Down"));
×
47
    // Nach ganz unten
48
    AddImageButton(4, DrawPoint(250, 260), Extent(48, 20), TextureColor::Grey, LOADER.GetImageN("io", 216),
×
49
                   _("Bottom"));
×
50

51
    // Bild der Auswahl
52
    AddImage(5, DrawPoint(240, 150), LOADER.GetBuildingTex(gwv.GetPlayer().nation, pendingBuildOrder[0]));
×
53

54
    ctrlComboBox* combo = AddComboBox(6, DrawPoint(15, 30), Extent(290, 20), TextureColor::Grey, NormalFont, 100);
×
55
    combo->AddString(_("Sequence of given order"));   // "Reihenfolge der Auftraggebung"
×
56
    combo->AddString(_("After the following order")); // "Nach folgender Reihenfolge"
×
57

58
    // Eintrag in Combobox auswählen
59
    useCustomBuildOrder = GAMECLIENT.visual_settings.useCustomBuildOrder;
×
60
    combo->SetSelection(useCustomBuildOrder ? 1 : 0);
×
61

62
    // Standard
63
    AddImageButton(10, DrawPoint(200, 250), Extent(48, 30), TextureColor::Grey, LOADER.GetImageN("io", 191),
×
64
                   _("Default"));
×
65

66
    list->SetSelection(0);
×
67
}
×
68

69
void iwBuildOrder::TransmitSettings()
×
70
{
71
    if(GAMECLIENT.IsReplayModeOn())
×
72
        return;
×
73
    // Wurden Einstellungen geändert?
74
    if(settings_changed)
×
75
    {
76
        // Einstellungen speichern
77
        useCustomBuildOrder = GetCtrl<ctrlComboBox>(6)->GetSelection() != 0u;
×
78
        BuildOrders transmitPendingBuildOrder;
79
        unsigned int i = 0;
×
80
        for(; i < pendingBuildOrder.size(); i++)
×
81
            transmitPendingBuildOrder[i] = pendingBuildOrder[i];
×
82

83
        if(!wineaddon::isAddonActive(gwv.GetWorld()))
×
84
        {
85
            transmitPendingBuildOrder[i++] = BuildingType::Vineyard;
×
86
            transmitPendingBuildOrder[i++] = BuildingType::Winery;
×
87
            transmitPendingBuildOrder[i++] = BuildingType::Temple;
×
88
        }
89

90
        // This is not an OBB write because pendingBuildOrder does not contain the leather/wine building
91
        // entries when the addon is inactive. So the pendingBuildOrder list is shorter then
92
        // the transmitPendingBuildOrder list. See fillBuildOrder at the top of this file.
93
        if(!gwv.GetWorld().GetGGS().isEnabled(AddonId::CHARBURNER))
×
94
            transmitPendingBuildOrder[i++] = BuildingType::Charburner;
×
95

NEW
96
        if(!leatheraddon::isAddonActive(gwv.GetWorld()))
×
97
        {
NEW
98
            transmitPendingBuildOrder[i++] = BuildingType::Skinner;
×
NEW
99
            transmitPendingBuildOrder[i++] = BuildingType::Tannery;
×
NEW
100
            transmitPendingBuildOrder[i++] = BuildingType::LeatherWorks;
×
101
        }
102

103
        if(GAMECLIENT.ChangeBuildOrder(useCustomBuildOrder, transmitPendingBuildOrder))
×
104
        {
105
            GAMECLIENT.visual_settings.build_order = transmitPendingBuildOrder;
×
106
            GAMECLIENT.visual_settings.useCustomBuildOrder = useCustomBuildOrder;
×
107
            settings_changed = false;
×
108
        }
109
    }
110
}
111

112
void iwBuildOrder::Msg_ListSelectItem(const unsigned ctrl_id, const int selection)
×
113
{
114
    if(GAMECLIENT.IsReplayModeOn())
×
115
        return;
×
116
    switch(ctrl_id)
×
117
    {
118
        default: break;
×
119

120
        case 0:
×
121
        {
122
            GetCtrl<ctrlImage>(5)->SetImage(
×
123
              LOADER.GetBuildingTex(gwv.GetPlayer().nation, pendingBuildOrder[selection]));
×
124
        }
125
        break;
×
126
    }
127
}
128

129
void iwBuildOrder::Msg_ComboSelectItem(unsigned ctrl_id, unsigned selection)
×
130
{
131
    if(ctrl_id == 6)
×
132
    {
133
        useCustomBuildOrder = selection != 0u;
×
134
        settings_changed = true;
×
135
    }
136
}
×
137

138
void iwBuildOrder::Msg_ButtonClick(const unsigned ctrl_id)
×
139
{
140
    if(GAMECLIENT.IsReplayModeOn())
×
141
        return;
×
142
    auto* list = GetCtrl<ctrlList>(0);
×
143

144
    if(!list->GetSelection())
×
145
        return;
×
146

147
    unsigned selection = *list->GetSelection();
×
148
    unsigned numOptions = list->GetNumLines();
×
149

150
    // Auswahl gültig?
151

152
    switch(ctrl_id)
×
153
    {
154
        default: break;
×
155

156
        case 1: // Nach ganz oben
×
157
        {
158
            while(selection > 0)
×
159
            {
160
                std::swap(pendingBuildOrder[selection - 1], pendingBuildOrder[selection]);
×
161
                list->Swap(selection - 1, selection);
×
162
                --selection;
×
163
            }
164
            settings_changed = true;
×
165
        }
166
        break;
×
167
        case 2: // Hoch
×
168
        {
169
            if(selection > 0)
×
170
            {
171
                std::swap(pendingBuildOrder[selection - 1], pendingBuildOrder[selection]);
×
172
                list->Swap(selection - 1, selection);
×
173
            }
174
            settings_changed = true;
×
175
        }
176
        break;
×
177
        case 3: // Runter
×
178
        {
179
            if(selection < numOptions - 1u)
×
180
            {
181
                std::swap(pendingBuildOrder[selection + 1], pendingBuildOrder[selection]);
×
182
                list->Swap(selection + 1, selection);
×
183
            }
184
            settings_changed = true;
×
185
        }
186
        break;
×
187
        case 4: // Nach ganz unten
×
188
        {
189
            while(selection < numOptions - 1u)
×
190
            {
191
                std::swap(pendingBuildOrder[selection + 1], pendingBuildOrder[selection]);
×
192
                list->Swap(selection + 1, selection);
×
193
                ++selection;
×
194
            }
195
            settings_changed = true;
×
196
        }
197
        break;
×
198
        case 10: // Standardwerte
×
199
        {
200
            // Baureihenfolge vom Spieler kopieren
NEW
201
            fillBuildOrder(GAMECLIENT.default_settings.build_order);
×
202

203
            auto* list = GetCtrl<ctrlList>(0);
×
204
            list->DeleteAllItems();
×
205

206
            // Liste füllen
207
            for(unsigned char i = 0; i < 31; ++i)
×
208
                list->AddString(_(BUILDING_NAMES[pendingBuildOrder[i]]));
×
209
            list->SetSelection(0);
×
210

211
            GetCtrl<ctrlImage>(5)->SetImage(LOADER.GetBuildingTex(gwv.GetPlayer().nation, pendingBuildOrder[0]));
×
212

213
            settings_changed = true;
×
214
        }
215
        break;
×
216
    }
217
}
218

219
void iwBuildOrder::UpdateSettings()
×
220
{
221
    if(GAMECLIENT.IsReplayModeOn())
×
222
    {
223
        gwv.GetPlayer().FillVisualSettings(GAMECLIENT.visual_settings);
×
NEW
224
        fillBuildOrder(GAMECLIENT.visual_settings.build_order);
×
225
        useCustomBuildOrder = GAMECLIENT.visual_settings.useCustomBuildOrder;
×
226
    }
227
    GetCtrl<ctrlComboBox>(6)->SetSelection(useCustomBuildOrder ? 1 : 0);
×
228
    for(unsigned char i = 0; i < pendingBuildOrder.size(); ++i)
×
229
        GetCtrl<ctrlList>(0)->SetString(_(BUILDING_NAMES[pendingBuildOrder[i]]), i);
×
230
}
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc