• 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

31.75
/libs/s25main/factories/JobFactory.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 "JobFactory.h"
6
#include "buildings/noBuildingSite.h"
7
#include "buildings/nobBaseMilitary.h"
8
#include "buildings/nobBaseWarehouse.h"
9
#include "buildings/nobUsual.h"
10
#include "nodeObjs/noRoadNode.h"
11

12
//////////////////////////////////////////////////////////////////////////
13
// Job includes, maybe use register function in nof* classes?
14
//////////////////////////////////////////////////////////////////////////
15
#include "figures/nofArmorer.h"
16
#include "figures/nofBaker.h"
17
#include "figures/nofBrewer.h"
18
#include "figures/nofBuilder.h"
19
#include "figures/nofButcher.h"
20
#include "figures/nofCarpenter.h"
21
#include "figures/nofCarrier.h"
22
#include "figures/nofCatapultMan.h"
23
#include "figures/nofCharburner.h"
24
#include "figures/nofDonkeybreeder.h"
25
#include "figures/nofFarmer.h"
26
#include "figures/nofFisher.h"
27
#include "figures/nofForester.h"
28
#include "figures/nofGeologist.h"
29
#include "figures/nofHunter.h"
30
#include "figures/nofIronfounder.h"
31
#include "figures/nofLeatherWorker.h"
32
#include "figures/nofMetalworker.h"
33
#include "figures/nofMiller.h"
34
#include "figures/nofMiner.h"
35
#include "figures/nofMinter.h"
36
#include "figures/nofPassiveSoldier.h"
37
#include "figures/nofPassiveWorker.h"
38
#include "figures/nofPigbreeder.h"
39
#include "figures/nofPlaner.h"
40
#include "figures/nofScout_Free.h"
41
#include "figures/nofScout_LookoutTower.h"
42
#include "figures/nofShipWright.h"
43
#include "figures/nofSkinner.h"
44
#include "figures/nofStonemason.h"
45
#include "figures/nofTanner.h"
46
#include "figures/nofTempleServant.h"
47
#include "figures/nofVintner.h"
48
#include "figures/nofWellguy.h"
49
#include "figures/nofWinegrower.h"
50
#include "figures/nofWoodcutter.h"
51
#include "helpers/toString.h"
52
#include "nodeObjs/noFlag.h"
53
#include <stdexcept>
54

55
std::unique_ptr<noFigure> JobFactory::CreateJob(const Job job_id, const MapPoint pt, const unsigned char player,
84✔
56
                                                noRoadNode& goal)
57
{
58
    switch(job_id)
84✔
59
    {
60
        case Job::Builder:
42✔
61
            if(goal.GetGOT() != GO_Type::Buildingsite)
42✔
62
                return std::make_unique<nofPassiveWorker>(Job::Builder, pt, player, &goal);
29✔
63
            else
64
                return std::make_unique<nofBuilder>(pt, player, &checkedCast<noBuildingSite>(goal));
13✔
NEW
65
        case Job::Planer: return std::make_unique<nofPlaner>(pt, player, &checkedCast<noBuildingSite>(goal));
×
NEW
66
        case Job::Carpenter: return std::make_unique<nofCarpenter>(pt, player, &checkedCast<nobUsual>(goal));
×
NEW
67
        case Job::Armorer: return std::make_unique<nofArmorer>(pt, player, &checkedCast<nobUsual>(goal));
×
NEW
68
        case Job::Stonemason: return std::make_unique<nofStonemason>(pt, player, &checkedCast<nobUsual>(goal));
×
NEW
69
        case Job::Brewer: return std::make_unique<nofBrewer>(pt, player, &checkedCast<nobUsual>(goal));
×
NEW
70
        case Job::Minter: return std::make_unique<nofMinter>(pt, player, &checkedCast<nobUsual>(goal));
×
NEW
71
        case Job::Butcher: return std::make_unique<nofButcher>(pt, player, &checkedCast<nobUsual>(goal));
×
NEW
72
        case Job::IronFounder: return std::make_unique<nofIronfounder>(pt, player, &checkedCast<nobUsual>(goal));
×
NEW
73
        case Job::Miller: return std::make_unique<nofMiller>(pt, player, &checkedCast<nobUsual>(goal));
×
74
        case Job::Metalworker: return std::make_unique<nofMetalworker>(pt, player, &checkedCast<nobUsual>(goal));
3✔
75
        case Job::Baker: return std::make_unique<nofBaker>(pt, player, &checkedCast<nobUsual>(goal));
1✔
76
        case Job::Helper:
×
77
            // Wenn Lagerhaus, dann Auslagern anscheinend und mann kann irgendeinen Typ nehmen
NEW
78
            if(goal.GetGOT() == GO_Type::NobStorehouse || goal.GetGOT() == GO_Type::NobHarborbuilding
×
NEW
79
               || goal.GetGOT() == GO_Type::NobHq)
×
NEW
80
                return std::make_unique<nofWellguy>(pt, player, &checkedCast<nobBaseWarehouse>(goal));
×
NEW
81
            else if(goal.GetGOT() == GO_Type::NobUsual)
×
82
            {
NEW
83
                auto* goalBld = &checkedCast<nobUsual>(goal);
×
84
                if(goalBld->GetBuildingType() == BuildingType::Well)
×
85
                    return std::make_unique<nofWellguy>(pt, player, goalBld);
×
86
                else if(goalBld->GetBuildingType() == BuildingType::Catapult)
×
87
                    return std::make_unique<nofCatapultMan>(pt, player, goalBld);
×
88
            }
NEW
89
            throw std::runtime_error("Invalid goal type: " + helpers::toString(goal.GetGOT()) + " for job "
×
90
                                     + helpers::toString(job_id));
×
91
        case Job::Geologist: return std::make_unique<nofGeologist>(pt, player, &checkedCast<noFlag>(goal));
22✔
92
        case Job::Scout:
10✔
93
            // Im Spähturm arbeitet ein anderer Späher-Typ
94
            // Wenn Lagerhaus, dann Auslagern anscheinend und mann kann irgendeinen Typ nehmen
95
            if(goal.GetGOT() == GO_Type::NobHarborbuilding || goal.GetGOT() == GO_Type::NobStorehouse
14✔
96
               || goal.GetGOT() == GO_Type::NobHq)
14✔
97
                return std::make_unique<nofPassiveWorker>(Job::Scout, pt, player, &goal);
6✔
98
            else if(goal.GetGOT() == GO_Type::NobUsual) // Spähturm / Lagerhaus?
4✔
99
            {
NEW
100
                return std::make_unique<nofScout_LookoutTower>(pt, player, &checkedCast<nobUsual>(goal));
×
101
            } else if(goal.GetGOT() == GO_Type::Flag)
4✔
102
                return std::make_unique<nofScout_Free>(pt, player, &goal);
4✔
NEW
103
            throw std::runtime_error("Invalid goal type: " + helpers::toString(goal.GetGOT()) + " for job "
×
104
                                     + helpers::toString(job_id));
×
NEW
105
        case Job::Miner: return std::make_unique<nofMiner>(pt, player, &checkedCast<nobUsual>(goal));
×
106
        case Job::Farmer: return std::make_unique<nofFarmer>(pt, player, &checkedCast<nobUsual>(goal));
1✔
107
        case Job::Forester: return std::make_unique<nofForester>(pt, player, &checkedCast<nobUsual>(goal));
1✔
108
        case Job::Woodcutter: return std::make_unique<nofWoodcutter>(pt, player, &checkedCast<nobUsual>(goal));
3✔
NEW
109
        case Job::PigBreeder: return std::make_unique<nofPigbreeder>(pt, player, &checkedCast<nobUsual>(goal));
×
NEW
110
        case Job::DonkeyBreeder: return std::make_unique<nofDonkeybreeder>(pt, player, &checkedCast<nobUsual>(goal));
×
NEW
111
        case Job::Hunter: return std::make_unique<nofHunter>(pt, player, &checkedCast<nobUsual>(goal));
×
NEW
112
        case Job::Fisher: return std::make_unique<nofFisher>(pt, player, &checkedCast<nobUsual>(goal));
×
113
        case Job::Private:
×
114
        case Job::PrivateFirstClass:
115
        case Job::Sergeant:
116
        case Job::Officer:
117
        case Job::General:
118
            // TODO: Is this ever called? If yes, then why is the home here set to nullptr?
NEW
119
            return std::make_unique<nofPassiveSoldier>(pt, player, &checkedCast<nobBaseMilitary>(goal), nullptr,
×
120
                                                       getSoldierRank(job_id));
×
NEW
121
        case Job::PackDonkey: return std::make_unique<nofCarrier>(CarrierType::Donkey, pt, player, nullptr, &goal);
×
122
        case Job::Shipwright: return std::make_unique<nofShipWright>(pt, player, &checkedCast<nobUsual>(goal));
1✔
NEW
123
        case Job::CharBurner: return std::make_unique<nofCharburner>(pt, player, &checkedCast<nobUsual>(goal));
×
NEW
124
        case Job::Winegrower: return std::make_unique<nofWinegrower>(pt, player, &checkedCast<nobUsual>(goal));
×
NEW
125
        case Job::Vintner: return std::make_unique<nofVintner>(pt, player, &checkedCast<nobUsual>(goal));
×
NEW
126
        case Job::TempleServant: return std::make_unique<nofTempleServant>(pt, player, &checkedCast<nobUsual>(goal));
×
NEW
127
        case Job::Skinner: return std::make_unique<nofSkinner>(pt, player, &checkedCast<nobUsual>(goal));
×
NEW
128
        case Job::Tanner: return std::make_unique<nofTanner>(pt, player, &checkedCast<nobUsual>(goal));
×
NEW
129
        case Job::LeatherWorker: return std::make_unique<nofLeatherWorker>(pt, player, &checkedCast<nobUsual>(goal));
×
130
        case Job::BoatCarrier:
×
131
            throw std::logic_error("Cannot create a boat carrier job (try creating Job::Helper).");
×
132
            break;
133
    }
134
    throw std::logic_error("Invalid job type " + helpers::toString(job_id));
×
135
}
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