Skip to content

Commit 7492f5d

Browse files
authored
Bot didn't check prerequisite buildings before build (#175)
1 parent fac26a6 commit 7492f5d

File tree

4 files changed

+230
-220
lines changed

4 files changed

+230
-220
lines changed

MainCore/Helper/BuildingsHelper.cs

Lines changed: 200 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
using MainCore.Enums;
2+
using MainCore.Models.Runtime;
23
using MainCore.Services;
3-
using MainCore.TravianData;
44
using System.Collections.Generic;
55
using System.Linq;
66

@@ -43,7 +43,7 @@ public static bool CanBuild(AppDbContext context, IPlanManager planManager, int
4343
};
4444
}
4545

46-
(var reqTribe, var prerequisites) = BuildingsData.GetPrerequisiteBuildings(building);
46+
(var reqTribe, var prerequisites) = building.GetPrerequisiteBuildings();
4747
if (reqTribe != TribeEnums.Any && reqTribe != tribe) return false;
4848
foreach (var prerequisite in prerequisites)
4949
{
@@ -234,5 +234,203 @@ public static string GetColor(this BuildingEnums building)
234234
BuildingEnums.Trapper => 1,
235235
_ => 0,
236236
};
237+
238+
public static (TribeEnums, List<PrerequisiteBuilding>) GetPrerequisiteBuildings(this BuildingEnums building)
239+
{
240+
TribeEnums tribe = TribeEnums.Any;
241+
var ret = new List<PrerequisiteBuilding>();
242+
switch (building)
243+
{
244+
case BuildingEnums.Sawmill:
245+
ret.Add(new() { Building = BuildingEnums.Woodcutter, Level = 10 });
246+
ret.Add(new() { Building = BuildingEnums.MainBuilding, Level = 5 });
247+
break;
248+
249+
case BuildingEnums.Brickyard:
250+
ret.Add(new() { Building = BuildingEnums.ClayPit, Level = 10 });
251+
ret.Add(new() { Building = BuildingEnums.MainBuilding, Level = 5 });
252+
break;
253+
254+
case BuildingEnums.IronFoundry:
255+
ret.Add(new() { Building = BuildingEnums.IronMine, Level = 10 });
256+
ret.Add(new() { Building = BuildingEnums.MainBuilding, Level = 5 });
257+
break;
258+
259+
case BuildingEnums.GrainMill:
260+
ret.Add(new() { Building = BuildingEnums.Cropland, Level = 5 });
261+
ret.Add(new() { Building = BuildingEnums.MainBuilding, Level = 5 });
262+
break;
263+
264+
case BuildingEnums.Bakery:
265+
ret.Add(new() { Building = BuildingEnums.Cropland, Level = 10 });
266+
ret.Add(new() { Building = BuildingEnums.MainBuilding, Level = 5 });
267+
ret.Add(new() { Building = BuildingEnums.GrainMill, Level = 5 });
268+
break;
269+
270+
case BuildingEnums.Warehouse:
271+
ret.Add(new() { Building = BuildingEnums.MainBuilding, Level = 1 });
272+
break;
273+
274+
case BuildingEnums.Granary:
275+
ret.Add(new() { Building = BuildingEnums.MainBuilding, Level = 1 });
276+
break;
277+
278+
case BuildingEnums.Blacksmith:
279+
//DOESN'T EXIST ANYMORE
280+
tribe = TribeEnums.Nature; //Just a dirty hack, since user can't be Nature, he can't build Blacksmith
281+
break;
282+
283+
case BuildingEnums.Smithy:
284+
ret.Add(new() { Building = BuildingEnums.MainBuilding, Level = 3 });
285+
ret.Add(new() { Building = BuildingEnums.Academy, Level = 1 });
286+
break;
287+
288+
case BuildingEnums.TournamentSquare:
289+
ret.Add(new() { Building = BuildingEnums.RallyPoint, Level = 15 });
290+
break;
291+
292+
case BuildingEnums.MainBuilding:
293+
break;
294+
295+
case BuildingEnums.RallyPoint:
296+
break;
297+
298+
case BuildingEnums.Marketplace:
299+
ret.Add(new() { Building = BuildingEnums.Warehouse, Level = 1 });
300+
ret.Add(new() { Building = BuildingEnums.Granary, Level = 1 });
301+
ret.Add(new() { Building = BuildingEnums.MainBuilding, Level = 3 });
302+
break;
303+
304+
case BuildingEnums.Embassy:
305+
ret.Add(new() { Building = BuildingEnums.MainBuilding, Level = 1 });
306+
break;
307+
308+
case BuildingEnums.Barracks:
309+
ret.Add(new() { Building = BuildingEnums.MainBuilding, Level = 3 });
310+
ret.Add(new() { Building = BuildingEnums.RallyPoint, Level = 1 });
311+
break;
312+
313+
case BuildingEnums.Stable:
314+
ret.Add(new() { Building = BuildingEnums.Smithy, Level = 3 });
315+
ret.Add(new() { Building = BuildingEnums.Academy, Level = 5 });
316+
break;
317+
318+
case BuildingEnums.Workshop:
319+
ret.Add(new() { Building = BuildingEnums.Academy, Level = 10 });
320+
ret.Add(new() { Building = BuildingEnums.MainBuilding, Level = 5 });
321+
break;
322+
323+
case BuildingEnums.Academy:
324+
ret.Add(new() { Building = BuildingEnums.MainBuilding, Level = 3 });
325+
ret.Add(new() { Building = BuildingEnums.Barracks, Level = 3 });
326+
break;
327+
328+
case BuildingEnums.Cranny:
329+
break;
330+
331+
case BuildingEnums.TownHall:
332+
ret.Add(new() { Building = BuildingEnums.Academy, Level = 10 });
333+
ret.Add(new() { Building = BuildingEnums.MainBuilding, Level = 10 });
334+
break;
335+
336+
case BuildingEnums.Residence:
337+
ret.Add(new() { Building = BuildingEnums.MainBuilding, Level = 5 }); //no palace!
338+
break;
339+
340+
case BuildingEnums.Palace:
341+
ret.Add(new() { Building = BuildingEnums.MainBuilding, Level = 5 }); //no residence!
342+
ret.Add(new() { Building = BuildingEnums.Embassy, Level = 1 });
343+
break;
344+
345+
case BuildingEnums.Treasury:
346+
ret.Add(new() { Building = BuildingEnums.MainBuilding, Level = 10 });
347+
break;
348+
349+
case BuildingEnums.TradeOffice:
350+
ret.Add(new() { Building = BuildingEnums.Stable, Level = 10 });
351+
ret.Add(new() { Building = BuildingEnums.Marketplace, Level = 20 });
352+
break;
353+
354+
case BuildingEnums.GreatBarracks:
355+
ret.Add(new() { Building = BuildingEnums.Barracks, Level = 20 }); //not capital!
356+
break;
357+
358+
case BuildingEnums.GreatStable:
359+
ret.Add(new() { Building = BuildingEnums.Stable, Level = 20 }); //not capital
360+
break;
361+
362+
case BuildingEnums.CityWall:
363+
tribe = TribeEnums.Romans;
364+
break;
365+
366+
case BuildingEnums.EarthWall:
367+
tribe = TribeEnums.Teutons;
368+
break;
369+
370+
case BuildingEnums.Palisade:
371+
tribe = TribeEnums.Gauls;
372+
break;
373+
374+
case BuildingEnums.StonemasonsLodge:
375+
ret.Add(new() { Building = BuildingEnums.MainBuilding, Level = 5 }); //capital
376+
break;
377+
378+
case BuildingEnums.Brewery:
379+
tribe = TribeEnums.Teutons;
380+
ret.Add(new() { Building = BuildingEnums.Granary, Level = 20 });
381+
ret.Add(new() { Building = BuildingEnums.RallyPoint, Level = 10 });
382+
break;
383+
384+
case BuildingEnums.Trapper:
385+
tribe = TribeEnums.Gauls;
386+
ret.Add(new() { Building = BuildingEnums.RallyPoint, Level = 1 });
387+
break;
388+
389+
case BuildingEnums.HerosMansion:
390+
ret.Add(new() { Building = BuildingEnums.MainBuilding, Level = 3 });
391+
ret.Add(new() { Building = BuildingEnums.RallyPoint, Level = 1 });
392+
break;
393+
394+
case BuildingEnums.GreatWarehouse:
395+
ret.Add(new() { Building = BuildingEnums.MainBuilding, Level = 10 }); //art/ww vill
396+
break;
397+
398+
case BuildingEnums.GreatGranary:
399+
ret.Add(new() { Building = BuildingEnums.MainBuilding, Level = 10 }); //art/ww vill
400+
break;
401+
402+
case BuildingEnums.WW: //ww vill
403+
tribe = TribeEnums.Nature; //Just a dirty hack, since user can't be Nature, bot can't construct WW.
404+
break;
405+
406+
case BuildingEnums.HorseDrinkingTrough:
407+
ret.Add(new() { Building = BuildingEnums.RallyPoint, Level = 10 });
408+
ret.Add(new() { Building = BuildingEnums.Stable, Level = 20 });
409+
tribe = TribeEnums.Romans;
410+
break;
411+
412+
case BuildingEnums.StoneWall:
413+
tribe = TribeEnums.Egyptians;
414+
break;
415+
416+
case BuildingEnums.MakeshiftWall:
417+
tribe = TribeEnums.Huns;
418+
break;
419+
420+
case BuildingEnums.CommandCenter: //no res/palace
421+
tribe = TribeEnums.Huns;
422+
ret.Add(new() { Building = BuildingEnums.MainBuilding, Level = 5 });
423+
break;
424+
425+
case BuildingEnums.Waterworks:
426+
tribe = TribeEnums.Egyptians;
427+
ret.Add(new() { Building = BuildingEnums.HerosMansion, Level = 10 });
428+
break;
429+
430+
default:
431+
break;
432+
}
433+
return (tribe, ret);
434+
}
237435
}
238436
}

MainCore/Helper/UpgradeBuildingHelper.cs

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public static PlanTask NextBuildingTask(AppDbContext context, IPlanManager planM
5050
logManager.Information(accountId, "Cannot build because of lack of freecrop");
5151
return null;
5252
}
53-
return GetFirstInfrastructureTask(planManager, villageId);
53+
return GetFirstInfrastructureTask(context, planManager, villageId);
5454
}
5555
else if (numInfra > numRes)
5656
{
@@ -62,7 +62,7 @@ public static PlanTask NextBuildingTask(AppDbContext context, IPlanManager planM
6262
}
6363
}
6464

65-
return GetFirstTask(planManager, villageId);
65+
return GetFirstTask(context, planManager, villageId);
6666
}
6767

6868
public static PlanTask ExtractResField(AppDbContext context, int villageId, PlanTask buildingTask)
@@ -83,14 +83,14 @@ public static PlanTask ExtractResField(AppDbContext context, int villageId, Plan
8383
break;
8484
}
8585

86-
buildings.ForEach(b =>
86+
foreach (var b in buildings)
8787
{
8888
if (b.IsUnderConstruction)
8989
{
9090
var levelUpgrading = context.VillagesCurrentlyBuildings.Where(x => x.VillageId == villageId).Count(x => x.Location == b.Id);
9191
b.Level += (byte)levelUpgrading;
9292
}
93-
});
93+
}
9494
buildings = buildings.Where(b => b.Level < buildingTask.Level).ToList();
9595

9696
if (buildings.Count == 0) return null;
@@ -137,18 +137,37 @@ private static PlanTask GetFirstResTask(IPlanManager planManager, int villageId)
137137
return task;
138138
}
139139

140-
private static PlanTask GetFirstInfrastructureTask(IPlanManager planManager, int villageId)
140+
private static PlanTask GetFirstInfrastructureTask(AppDbContext context, IPlanManager planManager, int villageId)
141141
{
142142
var tasks = planManager.GetList(villageId);
143-
var task = tasks.FirstOrDefault(x => x.Type == PlanTypeEnums.General && !x.Building.IsResourceField());
143+
var infrastructureTasks = tasks.Where(x => x.Type == PlanTypeEnums.General && !x.Building.IsResourceField());
144+
var task = infrastructureTasks.FirstOrDefault(x => IsInfrastructureTaskVaild(context, villageId, x));
144145
return task;
145146
}
146147

147-
private static PlanTask GetFirstTask(IPlanManager planManager, int villageId)
148+
private static PlanTask GetFirstTask(AppDbContext context, IPlanManager planManager, int villageId)
148149
{
149150
var tasks = planManager.GetList(villageId);
150-
var task = tasks.FirstOrDefault();
151-
return task;
151+
foreach (var task in tasks)
152+
{
153+
if (task.Type != PlanTypeEnums.General) return task;
154+
if (task.Building.IsResourceField()) return task;
155+
if (IsInfrastructureTaskVaild(context, villageId, task)) return task;
156+
}
157+
return null;
158+
}
159+
160+
private static bool IsInfrastructureTaskVaild(AppDbContext context, int villageId, PlanTask planTask)
161+
{
162+
(_, var prerequisiteBuildings) = planTask.Building.GetPrerequisiteBuildings();
163+
var buildings = context.VillagesBuildings.Where(x => x.VillageId == villageId).ToList();
164+
foreach (var prerequisiteBuilding in prerequisiteBuildings)
165+
{
166+
var building = buildings.FirstOrDefault(x => x.Type == prerequisiteBuilding.Building);
167+
if (building is null) return false;
168+
if (building.Level < prerequisiteBuilding.Level) return false;
169+
}
170+
return true;
152171
}
153172

154173
public static DateTime GetTimeWhenEnough(this VillageProduction production, long[] resRequired)

MainCore/MainCore.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
<PropertyGroup>
44
<TargetFramework>net6.0</TargetFramework>
55
<!--<Server>TRAVIAN_OFFICIAL</Server>-->
6-
<!--<Server>TRAVIAN_OFFICIAL_HEROUI</Server>-->
7-
<Server>TTWARS</Server>
6+
<Server>TRAVIAN_OFFICIAL_HEROUI</Server>
7+
<!--<Server>TTWARS</Server>-->
88

99
<DefineConstants Condition="'$(Server)' != ''">$(DefineConstants);$(Server)</DefineConstants>
1010
</PropertyGroup>

0 commit comments

Comments
 (0)