소스 검색

Bonusing objects are now configured in json

Ivan Savenko 2 년 전
부모
커밋
62e127fb59

+ 0 - 3
AI/Nullkiller/Engine/AIMemory.cpp

@@ -82,9 +82,6 @@ void AIMemory::markObjectVisited(const CGObjectInstance * obj)
 	if(dynamic_cast<const CGVisitableOPH *>(obj)) //we may want to visit it with another hero
 		return;
 	
-	if(dynamic_cast<const CGBonusingObject *>(obj)) //or another time
-		return;
-	
 	if(obj->ID == Obj::MONSTER)
 		return;
 

+ 2 - 2
AI/VCAI/VCAI.cpp

@@ -1618,10 +1618,10 @@ void VCAI::markObjectVisited(const CGObjectInstance * obj)
 
 	if(dynamic_cast<const CGVisitableOPH *>(obj)) //we may want to visit it with another hero
 		return;
-	if(dynamic_cast<const CGBonusingObject *>(obj)) //or another time
-		return;
+
 	if(obj->ID == Obj::MONSTER)
 		return;
+
 	alreadyVisited.insert(obj);
 }
 

+ 2 - 1
config/gameConfig.json

@@ -54,7 +54,8 @@
 		"config/objects/rewardable.json",
 		"config/objects/rewardablePickable.json",
 		"config/objects/rewardableOnceVisitable.json",
-		"config/objects/rewardableOncePerHero.json"
+		"config/objects/rewardableOncePerHero.json",
+		"config/objects/rewardableBonusing.json"
 	],
 
 	"artifacts" :

+ 0 - 248
config/objects/rewardable.json

@@ -83,253 +83,5 @@
 				}
 			}
 		}
-	},
-	"buoy" : {
-		"index" : 11,
-		"handler": "bonusingObject",
-		"base" : {
-			"sounds" : {
-				"ambient" : ["LOOPBUOY"],
-				"visit" : ["MORALE"]
-			}
-		},
-		"types" : {
-			"object" : {
-				"index" : 0,
-				"aiValue" : 100,
-				"rmg" : {
-					"value"		: 100,
-					"rarity"	: 100
-				}
-			}
-		}
-	},
-	"swanPond" : {
-		"index" : 14,
-		"handler": "bonusingObject",
-		"base" : {
-			"sounds" : {
-				"visit" : ["LUCK"]
-			}
-		},
-		"types" : {
-			"object" : {
-				"index" : 0,
-				"aiValue" : 100,
-				"rmg" : {
-					"zoneLimit"	: 1,
-					"value"		: 100,
-					"rarity"	: 100
-				}
-			}
-		}
-	},
-	"faerieRing" : {
-		"index" : 28,
-		"handler": "bonusingObject",
-		"base" : {
-			"sounds" : {
-				"ambient" : ["LOOPFAER"],
-				"visit" : ["LUCK"]
-			}
-		},
-		"types" : {
-			"object" : {
-				"index" : 0,
-				"aiValue" : 100,
-				"rmg" : {
-					"zoneLimit"	: 1,
-					"value"		: 100,
-					"rarity"	: 100
-				}
-			}
-		}
-	},
-	"fountainOfFortune" : {
-		"index" : 30,
-		"handler": "bonusingObject",
-		"base" : {
-			"sounds" : {
-				"ambient" : ["LOOPFOUN"],
-				"visit" : ["LUCK"]
-			}
-		},
-		"types" : {
-			"object" : {
-				"index" : 0,
-				"aiValue" : 100,
-				"rmg" : {
-					"zoneLimit"	: 1,
-					"value"		: 100,
-					"rarity"	: 100
-				}
-			}
-		}
-	},
-	"fountainOfYouth" : {
-		"index" : 31,
-		"handler": "bonusingObject",
-		"base" : {
-			"sounds" : {
-				"ambient" : ["LOOPFALL"],
-				"visit" : ["MORALE"]
-			}
-		},
-		"types" : {
-			"object" : {
-				"index" : 0,
-				"aiValue" : 100,
-				"rmg" : {
-					"zoneLimit"	: 1,
-					"value"		: 100,
-					"rarity"	: 50
-				}
-			}
-		}
-	},
-	"idolOfFortune" : {
-		"index" : 38,
-		"handler": "bonusingObject",
-		"base" : {
-			"sounds" : {
-				"visit" : ["LUCK"]
-			}
-		},
-		"types" : {
-			"object" : {
-				"index" : 0,
-				"aiValue" : 100,
-				"rmg" : {
-					"zoneLimit"	: 1,
-					"value"		: 100,
-					"rarity"	: 100
-				}
-			},
-			"object1" : {//WoG?
-				"index" : 1
-			}
-		}
-	},
-	"mermaids" : {
-		"index" : 52,
-		"handler": "bonusingObject",
-		"base" : {
-			"sounds" : {
-				"visit" : ["LUCK"]
-			}
-		},
-		"types" : {
-			"object" : {
-				"index" : 0,
-				"aiValue" : 100,
-				"rmg" : {
-					"value"		: 100,
-					"rarity"	: 20
-				}
-			}
-		}
-	},
-	"oasis" : {
-		"index" : 56,
-		"handler": "bonusingObject",
-		"base" : {
-			"sounds" : {
-				"visit" : ["MORALE"]
-			}
-		},
-		"types" : {
-			"object" : {
-				"index" : 0,
-				"aiValue" : 100,
-				"rmg" : {
-					"zoneLimit"	: 1,
-					"value"		: 100,
-					"rarity"	: 50
-				}
-			}
-		}
-	},
-	"stables" : {
-		"index" : 94,
-		"handler": "bonusingObject",
-		"base" : {
-			"sounds" : {
-				"ambient" : ["LOOPHORS"],
-				"visit" : ["STORE"]
-			}
-		},
-		"types" : {
-			"object" : {
-				"index" : 0,
-				"aiValue" : 200,
-				"rmg" : {
-					"zoneLimit"	: 1,
-					"value"		: 200,
-					"rarity"	: 40
-				}
-			}
-		}
-	},
-	"temple" : {
-		"index" : 96,
-		"handler": "bonusingObject",
-		"base" : {
-			"sounds" : {
-				"ambient" : ["LOOPSANC"],
-				"visit" : ["TEMPLE"]
-			}
-		},
-		"types" : {
-			"object" : {
-				"index" : 0,
-				"aiValue" : 100,
-				"rmg" : {
-					"zoneLimit"	: 1,
-					"value"		: 100,
-					"rarity"	: 100
-				}
-			}
-		}
-	},
-	"rallyFlag" : {
-		"index" : 64,
-		"handler": "bonusingObject",
-		"base" : {
-			"sounds" : {
-				"ambient" : ["LOOPFLAG"],
-				"visit" : ["MORALE"]
-			}
-		},
-		"types" : {
-			"object" : {
-				"index" : 0,
-				"aiValue" : 100,
-				"rmg" : {
-					"zoneLimit"	: 1,
-					"value"		: 100,
-					"rarity"	: 100
-				}
-			}
-		}
-	},
-	"wateringHole" : {//waters
-		"index" : 110,
-		"handler": "bonusingObject",
-		"base" : {
-			"sounds" : {
-				"visit" : ["MORALE"]
-			}
-		},
-		"types" : {
-			"object" : {
-				"index" : 0,
-				"aiValue" : 500,
-				"rmg" : {
-					"zoneLimit"	: 1,
-					"value"		: 500,
-					"rarity"	: 50
-				}
-			} 
-		}
 	}
 }

+ 431 - 0
config/objects/rewardableBonusing.json

@@ -0,0 +1,431 @@
+{
+	/// These are objects that covered by concept of "configurable object" and have their entire configuration in this config
+
+	"buoy" : {
+		"index" : 11,
+		"handler": "configurable",
+		"base" : {
+			"sounds" : {
+				"ambient" : ["LOOPBUOY"],
+				"visit" : ["MORALE"]
+			}
+		},
+		"types" : {
+			"buoy" : {
+				"index" : 0,
+				"aiValue" : 100,
+				"rmg" : {
+					"value"		: 100,
+					"rarity"	: 100
+				},
+				
+				"blockedVisitable" : true,
+				"onVisitedMessage" : 22,
+				"visitMode" : "bonus",
+				"selectMode" : "selectFirst",
+				"rewards" : [
+					{
+						"message" : 21,
+						"bonuses" : [ { "type" : "MORALE", "val" : 1, "duration" : "ONE_BATTLE", "desription" : 94 } ]
+					}
+				]
+			}	
+		}
+	},
+	"swanPond" : {
+		"index" : 14,
+		"handler": "configurable",
+		"base" : {
+			"sounds" : {
+				"visit" : ["LUCK"]
+			}
+		},
+		"types" : {
+			"swanPond" : {
+				"index" : 0,
+				"aiValue" : 100,
+				"rmg" : {
+					"zoneLimit"	: 1,
+					"value"		: 100,
+					"rarity"	: 100
+				},
+				
+				"onVisitedMessage" : 30,
+				"visitMode" : "bonus",
+				"selectMode" : "selectFirst",
+				"rewards" : [
+					{
+						"message" : 29,
+						"movePercentage" : 0,
+						"bonuses" : [ { "type" : "LUCK", "val" : 2, "duration" : "ONE_BATTLE", "desription" : 67 } ]
+					}
+				]
+			}
+		}
+	},
+	"faerieRing" : {
+		"index" : 28,
+		"handler": "configurable",
+		"base" : {
+			"sounds" : {
+				"ambient" : ["LOOPFAER"],
+				"visit" : ["LUCK"]
+			}
+		},
+		"types" : {
+			"faerieRing" : {
+				"index" : 0,
+				"aiValue" : 100,
+				"rmg" : {
+					"zoneLimit"	: 1,
+					"value"		: 100,
+					"rarity"	: 100
+				},
+				
+				"onVisitedMessage" : 50,
+				"visitMode" : "bonus",
+				"selectMode" : "selectFirst",
+				"rewards" : [
+					{
+						"message" : 49,
+						"bonuses" : [ { "type" : "LUCK", "val" : 1, "duration" : "ONE_BATTLE", "desription" : 71 } ]
+					}
+				]
+			}
+		}
+	},
+	"fountainOfFortune" : {
+		"index" : 30,
+		"handler": "configurable",
+		"base" : {
+			"sounds" : {
+				"ambient" : ["LOOPFOUN"],
+				"visit" : ["LUCK"]
+			}
+		},
+		"types" : {
+			"fountainOfFortune" : {
+				"index" : 0,
+				"aiValue" : 100,
+				"rmg" : {
+					"zoneLimit"	: 1,
+					"value"		: 100,
+					"rarity"	: 100
+				},
+				
+				"onVisitedMessage" : 56,
+				"visitMode" : "bonus",
+				"selectMode" : "selectRandom",
+				"rewards" : [
+					{
+						"message" : 55,
+						"bonuses" : [ { "type" : "LUCK", "val" : -1, "duration" : "ONE_BATTLE", "desription" : 69 } ] // NOTE: strings has %s placeholder for morale value
+					},
+					{
+						"message" : 55,
+						"bonuses" : [ { "type" : "LUCK", "val" : 1, "duration" : "ONE_BATTLE", "desription" : 69 } ] // NOTE: strings has %s placeholder for morale value
+					},
+					{
+						"message" : 55,
+						"bonuses" : [ { "type" : "LUCK", "val" : 2, "duration" : "ONE_BATTLE", "desription" : 69 } ] // NOTE: strings has %s placeholder for morale value
+					},
+					{
+						"message" : 55,
+						"bonuses" : [ { "type" : "LUCK", "val" : 3, "duration" : "ONE_BATTLE", "desription" : 69 } ] // NOTE: strings has %s placeholder for morale value
+					},
+				]
+			}
+		}
+	},
+	"fountainOfYouth" : {
+		"index" : 31,
+		"handler": "configurable",
+		"base" : {
+			"sounds" : {
+				"ambient" : ["LOOPFALL"],
+				"visit" : ["MORALE"]
+			}
+		},
+		"types" : {
+			"fountainOfYouth" : {
+				"index" : 0,
+				"aiValue" : 100,
+				"rmg" : {
+					"zoneLimit"	: 1,
+					"value"		: 100,
+					"rarity"	: 50
+				},
+				
+				"onVisitedMessage" : 58,
+				"visitMode" : "bonus",
+				"selectMode" : "selectFirst",
+				"rewards" : [
+					{
+						"message" : 57,
+						"movePoints" : 400,
+						"bonuses" : [ { "type" : "MORALE", "val" : 1, "duration" : "ONE_BATTLE", "desription" : 103 } ]
+					}
+				]
+			}
+		}
+	},
+	"idolOfFortune" : {
+		"index" : 38,
+		"handler": "configurable",
+		"base" : {
+			"sounds" : {
+				"visit" : ["LUCK"]
+			}
+		},
+		"types" : {
+			"idolOfFortune" : {
+				"index" : 0,
+				"aiValue" : 100,
+				"rmg" : {
+					"zoneLimit"	: 1,
+					"value"		: 100,
+					"rarity"	: 100
+				},
+				
+				"onVisitedMessage" : 63,
+				"visitMode" : "bonus",
+				"selectMode" : "selectFirst",
+				"rewards" : [
+					{
+						"message" : 62,
+						"limiter" : { "dayOfWeek" : 1 },
+						"bonuses" : [ { "type" : "LUCK", "val" : 1, "duration" : "ONE_BATTLE", "desription" : 68 } ]
+					},
+					{
+						"message" : 62,
+						"limiter" : { "dayOfWeek" : 2 },
+						"bonuses" : [ { "type" : "MORALE", "val" : 1, "duration" : "ONE_BATTLE", "desription" : 68 } ]
+					},
+					{
+						"message" : 62,
+						"limiter" : { "dayOfWeek" : 3 },
+						"bonuses" : [ { "type" : "LUCK", "val" : 1, "duration" : "ONE_BATTLE", "desription" : 68 } ]
+					},
+					{
+						"message" : 62,
+						"limiter" : { "dayOfWeek" : 4 },
+						"bonuses" : [ { "type" : "MORALE", "val" : 1, "duration" : "ONE_BATTLE", "desription" : 68 } ]
+					},
+					{
+						"message" : 62,
+						"limiter" : { "dayOfWeek" : 5 },
+						"bonuses" : [ { "type" : "LUCK", "val" : 1, "duration" : "ONE_BATTLE", "desription" : 68 } ]
+					},
+					{
+						"message" : 62,
+						"limiter" : { "dayOfWeek" : 6 },
+						"bonuses" : [ { "type" : "MORALE", "val" : 1, "duration" : "ONE_BATTLE", "desription" : 68 } ]
+					},
+					{
+						"message" : 62,
+						"limiter" : { "dayOfWeek" : 7 },
+						"bonuses" : [ 
+							{ "type" : "MORALE", "val" : 1, "duration" : "ONE_BATTLE", "desription" : 68 },
+							{ "type" : "LUCK", "val" : 1, "duration" : "ONE_BATTLE", "desription" : 68 }  
+						]
+					}
+				]
+			}
+		}
+	},
+	"mermaids" : {
+		"index" : 52,
+		"handler": "configurable",
+		"base" : {
+			"sounds" : {
+				"visit" : ["LUCK"]
+			}
+		},
+		"types" : {
+			"mermaids" : {
+				"index" : 0,
+				"aiValue" : 100,
+				"rmg" : {
+					"value"		: 100,
+					"rarity"	: 20
+				},
+				
+				"onVisitedMessage" : 82,
+				"visitMode" : "bonus",
+				"selectMode" : "selectFirst",
+				"rewards" : [
+					{
+						"message" : 83,
+						"bonuses" : [ { "type" : "LUCK", "val" : 1, "duration" : "ONE_BATTLE", "desription" : 72 } ]
+					}
+				]
+			}
+		}
+	},
+	"oasis" : {
+		"index" : 56,
+		"handler": "configurable",
+		"base" : {
+			"sounds" : {
+				"visit" : ["MORALE"]
+			}
+		},
+		"types" : {
+			"oasis" : {
+				"index" : 0,
+				"aiValue" : 100,
+				"rmg" : {
+					"zoneLimit"	: 1,
+					"value"		: 100,
+					"rarity"	: 50
+				},
+				
+				"onVisitedMessage" : 95,
+				"visitMode" : "bonus",
+				"selectMode" : "selectFirst",
+				"rewards" : [
+					{
+						"message" : 94,
+						"movePoints" : 800,
+						"bonuses" : [ { "type" : "MORALE", "val" : 1, "duration" : "ONE_BATTLE", "desription" : 95 } ]
+					}
+				]
+			}
+		}
+	},
+	"stables" : {
+		"index" : 94,
+		"handler": "configurable",
+		"base" : {
+			"sounds" : {
+				"ambient" : ["LOOPHORS"],
+				"visit" : ["STORE"]
+			}
+		},
+		"types" : {
+			"stables" : {
+				"index" : 0,
+				"aiValue" : 200,
+				"rmg" : {
+					"zoneLimit"	: 1,
+					"value"		: 200,
+					"rarity"	: 40
+				},
+				
+				"onVisitedMessage" : 136,
+				"visitMode" : "bonus",
+				"selectMode" : "selectFirst",
+				"rewards" : [
+					{
+						"message" : 137,
+						"movePoints" : 400,
+						"bonuses" : [ { "type" : "LAND_MOVEMENT", "val" : 400, "duration" : "ONE_WEEK",} ]
+					}
+					// TODO: 2nd reward with Cavalier -> Champions upgrade & text ID 138
+				]
+			}
+		}
+	},
+	"temple" : {
+		"index" : 96,
+		"handler": "configurable",
+		"base" : {
+			"sounds" : {
+				"ambient" : ["LOOPSANC"],
+				"visit" : ["TEMPLE"]
+			}
+		},
+		"types" : {
+			"temple" : {
+				"index" : 0,
+				"aiValue" : 100,
+				"rmg" : {
+					"zoneLimit"	: 1,
+					"value"		: 100,
+					"rarity"	: 100
+				},
+				
+				"onVisitedMessage" : 141,
+				"visitMode" : "bonus",
+				"selectMode" : "selectFirst",
+				"rewards" : [
+					{
+						"message" : 140,
+						"limiter" : { "dayOfWeek" : 7 },
+						"bonuses" : [ { "type" : "MORALE", "val" : 2, "duration" : "ONE_BATTLE", "desription" : 97 } ]
+					},
+					{
+						"message" : 140,
+						"bonuses" : [ { "type" : "MORALE", "val" : 1, "duration" : "ONE_BATTLE", "desription" : 96 } ]
+					}
+				]
+			}
+		}
+	},
+	"rallyFlag" : {
+		"index" : 64,
+		"handler": "configurable",
+		"base" : {
+			"sounds" : {
+				"ambient" : ["LOOPFLAG"],
+				"visit" : ["MORALE"]
+			}
+		},
+		"types" : {
+			"rallyFlag" : {
+				"index" : 0,
+				"aiValue" : 100,
+				"rmg" : {
+					"zoneLimit"	: 1,
+					"value"		: 100,
+					"rarity"	: 100
+				},
+				
+				"onVisitedMessage" : 111,
+				"visitMode" : "bonus",
+				"selectMode" : "selectFirst",
+				"rewards" : [
+					{
+						"message" : 110,
+						"movePoints" : 400,
+						"bonuses" : [ 
+							{ "type" : "MORALE", "val" : 1, "duration" : "ONE_BATTLE", "desription" : 102 },
+							{ "type" : "LUCK", "val" : 1, "duration" : "ONE_BATTLE", "desription" : 102 }
+						]
+					}
+				]
+			}
+		}
+	},
+	"wateringHole" : {
+		"index" : 110,
+		"handler": "configurable",
+		"base" : {
+			"sounds" : {
+				"visit" : ["MORALE"]
+			}
+		},
+		"types" : {
+			"wateringHole" : {
+				"index" : 0,
+				"aiValue" : 500,
+				"rmg" : {
+					"zoneLimit"	: 1,
+					"value"		: 500,
+					"rarity"	: 50
+				},
+				
+				"onVisitedMessage" : 167,
+				"visitMode" : "bonus",
+				"selectMode" : "selectFirst",
+				"rewards" : [
+					{
+						"message" : 166,
+						"movePoints" : 400,
+						"bonuses" : [ { "type" : "MORALE", "val" : 1, "duration" : "ONE_BATTLE", "desription" : 100 } ]
+					}
+				]
+			} 
+		}
+	}
+}

+ 10 - 10
config/objects/rewardableOncePerHero.json

@@ -11,7 +11,7 @@
 			}
 		},
 		"types" : {
-			"object" : {
+			"arena" : {
 				"index" : 0,
 				"aiValue" : 3000,
 				"rmg" : {
@@ -44,7 +44,7 @@
 			}
 		},
 		"types" : {
-			"object" : {
+			"marlettoTower" : {
 				"index" : 0,
 				"aiValue" : 1500,
 				"rmg" : {
@@ -74,7 +74,7 @@
 			}
 		},
 		"types" : {
-			"object" : {
+			"gardenOfRevelation" : {
 				"index" : 0,
 				"aiValue" : 1500,
 				"rmg" : {
@@ -103,7 +103,7 @@
 			}
 		},
 		"types" : {
-			"object" : {
+			"libraryOfEnlightenment" : {
 				"index" : 0,
 				"aiValue" : 12000,
 				"rmg" : {
@@ -181,7 +181,7 @@
 			}
 		},
 		"types" : {
-			"object" : {
+			"mercenaryCamp" : {
 				"index" : 0,
 				"aiValue" : 1500,
 				"rmg" : {
@@ -211,7 +211,7 @@
 			}
 		},
 		"types" : {
-			"object" : {
+			"starAxis" : {
 				"index" : 0,
 				"aiValue" : 1500,
 				"rmg" : {
@@ -240,7 +240,7 @@
 			}
 		},
 		"types" : {
-			"object" : {
+			"treeOfKnowledge" : {
 				"index" : 0,
 				"aiValue" : 2500,
 				"rmg" : {
@@ -261,7 +261,7 @@
 			}
 		},
 		"types" : {
-			"object" : {
+			"schoolOfMagic" : {
 				"index" : 0,
 				"aiValue" : 1000,
 				"rmg" : {
@@ -300,7 +300,7 @@
 			}
 		},
 		"types" : {
-			"object" : {
+			"schoolOfWar" : {
 				"index" : 0,
 				"aiValue" : 1000,
 				"rmg" : {
@@ -339,7 +339,7 @@
 			}
 		},
 		"types" : {
-			"object" : { 
+			"learningStone" : { 
 				"index" : 0,
 				"aiValue" : 1500,
 				"rmg" : {

+ 0 - 1
lib/mapObjects/CObjectClassesHandler.cpp

@@ -54,7 +54,6 @@ CObjectClassesHandler::CObjectClassesHandler()
 	SET_HANDLER("artifact", CGArtifact);
 	SET_HANDLER("blackMarket", CGBlackMarket);
 	SET_HANDLER("boat", CGBoat);
-	SET_HANDLER("bonusingObject", CGBonusingObject);
 	SET_HANDLER("borderGate", CGBorderGate);
 	SET_HANDLER("borderGuard", CGBorderGuard);
 	SET_HANDLER("monster", CGCreature);

+ 4 - 0
lib/mapObjects/CRewardableConstructor.cpp

@@ -106,6 +106,10 @@ void CRandomRewardObjectInfo::configureObject(CRewardableObject * object, CRando
 			bonus.source = Bonus::OBJECT;
 			bonus.sid = object->ID;
 			//TODO: bonus.description = object->getObjectName();
+			if (bonus.type == Bonus::MORALE)
+				info.reward.extraComponents.push_back(Component(Component::MORALE, 0, bonus.val, 0));
+			if (bonus.type == Bonus::LUCK)
+				info.reward.extraComponents.push_back(Component(Component::LUCK, 0, bonus.val, 0));
 		}
 
 		info.reward.primary = JsonRandom::loadPrimary(reward["primary"], rng);

+ 0 - 184
lib/mapObjects/CRewardableObject.cpp

@@ -472,190 +472,6 @@ CRewardableObject::CRewardableObject():
 	canRefuse(false)
 {}
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-///               END OF CODE FOR CREWARDABLEOBJECT AND RELATED CLASSES                         ///
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-CGBonusingObject::CGBonusingObject()
-{
-	visitMode = VISIT_BONUS;
-	selectMode = SELECT_FIRST;
-}
-
-void CGBonusingObject::initObj(CRandomGenerator & rand)
-{
-	auto configureBonusDuration = [&](CVisitInfo & visit, Bonus::BonusDuration duration, Bonus::BonusType type, si32 value, si32 descrID)
-	{
-		Bonus b(duration, type, Bonus::OBJECT, value, ID, descrID != 0 ? VLC->generaltexth->advobtxt[descrID] : "");
-		visit.reward.bonuses.push_back(b);
-		if (type == Bonus::MORALE)
-			visit.reward.extraComponents.push_back(Component(Component::MORALE, 0, value, 0));
-		if (type == Bonus::LUCK)
-			visit.reward.extraComponents.push_back(Component(Component::LUCK, 0, value, 0));
-	};
-
-	auto configureBonus = [&](CVisitInfo & visit, Bonus::BonusType type, si32 value, si32 descrID)
-	{
-		configureBonusDuration(visit, Bonus::ONE_BATTLE, type, value, descrID);
-	};
-
-	auto configureMessage = [&](CVisitInfo & visit, int onGrantID, int onVisitedID)
-	{
-		visit.message.addTxt(MetaString::ADVOB_TXT, onGrantID);
-		onVisited.addTxt(MetaString::ADVOB_TXT, onVisitedID);
-	};
-
-	info.resize(1);
-
-	switch(ID)
-	{
-	case Obj::BUOY:
-			blockVisit = true;
-		configureMessage(info[0], 21, 22);
-		configureBonus(info[0], Bonus::MORALE, +1, 94);
-		break;
-	case Obj::SWAN_POND:
-		configureMessage(info[0], 29, 30);
-		configureBonus(info[0], Bonus::LUCK, 2, 67);
-		info[0].reward.movePercentage = 0;
-		break;
-	case Obj::FAERIE_RING:
-		configureMessage(info[0], 49, 50);
-		configureBonus(info[0], Bonus::LUCK, 1, 71);
-		break;
-	case Obj::FOUNTAIN_OF_FORTUNE:
-		selectMode = SELECT_RANDOM;
-		info.resize(5);
-		for (int i=0; i<5; i++)
-		{
-			configureBonus(info[i], Bonus::LUCK, i-1, 69); //NOTE: description have %d that should be replaced with value
-			info[i].message.addTxt(MetaString::ADVOB_TXT, 55);
-		}
-		onVisited.addTxt(MetaString::ADVOB_TXT, 56);
-		break;
-	case Obj::IDOL_OF_FORTUNE:
-
-		info.resize(7);
-		for (int i=0; i<6; i++)
-		{
-			info[i].limiter.dayOfWeek = i+1;
-			configureBonus(info[i], (i%2) ? Bonus::MORALE : Bonus::LUCK, 1, 68);
-			info[i].message.addTxt(MetaString::ADVOB_TXT, 62);
-		}
-		info.back().limiter.dayOfWeek = 7;
-		configureBonus(info.back(), Bonus::MORALE, 1, 68); // on last day of week
-		configureBonus(info.back(), Bonus::LUCK,   1, 68);
-		configureMessage(info.back(), 62, 63);
-
-		break;
-	case Obj::MERMAID:
-		blockVisit = true;
-		configureMessage(info[0], 83, 82);
-		configureBonus(info[0], Bonus::LUCK, 1, 72);
-		break;
-	case Obj::RALLY_FLAG:
-		configureMessage(info[0], 111, 110);
-		configureBonus(info[0], Bonus::MORALE, 1, 102);
-		configureBonus(info[0], Bonus::LUCK,   1, 102);
-		info[0].reward.movePoints = 400;
-		break;
-	case Obj::OASIS:
-		configureMessage(info[0], 95, 94);
-		configureBonus(info[0], Bonus::MORALE, 1, 95);
-		info[0].reward.movePoints = 800;
-		break;
-	case Obj::TEMPLE:
-		info[0].limiter.dayOfWeek = 7;
-		info.resize(2);
-		configureBonus(info[0], Bonus::MORALE, 2, 96);
-		configureBonus(info[1], Bonus::MORALE, 1, 97);
-
-		info[0].message.addTxt(MetaString::ADVOB_TXT, 140);
-		info[1].message.addTxt(MetaString::ADVOB_TXT, 140);
-		onVisited.addTxt(MetaString::ADVOB_TXT, 141);
-		break;
-	case Obj::WATERING_HOLE:
-		configureMessage(info[0], 166, 167);
-		configureBonus(info[0], Bonus::MORALE, 1, 100);
-		info[0].reward.movePoints = 400;
-		break;
-	case Obj::FOUNTAIN_OF_YOUTH:
-		configureMessage(info[0], 57, 58);
-		configureBonus(info[0], Bonus::MORALE, 1, 103);
-		info[0].reward.movePoints = 400;
-		break;
-	case Obj::STABLES:
-		configureMessage(info[0], 137, 136);
-		configureBonusDuration(info[0], Bonus::ONE_WEEK, Bonus::LAND_MOVEMENT, 400, 0);
-		info[0].reward.movePoints = 400;
-		break;
-	}
-}
-
-CVisitInfo CGBonusingObject::getVisitInfo(int index, const CGHeroInstance *h) const
-{
-	if(ID == Obj::STABLES)
-	{
-		assert(index == 0);
-		for(auto& slot : h->Slots())
-		{
-			if(slot.second->type->idNumber == CreatureID::CAVALIER)
-			{
-				CVisitInfo vi(info[0]);
-				vi.message.clear();
-				vi.message.addTxt(MetaString::ADVOB_TXT, 138);
-				vi.reward.extraComponents.push_back(Component(
-					Component::CREATURE, CreatureID::CHAMPION, 0, 1));
-				return vi;
-			}
-		}
-	}
-	return info[index];
-}
-
-void CGBonusingObject::onHeroVisit(const CGHeroInstance *h) const
-{
-	CRewardableObject::onHeroVisit(h);
-	if(ID == Obj::STABLES)
-	{
-		//regardless of whether this hero visited stables or not, cavaliers must be upgraded
-		for(auto& slot : h->Slots())
-		{
-			if(slot.second->type->idNumber == CreatureID::CAVALIER)
-			{
-				cb->changeStackType(StackLocation(h, slot.first),
-									VLC->creh->objects[CreatureID::CHAMPION]);
-			}
-		}
-	}
-}
-
-bool CGBonusingObject::wasVisited(const CGHeroInstance * h) const
-{
-	if(ID == Obj::STABLES)
-	{
-		for(auto& slot : h->Slots())
-		{
-			if(slot.second->type->idNumber == CreatureID::CAVALIER)
-			{
-				// always display the reward message if the hero got cavaliers
-				return false;
-			}
-		}
-	}
-	return CRewardableObject::wasVisited(h);
-}
-
-void CGBonusingObject::grantReward(ui32 rewardID, const CGHeroInstance * hero) const
-{
-	if(ID == Obj::STABLES && CRewardableObject::wasVisited(hero))
-	{
-		// reward message has been displayed - do not give the actual bonus
-		return;
-	}
-	CRewardableObject::grantReward(rewardID, hero);
-}
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 CGVisitableOPH::CGVisitableOPH()

+ 0 - 22
lib/mapObjects/CRewardableObject.h

@@ -295,28 +295,6 @@ public:
 	friend class CRandomRewardObjectInfo;
 };
 
-class DLL_LINKAGE CGBonusingObject : public CRewardableObject //objects giving bonuses to luck/morale/movement
-{
-protected:
-	CVisitInfo getVisitInfo(int index, const CGHeroInstance *h) const override;
-
-	void grantReward(ui32 rewardID, const CGHeroInstance * hero) const override;
-
-public:
-	void initObj(CRandomGenerator & rand) override;
-
-	CGBonusingObject();
-
-	void onHeroVisit(const CGHeroInstance *h) const override;
-
-	bool wasVisited(const CGHeroInstance * h) const override;
-
-	template <typename Handler> void serialize(Handler &h, const int version)
-	{
-		h & static_cast<CRewardableObject&>(*this);
-	}
-};
-
 class DLL_LINKAGE CGVisitableOPH : public CRewardableObject //objects visitable only once per hero
 {
 public:

+ 0 - 2
lib/registerTypes/RegisterTypes.h

@@ -99,7 +99,6 @@ void registerTypesMapObjectTypes(Serializer &s)
 	REGISTER_GENERIC_HANDLER(CGArtifact);
 	REGISTER_GENERIC_HANDLER(CGBlackMarket);
 	REGISTER_GENERIC_HANDLER(CGBoat);
-	REGISTER_GENERIC_HANDLER(CGBonusingObject);
 	REGISTER_GENERIC_HANDLER(CGBorderGate);
 	REGISTER_GENERIC_HANDLER(CGBorderGuard);
 	REGISTER_GENERIC_HANDLER(CGCreature);
@@ -160,7 +159,6 @@ void registerTypesMapObjects2(Serializer &s)
 			s.template registerType<CGTownBuilding, COPWBonus>();
 
 	s.template registerType<CGObjectInstance, CRewardableObject>();
-		s.template registerType<CRewardableObject, CGBonusingObject>();
 		s.template registerType<CRewardableObject, CGVisitableOPH>();
 		s.template registerType<CRewardableObject, CGVisitableOPW>();
 			s.template registerType<CGVisitableOPW, CGMagicSpring>();