浏览代码

Implemented spell range overlay for Dimension Door and Scuttle Boat

Ivan Savenko 2 年之前
父节点
当前提交
5c9ae8aafc

+ 1 - 0
ChangeLog.md

@@ -1,6 +1,7 @@
 # 1.2.0 -> 1.2.1
 
 ### GENERAL:
+* Implemented spell range overlay for Dimension Door and Scuttle Boat
 * Fixed movement cost penalty from terrain
 * Fixed empty Black Market on game start
 * Fixed bad morale happening after waiting

二进制
Mods/vcmi/Data/debug/cached.png


二进制
Mods/vcmi/Data/debug/spellRange.png


+ 14 - 2
client/adventureMap/CAdvMapInt.cpp

@@ -1076,8 +1076,11 @@ void CAdvMapInt::onTileLeftClicked(const int3 &mapPos)
 	const CGObjectInstance *topBlocking = getActiveObject(mapPos);
 
 	int3 selPos = selection->getSightCenter();
-	if(spellBeingCasted && isInScreenRange(selPos, mapPos))
+	if(spellBeingCasted)
 	{
+		if (!isInScreenRange(selPos, mapPos))
+			return;
+
 		const TerrainTile *heroTile = LOCPLINT->cb->getTile(selPos);
 
 		switch(spellBeingCasted->id)
@@ -1179,11 +1182,15 @@ void CAdvMapInt::onTileHovered(const int3 &mapPos)
 		switch(spellBeingCasted->id)
 		{
 		case SpellID::SCUTTLE_BOAT:
-			if(objAtTile && objAtTile->ID == Obj::BOAT)
+			{
+			int3 hpos = selection->getSightCenter();
+
+			if(objAtTile && objAtTile->ID == Obj::BOAT && isInScreenRange(hpos, mapPos))
 				CCS->curh->set(Cursor::Map::SCUTTLE_BOAT);
 			else
 				CCS->curh->set(Cursor::Map::POINTER);
 			return;
+			}
 		case SpellID::DIMENSION_DOOR:
 			{
 				const TerrainTile * t = LOCPLINT->cb->getTile(mapPos, false);
@@ -1342,6 +1349,8 @@ void CAdvMapInt::enterCastingMode(const CSpell * sp)
 {
 	assert(sp->id == SpellID::SCUTTLE_BOAT  ||  sp->id == SpellID::DIMENSION_DOOR);
 	spellBeingCasted = sp;
+	Settings config = settings.write["session"]["showSpellRange"];
+	config->Bool() = true;
 
 	deactivate();
 	terrain->activate();
@@ -1356,6 +1365,9 @@ void CAdvMapInt::leaveCastingMode(bool cast, int3 dest)
 	terrain->deactivate();
 	activate();
 
+	Settings config = settings.write["session"]["showSpellRange"];
+	config->Bool() = false;
+
 	if(cast)
 		LOCPLINT->cb->castSpell(curHero(), id, dest);
 	else

+ 4 - 0
client/mapView/IMapRendererContext.h

@@ -86,4 +86,8 @@ public:
 	virtual bool showGrid() const = 0;
 	virtual bool showVisitable() const = 0;
 	virtual bool showBlocked() const = 0;
+
+	/// if true, spell range for teleport / scuttle boat will be visible
+	virtual bool showSpellRange(const int3 & position) const = 0;
+
 };

+ 12 - 5
client/mapView/MapRenderer.cpp

@@ -584,15 +584,16 @@ uint8_t MapRendererObjects::checksum(IMapRendererContext & context, const int3 &
 	return 0xff-1;
 }
 
-MapRendererDebug::MapRendererDebug()
+MapRendererOverlay::MapRendererOverlay()
 	: imageGrid(IImage::createFromFile("debug/grid", EImageBlitMode::ALPHA))
 	, imageBlocked(IImage::createFromFile("debug/blocked", EImageBlitMode::ALPHA))
 	, imageVisitable(IImage::createFromFile("debug/visitable", EImageBlitMode::ALPHA))
+	, imageSpellRange(IImage::createFromFile("debug/spellRange", EImageBlitMode::ALPHA))
 {
 
 }
 
-void MapRendererDebug::renderTile(IMapRendererContext & context, Canvas & target, const int3 & coordinates)
+void MapRendererOverlay::renderTile(IMapRendererContext & context, Canvas & target, const int3 & coordinates)
 {
 	if(context.showGrid())
 		target.draw(imageGrid, Point(0,0));
@@ -618,9 +619,12 @@ void MapRendererDebug::renderTile(IMapRendererContext & context, Canvas & target
 		if (context.showVisitable() && visitable)
 			target.draw(imageVisitable, Point(0,0));
 	}
+
+	if (context.showSpellRange(coordinates))
+		target.draw(imageSpellRange, Point(0,0));
 }
 
-uint8_t MapRendererDebug::checksum(IMapRendererContext & context, const int3 & coordinates)
+uint8_t MapRendererOverlay::checksum(IMapRendererContext & context, const int3 & coordinates)
 {
 	uint8_t result = 0;
 
@@ -633,6 +637,9 @@ uint8_t MapRendererDebug::checksum(IMapRendererContext & context, const int3 & c
 	if (context.showGrid())
 		result += 4;
 
+	if (context.showSpellRange(coordinates))
+		result += 8;
+
 	return result;
 }
 
@@ -766,7 +773,7 @@ MapRenderer::TileChecksum MapRenderer::getTileChecksum(IMapRendererContext & con
 			result[3] = rendererRoad.checksum(context, coordinates);
 		result[4] = rendererObjects.checksum(context, coordinates);
 		result[5] = rendererPath.checksum(context, coordinates);
-		result[6] = rendererDebug.checksum(context, coordinates);
+		result[6] = rendererOverlay.checksum(context, coordinates);
 
 		if(!context.isVisible(coordinates))
 			result[7] = rendererFow.checksum(context, coordinates);
@@ -800,7 +807,7 @@ void MapRenderer::renderTile(IMapRendererContext & context, Canvas & target, con
 
 		rendererObjects.renderTile(context, target, coordinates);
 		rendererPath.renderTile(context, target, coordinates);
-		rendererDebug.renderTile(context, target, coordinates);
+		rendererOverlay.renderTile(context, target, coordinates);
 
 		if(!context.isVisible(coordinates))
 			rendererFow.renderTile(context, target, coordinates);

+ 3 - 12
client/mapView/MapRenderer.h

@@ -129,21 +129,12 @@ public:
 	void renderTile(IMapRendererContext & context, Canvas & target, const int3 & coordinates);
 };
 
-class MapRendererDebug
+class MapRendererOverlay
 {
 	std::shared_ptr<IImage> imageGrid;
 	std::shared_ptr<IImage> imageVisitable;
 	std::shared_ptr<IImage> imageBlocked;
-public:
-	MapRendererDebug();
-
-	uint8_t checksum(IMapRendererContext & context, const int3 & coordinates);
-	void renderTile(IMapRendererContext & context, Canvas & target, const int3 & coordinates);
-};
-
-class MapRendererOverlay
-{
-	std::unique_ptr<CAnimation> iconsStorage;
+	std::shared_ptr<IImage> imageSpellRange;
 public:
 	MapRendererOverlay();
 
@@ -160,7 +151,7 @@ class MapRenderer
 	MapRendererFow rendererFow;
 	MapRendererObjects rendererObjects;
 	MapRendererPath rendererPath;
-	MapRendererDebug rendererDebug;
+	MapRendererOverlay rendererOverlay;
 
 public:
 	using TileChecksum = std::array<uint8_t, 8>;

+ 16 - 0
client/mapView/MapRendererContext.cpp

@@ -22,6 +22,7 @@
 #include "../../lib/CPathfinder.h"
 #include "../../lib/Point.h"
 #include "../../lib/mapObjects/CGHeroInstance.h"
+#include "../../lib/spells/CSpellHandler.h"
 #include "../../lib/mapping/CMap.h"
 
 MapRendererBaseContext::MapRendererBaseContext(const MapRendererContextState & viewState)
@@ -199,6 +200,11 @@ bool MapRendererBaseContext::showBlocked() const
 	return false;
 }
 
+bool MapRendererBaseContext::showSpellRange(const int3 & position) const
+{
+	return false;
+}
+
 MapRendererAdventureContext::MapRendererAdventureContext(const MapRendererContextState & viewState)
 	: MapRendererBaseContext(viewState)
 {
@@ -266,6 +272,16 @@ bool MapRendererAdventureContext::showBlocked() const
 	return settingShowBlocked;
 }
 
+bool MapRendererAdventureContext::showSpellRange(const int3 & position) const
+{
+	if (!settingSpellRange)
+		return false;
+
+	auto hero = adventureInt->curHero();
+
+	return !isInScreenRange(hero->getSightCenter(), position);
+}
+
 MapRendererAdventureTransitionContext::MapRendererAdventureTransitionContext(const MapRendererContextState & viewState)
 	: MapRendererAdventureContext(viewState)
 {

+ 4 - 0
client/mapView/MapRendererContext.h

@@ -58,6 +58,7 @@ public:
 	bool showGrid() const override;
 	bool showVisitable() const override;
 	bool showBlocked() const override;
+	bool showSpellRange(const int3 & position) const override;
 };
 
 class MapRendererAdventureContext : public MapRendererBaseContext
@@ -67,6 +68,7 @@ public:
 	bool settingShowGrid = false;
 	bool settingShowVisitable = false;
 	bool settingShowBlocked = false;
+	bool settingSpellRange= false;
 	bool settingsAdventureObjectAnimation = true;
 	bool settingsAdventureTerrainAnimation = true;
 
@@ -80,6 +82,8 @@ public:
 	bool showGrid() const override;
 	bool showVisitable() const override;
 	bool showBlocked() const override;
+
+	bool showSpellRange(const int3 & position) const override;
 };
 
 class MapRendererAdventureTransitionContext : public MapRendererAdventureContext

+ 1 - 0
client/mapView/MapViewController.cpp

@@ -154,6 +154,7 @@ void MapViewController::updateBefore(uint32_t timeDelta)
 		adventureContext->settingShowGrid = settings["gameTweaks"]["showGrid"].Bool();
 		adventureContext->settingShowVisitable = settings["session"]["showVisitable"].Bool();
 		adventureContext->settingShowBlocked = settings["session"]["showBlocked"].Bool();
+		adventureContext->settingSpellRange = settings["session"]["showSpellRange"].Bool();
 	}
 }