Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
56b78e0
Radius overlay & tooltips
morganchristiansson Jun 14, 2026
7bc74e5
Tidy
morganchristiansson Jun 15, 2026
9a02c3a
Simpify UI/mouse changes
morganchristiansson Jun 15, 2026
0d9781c
Fix map wrap clipping again
morganchristiansson Jun 15, 2026
0ed5012
Fix "Invalid job id" from GetWorkRadius()
morganchristiansson Jun 16, 2026
46e8a4c
Toggle via addon
morganchristiansson Jun 16, 2026
9ab4c7b
Better radius ouline drawing
morganchristiansson Jun 18, 2026
66bff68
Ignore game buildings when mouse over window
morganchristiansson Jun 20, 2026
6cfbdd2
Move OnHover() callsite to Msg_MouseMove
morganchristiansson Jun 30, 2026
6fda124
UpdateRadiusPreviewForMousePos
morganchristiansson Jun 30, 2026
90a2f65
SnapToNearestCopy
morganchristiansson Jun 30, 2026
0b7d105
DrawRadiusOutline
morganchristiansson Jun 30, 2026
50d2045
GetBuildingRadius comment wording
morganchristiansson Jun 30, 2026
31d0ab8
Fixup comments and const-variable
Flamefire Oct 4, 2026
74b329f
Fix init order and unhandled enum case
Flamefire Oct 4, 2026
093d2c8
Make GetWorkRadius non-static
Flamefire Oct 4, 2026
a6c7acd
Move some job-related constants from `GameConsts.h` to `JobConsts.h`
Flamefire Oct 4, 2026
e29162c
Move `GetBuildingRadius` to `GameWorldView`
Flamefire Oct 4, 2026
296ac47
Use 2 methods to show/hide the radius preview
Flamefire Oct 4, 2026
7eda3bf
Explain calculation in `SnapToNearestCopy`
Flamefire Oct 4, 2026
2f8205f
Cache radius outline
Flamefire Oct 4, 2026
1143329
Show radius of well
Flamefire Oct 4, 2026
2c4b1c1
Fix stale building radius preview
Flamefire Oct 4, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions libs/s25main/FOWObjects.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ class fowBuilding : public FOWObject
void Serialize(SerializedGameData& sgd) const override;
void Draw(DrawPoint drawPt) const override;
FoW_Type GetType() const override { return FoW_Type::Building; }
BuildingType GetBuildingType() const { return type; }
};

/// Baustelle
Expand Down
3 changes: 2 additions & 1 deletion libs/s25main/GlobalGameSettings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,8 @@ void GlobalGameSettings::registerAllAddons()
AddonForesterFarmFieldAvoidance,
AddonForesterReachRadius,
AddonWoodcutterReachRadius,
AddonStonemasonReachRadius
AddonStonemasonReachRadius,
AddonBuildingRadius
>;
// clang-format on
using namespace boost::mp11;
Expand Down
2 changes: 1 addition & 1 deletion libs/s25main/Pathfinding.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
#include "pathfinding/ShipPathData.h"
#include "world/GameWorld.h"
#include "gameTypes/ShipDirection.h"
#include "gameData/GameConsts.h"
#include <limits>

/// Findet einen Weg für Figuren
helpers::OptionalEnum<Direction> GameWorldBase::FindHumanPath(const MapPoint start, const MapPoint dest,
Expand Down
2 changes: 1 addition & 1 deletion libs/s25main/TradePathCache.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
#include "EventManager.h"
#include "GamePlayer.h"
#include "world/GameWorld.h"
#include "gameData/GameConsts.h"
#include <limits>

bool TradePathCache::pathExists(const MapPoint start, const MapPoint goal, const PlayerIdx player)
{
Expand Down
1 change: 0 additions & 1 deletion libs/s25main/Ware.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
#include "nodeObjs/noFlag.h"
#include "nodeObjs/noRoadNode.h"
#include "gameData/BuildingProperties.h"
#include "gameData/GameConsts.h"
#include "gameData/GoodConsts.h"
#include "gameData/ShieldConsts.h"
#include "s25util/Log.h"
Expand Down
21 changes: 21 additions & 0 deletions libs/s25main/addons/AddonBuildingRadius.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// Copyright (C) 2005 - 2026 Settlers Freaks (sf-team at siedler25.org)
//
// SPDX-License-Identifier: GPL-2.0-or-later

#pragma once

#include "AddonBool.h"
#include "mygettext/mygettext.h"

/**
* Show building radius information in tooltips and as map overlay
*/
class AddonBuildingRadius : public AddonBool
{
public:
AddonBuildingRadius()
: AddonBool(AddonId::BUILDING_RADIUS, AddonGroup::GamePlay, _("Show building radius"),
_("Shows the working radius of buildings in the build menu tooltip and as an overlay on the map "
"when hovering over a building icon or selecting a building."))
{}
};
2 changes: 2 additions & 0 deletions libs/s25main/addons/Addons.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,3 +72,5 @@
#include "addons/AddonForesterReachRadius.h"
#include "addons/AddonStonemasonReachRadius.h"
#include "addons/AddonWoodcutterReachRadius.h"

#include "addons/AddonBuildingRadius.h"
5 changes: 4 additions & 1 deletion libs/s25main/addons/const_addons.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
// 010 aztimh
// 011 DevOpsOfChaos
// 012 MichalLabuda
// 013 Morgan

// Do not forget to add your Addon to GlobalGameSettings::registerAllAddons @ GlobalGameSettings.cpp!
// Never use a number twice!
Expand Down Expand Up @@ -88,7 +89,9 @@ ENUM_WITH_STRING(AddonId, LIMIT_CATAPULTS = 0x00000000, INEXHAUSTIBLE_MINES = 0x
STRANDED_SOLDIER_RETURN_SEARCH = 0x01100001,

FORESTER_REACH_RADIUS = 0x01200000, WOODCUTTER_REACH_RADIUS = 0x01200001,
STONEMASON_REACH_RADIUS = 0x01200002)
STONEMASON_REACH_RADIUS = 0x01200002,

BUILDING_RADIUS = 0x01300000)
//-V:AddonId:801

enum class AddonGroup : unsigned
Expand Down
2 changes: 1 addition & 1 deletion libs/s25main/ai/aijh/AIPlayerJH.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#include "buildings/nobHarborBuilding.h"
#include "buildings/nobMilitary.h"
#include "buildings/nobUsual.h"
#include "helpers/EnumArray.h"
#include "helpers/IdRange.h"
#include "helpers/MaxEnumValue.h"
#include "helpers/containerUtils.h"
Expand All @@ -35,7 +36,6 @@
#include "gameTypes/MineResourceBehavior.h"
#include "gameData/BuildingConsts.h"
#include "gameData/BuildingProperties.h"
#include "gameData/GameConsts.h"
#include "gameData/JobConsts.h"
#include "gameData/TerrainDesc.h"
#include "gameData/ToolConsts.h"
Expand Down
1 change: 0 additions & 1 deletion libs/s25main/buildings/nobBaseMilitary.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
#include "random/Random.h"
#include "world/GameWorld.h"
#include "gameData/BuildingProperties.h"
#include "gameData/GameConsts.h"
#include <boost/pointer_cast.hpp>
#include <limits>

Expand Down
3 changes: 2 additions & 1 deletion libs/s25main/buildings/nobHarborBuilding.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#include "figures/noFigure.h"
#include "figures/nofAttacker.h"
#include "figures/nofDefender.h"
#include "helpers/EnumArray.h"
#include "helpers/containerUtils.h"
#include "helpers/pointerContainerUtils.h"
#include "network/GameClient.h"
Expand All @@ -25,9 +26,9 @@
#include "world/GameWorld.h"
#include "nodeObjs/noShip.h"
#include "gameData/BuildingConsts.h"
#include "gameData/GameConsts.h"
#include "gameData/MilitaryConsts.h"
#include "gameData/ShieldConsts.h"
#include <limits>

nobHarborBuilding::ExpeditionInfo::ExpeditionInfo(SerializedGameData& sgd)
: boards(sgd.PopUnsignedInt()), stones(sgd.PopUnsignedInt()), active(sgd.PopBool()), builder(sgd.PopBool())
Expand Down
1 change: 0 additions & 1 deletion libs/s25main/buildings/nobMilitary.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@
#include "nodeObjs/noFlag.h"
#include "gameData/BuildingConsts.h"
#include "gameData/BuildingProperties.h"
#include "gameData/GameConsts.h"
#include "gameData/MilitaryConsts.h"
#include "gameData/SettingTypeConv.h"
#include "s25util/Log.h"
Expand Down
2 changes: 1 addition & 1 deletion libs/s25main/buildings/nobUsual.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#include "addons/const_addons.h"
#include "figures/nofBuildingWorker.h"
#include "figures/nofPigbreeder.h"
#include "helpers/EnumArray.h"
#include "helpers/containerUtils.h"
#include "network/GameClient.h"
#include "notifications/BuildingNote.h"
Expand All @@ -23,7 +24,6 @@
#include "gameTypes/Resource.h"
#include "gameData/BuildingConsts.h"
#include "gameData/BuildingProperties.h"
#include "gameData/GameConsts.h"
#include <numeric>

/// Number of GFs after which the productivity is recalculated, i.e. productivity is averaged over intervals of this
Expand Down
11 changes: 11 additions & 0 deletions libs/s25main/controls/ctrlBuildingIcon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

#include "ctrlBuildingIcon.h"
#include "Loader.h"
#include "driver/MouseCoords.h"
#include "files.h"
#include "ogl/glArchivItem_Bitmap.h"
#include "gameTypes/BuildingType.h"
Expand All @@ -28,3 +29,13 @@ void ctrlBuildingIcon::Draw_()
}

void ctrlBuildingIcon::DrawContent() const {}

bool ctrlBuildingIcon::Msg_MouseMove(const MouseCoords& mc)
{
const bool wasHovered = (state == ButtonState::Hover);
const bool result = ctrlButton::Msg_MouseMove(mc);
const bool nowHovered = (state == ButtonState::Hover);
if(wasHovered != nowHovered && onHoverChanged_)
onHoverChanged_(nowHovered);
return result;
}
10 changes: 10 additions & 0 deletions libs/s25main/controls/ctrlBuildingIcon.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@
#pragma once

#include "ctrlButton.h"
#include <functional>

struct MouseCoords;
class Window;

class ctrlBuildingIcon : public ctrlButton
Expand All @@ -15,11 +18,18 @@ class ctrlBuildingIcon : public ctrlButton
/// liefert den GebäudeTyp des Icons.
BuildingType GetType() const { return type; }

/// Set callback for hover-state changes (called with true when hovered, false when not)
void SetOnHoverChanged(std::function<void(bool)> cb) { onHoverChanged_ = std::move(cb); }

protected:
/// zeichnet das Fenster.
void Draw_() override;
void DrawContent() const override;
bool Msg_MouseMove(const MouseCoords& mc) override;

const BuildingType type; /// der GebäudeType des Icons.
const Nation nation; /// Volk

private:
std::function<void(bool)> onHoverChanged_;
};
1 change: 0 additions & 1 deletion libs/s25main/figures/noFigure.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@
#include "nodeObjs/noRoadNode.h"
#include "nodeObjs/noSkeleton.h"
#include "gameTypes/DirectionToImgDir.h"
#include "gameData/GameConsts.h"
#include "gameData/JobConsts.h"
#include "s25util/Log.h"
#include "s25util/colors.h"
Expand Down
2 changes: 1 addition & 1 deletion libs/s25main/figures/nofCatapultMan.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ void nofCatapultMan::HandleDerivedEvent(const unsigned /*id*/)
unsigned distance = world->CalcDistance(pos, building->GetPos());

// Entfernung nicht zu hoch?
if(distance < 14)
if(distance <= CATAPULT_MAX_TARGET_RANGE)
{
// Mit in die Liste aufnehmen
possibleTargets.push_back(PossibleTarget(building->GetPos(), distance));
Expand Down
2 changes: 1 addition & 1 deletion libs/s25main/figures/nofCatapultMan.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright (C) 2005 - 2021 Settlers Freaks (sf-team at siedler25.org)
// Copyright (C) 2005 - 2026 Settlers Freaks (sf-team at siedler25.org)
//
// SPDX-License-Identifier: GPL-2.0-or-later

Expand Down
13 changes: 9 additions & 4 deletions libs/s25main/figures/nofFarmhand.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright (C) 2005 - 2021 Settlers Freaks (sf-team at siedler25.org)
// Copyright (C) 2005 - 2026 Settlers Freaks (sf-team at siedler25.org)
//
// SPDX-License-Identifier: GPL-2.0-or-later

Expand Down Expand Up @@ -33,6 +33,11 @@ nofFarmhand::nofFarmhand(SerializedGameData& sgd, const unsigned obj_id)
{}

unsigned nofFarmhand::GetWorkRadius(const Job job)
{
return GetWorkRadius(world->GetGGS(), job);
}

unsigned nofFarmhand::GetWorkRadius(const GlobalGameSettings& ggs, const Job job)
{
switch(job)
{
Expand All @@ -43,18 +48,18 @@ unsigned nofFarmhand::GetWorkRadius(const Job job)
case Job::CharBurner: return 3;
case Job::Woodcutter:
{
const unsigned sel = world->GetGGS().getSelection(AddonId::WOODCUTTER_REACH_RADIUS);
const unsigned sel = ggs.getSelection(AddonId::WOODCUTTER_REACH_RADIUS);
return woodcutterRadiusValues[sel];
}
case Job::Forester:
{
const unsigned sel = world->GetGGS().getSelection(AddonId::FORESTER_REACH_RADIUS);
const unsigned sel = ggs.getSelection(AddonId::FORESTER_REACH_RADIUS);
return foresterRadiusValues[sel];
}
case Job::Fisher: return 7;
case Job::Stonemason:
{
const unsigned sel = world->GetGGS().getSelection(AddonId::STONEMASON_REACH_RADIUS);
const unsigned sel = ggs.getSelection(AddonId::STONEMASON_REACH_RADIUS);
return stonemasonRadiusValues[sel];
}
default: throw std::logic_error("Invalid job");
Expand Down
6 changes: 4 additions & 2 deletions libs/s25main/figures/nofFarmhand.h
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
// Copyright (C) 2005 - 2021 Settlers Freaks (sf-team at siedler25.org)
// Copyright (C) 2005 - 2026 Settlers Freaks (sf-team at siedler25.org)
//
// SPDX-License-Identifier: GPL-2.0-or-later

#pragma once

#include "nofBuildingWorker.h"
class GlobalGameSettings;
class SerializedGameData;
class nobUsual;

Expand Down Expand Up @@ -54,7 +55,8 @@ class nofFarmhand : public nofBuildingWorker
nofFarmhand(Job job, MapPoint pos, unsigned char player, nobUsual* workplace);
nofFarmhand(SerializedGameData& sgd, unsigned obj_id);

static unsigned GetWorkRadius(Job job);
static unsigned GetWorkRadius(const GlobalGameSettings& ggs, Job job);
unsigned GetWorkRadius(Job job);

void Serialize(SerializedGameData& sgd) const override;

Expand Down
2 changes: 1 addition & 1 deletion libs/s25main/figures/nofForester.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ bool IsPotentialNewFieldForOwnFarm(GameWorld& world, const MapPoint pt, const un
return false;

return world.CheckPointsInRadius(
pt, nofFarmhand::GetWorkRadius(Job::Farmer),
pt, nofFarmhand::GetWorkRadius(world.GetGGS(), Job::Farmer),
[&world, player](const MapPoint farmPt, unsigned) {
if(world.GetNO(farmPt)->GetType() != NodalObjectType::Building)
return false;
Expand Down
1 change: 0 additions & 1 deletion libs/s25main/figures/nofGeologist.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
#include "world/GameWorld.h"
#include "nodeObjs/noFlag.h"
#include "nodeObjs/noSign.h"
#include "gameData/GameConsts.h"

nofGeologist::nofGeologist(const MapPoint pos, const unsigned char player, noRoadNode* goal)
: nofFlagWorker(Job::Geologist, pos, player, goal), signs(0), node_goal(0, 0)
Expand Down
7 changes: 2 additions & 5 deletions libs/s25main/figures/nofHunter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
#include "random/Random.h"
#include "world/GameWorld.h"
#include "nodeObjs/noAnimal.h"
#include "gameData/GameConsts.h"
#include "gameData/JobConsts.h"
#include <stdexcept>

Expand Down Expand Up @@ -132,16 +131,14 @@ void nofHunter::HandleDerivedEvent(unsigned /*id*/)
void nofHunter::TryStartHunting()
{
// Find animals in a square around building (actually should be circle, but animals are moving anyway)
Comment thread
Flamefire marked this conversation as resolved.
const int SQUARE_SIZE = 19;

// Liste mit den gefundenen Tieren
std::vector<noAnimal*> available_animals;

// Durchgehen und nach Tieren suchen
Position curPos;
for(curPos.y = pos.y - SQUARE_SIZE; curPos.y <= pos.y + SQUARE_SIZE; ++curPos.y)
for(curPos.y = pos.y - HUNTER_SEARCH_HALFSIDE; curPos.y <= pos.y + HUNTER_SEARCH_HALFSIDE; ++curPos.y)
{
for(curPos.x = pos.x - SQUARE_SIZE; curPos.x <= pos.x + SQUARE_SIZE; ++curPos.x)
for(curPos.x = pos.x - HUNTER_SEARCH_HALFSIDE; curPos.x <= pos.x + HUNTER_SEARCH_HALFSIDE; ++curPos.x)
{
MapPoint curMapPos = world->MakeMapPoint(curPos);

Expand Down
2 changes: 1 addition & 1 deletion libs/s25main/figures/nofHunter.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright (C) 2005 - 2021 Settlers Freaks (sf-team at siedler25.org)
// Copyright (C) 2005 - 2026 Settlers Freaks (sf-team at siedler25.org)
//
// SPDX-License-Identifier: GPL-2.0-or-later

Expand Down
2 changes: 1 addition & 1 deletion libs/s25main/figures/nofMiner.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
#include "gameTypes/MineNoOutputFallback.h"
#include "gameTypes/MineResourceBehavior.h"
#include "gameTypes/Resource.h"
#include "gameData/GameConsts.h"
#include "gameData/JobConsts.h"
#include <algorithm>
#include <vector>

Expand Down
1 change: 0 additions & 1 deletion libs/s25main/figures/nofScout_Free.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
#include "random/Random.h"
#include "world/GameWorld.h"
#include "nodeObjs/noFlag.h"
#include "gameData/GameConsts.h"
#include "gameData/MilitaryConsts.h"
#include <algorithm>
class noRoadNode;
Expand Down
1 change: 0 additions & 1 deletion libs/s25main/figures/nofShipWright.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
#include "world/GameWorld.h"
#include "nodeObjs/noShipBuildingSite.h"
#include "gameTypes/Direction.h"
#include "gameData/GameConsts.h"
#include "gameData/JobConsts.h"
#include "s25util/colors.h"

Expand Down
1 change: 0 additions & 1 deletion libs/s25main/figures/nofTradeDonkey.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
#include "ogl/glArchivItem_Bitmap.h"
#include "world/GameWorld.h"
#include "gameData/BuildingProperties.h"
#include "gameData/GameConsts.h"
#include "gameData/JobConsts.h"

nofTradeDonkey::nofTradeDonkey(const MapPoint pos, const unsigned char player,
Expand Down
1 change: 0 additions & 1 deletion libs/s25main/figures/nofTradeLeader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
#include "postSystem/PostMsgWithBuilding.h"
#include "world/GameWorld.h"
#include "gameData/BuildingProperties.h"
#include "gameData/GameConsts.h"
#include "gameData/GoodConsts.h"
#include "gameData/JobConsts.h"
#include "gameData/NationConsts.h"
Expand Down
1 change: 0 additions & 1 deletion libs/s25main/figures/nofWorkman.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
#include "SoundManager.h"
#include "buildings/nobUsual.h"
#include "world/GameWorld.h"
#include "gameData/GameConsts.h"
#include "gameData/JobConsts.h"

nofWorkman::nofWorkman(const Job job, const MapPoint pos, const unsigned char player, nobUsual* workplace)
Expand Down
Loading
Loading