|
49 | 49 | #include "nodeObjs/noFlag.h" |
50 | 50 | #include <stdexcept> |
51 | 51 |
|
52 | | -namespace { |
53 | | -nobUsual* staticCastAndAssertCorrectType(noRoadNode* const goal) |
54 | | -{ |
55 | | - RTTR_Assert(dynamic_cast<nobUsual*>(goal)); |
56 | | - return static_cast<nobUsual*>(goal); |
57 | | -} |
58 | | -} // namespace |
59 | | - |
60 | 52 | std::unique_ptr<noFigure> JobFactory::CreateJob(const Job job_id, const MapPoint pt, const unsigned char player, |
61 | | - noRoadNode* const goal) |
| 53 | + noRoadNode& goal) |
62 | 54 | { |
63 | 55 | switch(job_id) |
64 | 56 | { |
65 | 57 | case Job::Builder: |
66 | | - if(!goal) |
67 | | - return std::make_unique<nofBuilder>(pt, player, nullptr); |
68 | | - else if(goal->GetGOT() != GO_Type::Buildingsite) |
69 | | - return std::make_unique<nofPassiveWorker>(Job::Builder, pt, player, goal); |
| 58 | + if(goal.GetGOT() != GO_Type::Buildingsite) |
| 59 | + return std::make_unique<nofPassiveWorker>(Job::Builder, pt, player, &goal); |
70 | 60 | else |
71 | | - return std::make_unique<nofBuilder>(pt, player, static_cast<noBuildingSite*>(goal)); |
72 | | - case Job::Planer: |
73 | | - RTTR_Assert(dynamic_cast<noBuildingSite*>(goal)); |
74 | | - return std::make_unique<nofPlaner>(pt, player, static_cast<noBuildingSite*>(goal)); |
75 | | - case Job::Carpenter: return std::make_unique<nofCarpenter>(pt, player, staticCastAndAssertCorrectType(goal)); |
76 | | - case Job::Armorer: return std::make_unique<nofArmorer>(pt, player, staticCastAndAssertCorrectType(goal)); |
77 | | - case Job::Stonemason: return std::make_unique<nofStonemason>(pt, player, staticCastAndAssertCorrectType(goal)); |
78 | | - case Job::Brewer: return std::make_unique<nofBrewer>(pt, player, staticCastAndAssertCorrectType(goal)); |
79 | | - case Job::Minter: return std::make_unique<nofMinter>(pt, player, staticCastAndAssertCorrectType(goal)); |
80 | | - case Job::Butcher: return std::make_unique<nofButcher>(pt, player, staticCastAndAssertCorrectType(goal)); |
81 | | - case Job::IronFounder: |
82 | | - return std::make_unique<nofIronfounder>(pt, player, staticCastAndAssertCorrectType(goal)); |
83 | | - case Job::Miller: return std::make_unique<nofMiller>(pt, player, staticCastAndAssertCorrectType(goal)); |
84 | | - case Job::Metalworker: |
85 | | - return std::make_unique<nofMetalworker>(pt, player, staticCastAndAssertCorrectType(goal)); |
86 | | - case Job::Baker: return std::make_unique<nofBaker>(pt, player, staticCastAndAssertCorrectType(goal)); |
| 61 | + return std::make_unique<nofBuilder>(pt, player, &checkedCast<noBuildingSite>(goal)); |
| 62 | + case Job::Planer: return std::make_unique<nofPlaner>(pt, player, &checkedCast<noBuildingSite>(goal)); |
| 63 | + case Job::Carpenter: return std::make_unique<nofCarpenter>(pt, player, &checkedCast<nobUsual>(goal)); |
| 64 | + case Job::Armorer: return std::make_unique<nofArmorer>(pt, player, &checkedCast<nobUsual>(goal)); |
| 65 | + case Job::Stonemason: return std::make_unique<nofStonemason>(pt, player, &checkedCast<nobUsual>(goal)); |
| 66 | + case Job::Brewer: return std::make_unique<nofBrewer>(pt, player, &checkedCast<nobUsual>(goal)); |
| 67 | + case Job::Minter: return std::make_unique<nofMinter>(pt, player, &checkedCast<nobUsual>(goal)); |
| 68 | + case Job::Butcher: return std::make_unique<nofButcher>(pt, player, &checkedCast<nobUsual>(goal)); |
| 69 | + case Job::IronFounder: return std::make_unique<nofIronfounder>(pt, player, &checkedCast<nobUsual>(goal)); |
| 70 | + case Job::Miller: return std::make_unique<nofMiller>(pt, player, &checkedCast<nobUsual>(goal)); |
| 71 | + case Job::Metalworker: return std::make_unique<nofMetalworker>(pt, player, &checkedCast<nobUsual>(goal)); |
| 72 | + case Job::Baker: return std::make_unique<nofBaker>(pt, player, &checkedCast<nobUsual>(goal)); |
87 | 73 | case Job::Helper: |
88 | | - if(goal && goal->GetGOT() == GO_Type::NobUsual) |
| 74 | + if(goal.GetGOT() == GO_Type::NobUsual) |
89 | 75 | { |
90 | | - auto* goalBld = staticCastAndAssertCorrectType(goal); |
| 76 | + auto* goalBld = &checkedCast<nobUsual>(goal); |
91 | 77 | if(goalBld->GetBuildingType() == BuildingType::Well) |
92 | 78 | return std::make_unique<nofWellguy>(pt, player, goalBld); |
93 | 79 | else if(goalBld->GetBuildingType() == BuildingType::Catapult) |
94 | 80 | return std::make_unique<nofCatapultMan>(pt, player, goalBld); |
95 | 81 | } |
96 | | - throw std::runtime_error("Invalid goal type: " + (goal ? helpers::toString(goal->GetGOT()) : "NULL") |
97 | | - + " for job " + helpers::toString(job_id)); |
98 | | - case Job::Geologist: |
99 | | - RTTR_Assert(dynamic_cast<noFlag*>(goal)); |
100 | | - return std::make_unique<nofGeologist>(pt, player, static_cast<noFlag*>(goal)); |
| 82 | + throw std::runtime_error("Invalid goal type: " + helpers::toString(goal.GetGOT()) + " for job " |
| 83 | + + helpers::toString(job_id)); |
| 84 | + case Job::Geologist: return std::make_unique<nofGeologist>(pt, player, &checkedCast<noFlag>(goal)); |
101 | 85 | case Job::Scout: |
102 | 86 | // Different scout for lookout towers and free scouts |
103 | | - if(goal->GetGOT() == GO_Type::NobUsual) |
| 87 | + if(goal.GetGOT() == GO_Type::NobUsual) |
104 | 88 | { |
105 | | - return std::make_unique<nofScout_LookoutTower>(pt, player, staticCastAndAssertCorrectType(goal)); |
106 | | - } else if(goal->GetGOT() == GO_Type::Flag) |
107 | | - return std::make_unique<nofScout_Free>(pt, player, goal); |
108 | | - throw std::runtime_error("Invalid goal type: " + helpers::toString(goal->GetGOT()) + " for job " |
| 89 | + return std::make_unique<nofScout_LookoutTower>(pt, player, &checkedCast<nobUsual>(goal)); |
| 90 | + } else if(goal.GetGOT() == GO_Type::Flag) |
| 91 | + return std::make_unique<nofScout_Free>(pt, player, &goal); |
| 92 | + throw std::runtime_error("Invalid goal type: " + helpers::toString(goal.GetGOT()) + " for job " |
109 | 93 | + helpers::toString(job_id)); |
110 | | - case Job::Miner: return std::make_unique<nofMiner>(pt, player, staticCastAndAssertCorrectType(goal)); |
111 | | - case Job::Farmer: return std::make_unique<nofFarmer>(pt, player, staticCastAndAssertCorrectType(goal)); |
112 | | - case Job::Forester: return std::make_unique<nofForester>(pt, player, staticCastAndAssertCorrectType(goal)); |
113 | | - case Job::Woodcutter: return std::make_unique<nofWoodcutter>(pt, player, staticCastAndAssertCorrectType(goal)); |
114 | | - case Job::PigBreeder: return std::make_unique<nofPigbreeder>(pt, player, staticCastAndAssertCorrectType(goal)); |
115 | | - case Job::DonkeyBreeder: |
116 | | - return std::make_unique<nofDonkeybreeder>(pt, player, staticCastAndAssertCorrectType(goal)); |
117 | | - case Job::Hunter: return std::make_unique<nofHunter>(pt, player, staticCastAndAssertCorrectType(goal)); |
118 | | - case Job::Fisher: return std::make_unique<nofFisher>(pt, player, staticCastAndAssertCorrectType(goal)); |
| 94 | + case Job::Miner: return std::make_unique<nofMiner>(pt, player, &checkedCast<nobUsual>(goal)); |
| 95 | + case Job::Farmer: return std::make_unique<nofFarmer>(pt, player, &checkedCast<nobUsual>(goal)); |
| 96 | + case Job::Forester: return std::make_unique<nofForester>(pt, player, &checkedCast<nobUsual>(goal)); |
| 97 | + case Job::Woodcutter: return std::make_unique<nofWoodcutter>(pt, player, &checkedCast<nobUsual>(goal)); |
| 98 | + case Job::PigBreeder: return std::make_unique<nofPigbreeder>(pt, player, &checkedCast<nobUsual>(goal)); |
| 99 | + case Job::DonkeyBreeder: return std::make_unique<nofDonkeybreeder>(pt, player, &checkedCast<nobUsual>(goal)); |
| 100 | + case Job::Hunter: return std::make_unique<nofHunter>(pt, player, &checkedCast<nobUsual>(goal)); |
| 101 | + case Job::Fisher: return std::make_unique<nofFisher>(pt, player, &checkedCast<nobUsual>(goal)); |
119 | 102 | case Job::Private: |
120 | 103 | case Job::PrivateFirstClass: |
121 | 104 | case Job::Sergeant: |
122 | 105 | case Job::Officer: |
123 | 106 | case Job::General: |
124 | 107 | // TODO: Is this ever called? If yes, then why is the home here set to nullptr? |
125 | | - RTTR_Assert(dynamic_cast<nobBaseMilitary*>(goal)); |
126 | | - return std::make_unique<nofPassiveSoldier>(pt, player, static_cast<nobBaseMilitary*>(goal), nullptr, |
| 108 | + return std::make_unique<nofPassiveSoldier>(pt, player, &checkedCast<nobBaseMilitary>(goal), nullptr, |
127 | 109 | getSoldierRank(job_id)); |
128 | | - case Job::PackDonkey: return std::make_unique<nofCarrier>(CarrierType::Donkey, pt, player, nullptr, goal); |
129 | | - case Job::Shipwright: return std::make_unique<nofShipWright>(pt, player, staticCastAndAssertCorrectType(goal)); |
130 | | - case Job::CharBurner: return std::make_unique<nofCharburner>(pt, player, staticCastAndAssertCorrectType(goal)); |
131 | | - case Job::Winegrower: return std::make_unique<nofWinegrower>(pt, player, staticCastAndAssertCorrectType(goal)); |
132 | | - case Job::Vintner: return std::make_unique<nofVintner>(pt, player, staticCastAndAssertCorrectType(goal)); |
133 | | - case Job::TempleServant: |
134 | | - RTTR_Assert(dynamic_cast<nobUsual*>(goal)); |
135 | | - return std::make_unique<nofTempleServant>(pt, player, staticCastAndAssertCorrectType(goal)); |
| 110 | + case Job::PackDonkey: return std::make_unique<nofCarrier>(CarrierType::Donkey, pt, player, nullptr, &goal); |
| 111 | + case Job::Shipwright: return std::make_unique<nofShipWright>(pt, player, &checkedCast<nobUsual>(goal)); |
| 112 | + case Job::CharBurner: return std::make_unique<nofCharburner>(pt, player, &checkedCast<nobUsual>(goal)); |
| 113 | + case Job::Winegrower: return std::make_unique<nofWinegrower>(pt, player, &checkedCast<nobUsual>(goal)); |
| 114 | + case Job::Vintner: return std::make_unique<nofVintner>(pt, player, &checkedCast<nobUsual>(goal)); |
| 115 | + case Job::TempleServant: return std::make_unique<nofTempleServant>(pt, player, &checkedCast<nobUsual>(goal)); |
136 | 116 | case Job::BoatCarrier: |
137 | 117 | throw std::logic_error("Cannot create a boat carrier job (try creating Job::Helper)."); |
138 | 118 | break; |
|
0 commit comments