Skip to content
Open
Show file tree
Hide file tree
Changes from 60 commits
Commits
Show all changes
81 commits
Select commit Hold shift + click to select a range
1b70332
Achievements Scaffolding
bb-froggy Jan 29, 2026
be14b87
Achievement: Win n games
bb-froggy Jan 29, 2026
2ade8cd
Prepare AchievementRepository.java
bb-froggy Feb 2, 2026
335253e
Correctly wire the achievement events
bb-froggy Feb 3, 2026
4457c90
Improved Achievements Layout
bb-froggy Feb 3, 2026
5e7609d
Additional achievement types
bb-froggy Feb 3, 2026
412661f
Improve Achievements layout
bb-froggy Feb 3, 2026
53918d2
Buy n Castles Achievement
bb-froggy Feb 4, 2026
cdf7144
Win with only n castles Achievement and separate tracker for in-game …
bb-froggy Feb 4, 2026
1b83982
Refactor: Count things in tracker and make Achievements leaner
bb-froggy Feb 4, 2026
9dc167d
re-order achievements on resize
bb-froggy Feb 19, 2026
0ecde90
WIP: Achievement for winning n games in a row
bb-froggy Feb 19, 2026
988d79a
Detecting a very-hard win streak
bb-froggy Feb 19, 2026
9784dc1
Check map sizes
bb-froggy Feb 22, 2026
0038afe
Better colors for achievements
bb-froggy Feb 26, 2026
2d6a94e
Move TitleLabel into achievement box, event if it has two rows
bb-froggy Feb 26, 2026
3ffb1b9
Change achievements title color (questionable decision)
bb-froggy Feb 26, 2026
262e7b9
AI Level Display name in Achievement DisplayName
bb-froggy Feb 26, 2026
a5db590
Achievement "Win in n rounds"
bb-froggy Mar 3, 2026
49c4c9b
Achievement "Lose against weak AI"
bb-froggy Mar 3, 2026
1810eb3
Achievement: Win and there are still many surviving enemies
bb-froggy Mar 4, 2026
ced6e24
Achievement: Win, but need more than n rounds
bb-froggy Mar 4, 2026
b77fa45
Win in more than n rounds -> Just play more than n rounds
bb-froggy Mar 4, 2026
a37d868
Fancy names for each achievement category
bb-froggy Mar 5, 2026
bbb3030
Fix Achievement UI scrolling layout
bb-froggy Mar 5, 2026
1261791
Small UI improvement
bb-froggy Mar 5, 2026
114c55c
HRR Henry VI as emperor without castle
bb-froggy Mar 5, 2026
091963f
Remove AchievementGameStateTracker and the two achievements depending…
bb-froggy Mar 9, 2026
59f017c
Separate data structure for history persons and events
bb-froggy Mar 9, 2026
6b08021
Add border around achievement boxes and improve AchievementDetail
bb-froggy Mar 9, 2026
9092992
Louis XI. as winning against 5 enemies
bb-froggy Mar 9, 2026
d84f2e8
WinWhenStartingLastAchievement.java
bb-froggy Mar 14, 2026
d358104
WinWhenStartingLastAchievement: It must also be the very hard AI
bb-froggy Mar 16, 2026
ad07af2
Fix wrong victory condition in WinWhenStartingLastAchievement
bb-froggy Mar 17, 2026
febcf13
Unit tests for achievements
bb-froggy Mar 17, 2026
0b8fdc9
Fine-tuned some achievement values
bb-froggy Mar 18, 2026
87acc77
More explicit description of WinVeryHardGamesInARowAchievement
bb-froggy Mar 18, 2026
8796c37
Secret achievements
bb-froggy Mar 18, 2026
129dc18
Achievement: John the Posthumous (and a rename of the LoseAgainstWeak…
bb-froggy Mar 18, 2026
05a7839
AbortGameAchievement must be in first round
bb-froggy Apr 8, 2026
5beb604
JavaDoc for achievement code
bb-froggy Apr 8, 2026
f987ce4
Remove unneeded method peekLastMove
bb-froggy Apr 8, 2026
e6786e4
Achievement Headings get their own font
bb-froggy Apr 8, 2026
e2d7e79
Comment explaining why WinWhenStartingLastAchievement does not work
bb-froggy Apr 8, 2026
c24521c
Remove commented-out code
bb-froggy Apr 8, 2026
ef71dc7
Fix for last player detection in WinWhenStartingLastAchievement
bb-froggy Apr 8, 2026
3dd48aa
JavaDoc for AchievementsEventHandler
bb-froggy Apr 8, 2026
53d246f
Use HorizontalGroup instead of manual column calculation
bb-froggy Apr 8, 2026
b7da041
Test improvements: Do not mock value classes -- and saved some redund…
bb-froggy Apr 19, 2026
e8aadc5
Fix failing test and use existing (unused?) MockPreferences
bb-froggy Apr 20, 2026
f1b8ecb
Merge branch 'master' into dev-achievements
bb-froggy Apr 22, 2026
f846283
Import MockPreferences from new correct package
bb-froggy Apr 22, 2026
6cb7b45
The achievement classes decide whether they are secret
bb-froggy Apr 22, 2026
2b0396a
Move AchievementsEventHandler.java out of ui
bb-froggy Apr 22, 2026
a935aeb
Redesign architecture for less coupling and more use of services
bb-froggy May 11, 2026
f758e4a
Achievements store their status via events
bb-froggy May 12, 2026
bb2738a
proper equals and hash code calculation
bb-froggy May 13, 2026
e36a518
Merge branch 'master' into dev-achievements
bb-froggy May 13, 2026
e67d5dc
Fix compilation errors after merging i18n code
bb-froggy May 13, 2026
8b6779a
Fix full achievement serialization issue
bb-froggy May 13, 2026
31c2ceb
fix json de-serialization (hopefully for real this time)
bb-froggy May 14, 2026
4f8e0fb
fix: Refresh achievements on every showing of the AchievementsScreen
bb-froggy May 14, 2026
6d6316b
Achievements directly return whether they have been changed after Map…
bb-froggy May 14, 2026
1adf032
Register click events in AchievementsScreen instead of a lower-level …
bb-froggy May 18, 2026
2a2b65e
Make the heading in the achievement details a little larger
bb-froggy May 19, 2026
fccc18f
Make AchievementBox use defined size
bb-froggy May 20, 2026
fcb7eb6
Refactor: Where are Achievements constructed and where are the values…
bb-froggy May 20, 2026
d1dbfa4
Removed unneeded imports
bb-froggy May 20, 2026
ef56491
Singular class names AchievementService and -Repository to plural Ach…
bb-froggy May 20, 2026
50b820c
Merge branch 'master' into dev-achievements
bb-froggy May 20, 2026
a2dec22
Fix build issues after merging master
bb-froggy May 20, 2026
7b97534
begin moving strings to translation file
Sesu8642 Jun 6, 2026
e0f93e0
make some more strings translatable
Sesu8642 Jun 18, 2026
51f629c
refactor and fix achievement translations
Sesu8642 Jun 20, 2026
7175802
translate ai level for WinAgainstAiLevelAchievement
Sesu8642 Jun 21, 2026
2325190
remove broken tests
Sesu8642 Jun 21, 2026
0f9ed82
translate map size for WinOnMapSizeAchievement
Sesu8642 Jul 7, 2026
d923eae
add initial German translations for achievements
Sesu8642 Jul 7, 2026
1c0ab51
improve texts
Sesu8642 Aug 10, 2026
1f2dd8c
fix crash
Sesu8642 Aug 10, 2026
8db29c7
refactor achievement dialog and headline font
Sesu8642 Aug 10, 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
3 changes: 2 additions & 1 deletion .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 1 addition & 4 deletions .idea/modules.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions assets/i18n/strings.properties
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ menu-button-tutorial=Tutorial
menu-button-changelog=Changelog
menu-button-dependency-licenses=Software Licenses
menu-button-privacy-policy=Privacy Policy ↗
menu-button-achievements=Achievements
menu-button-statistics=Statistics
menu-dialog-text-tutorial-nag=Do you know how to play?\n
menu-dialog-text-game-updated=The game was updated. See the changelog for details.\n
Expand Down
1 change: 1 addition & 0 deletions assets/i18n/strings_de.properties
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ menu-button-tutorial=Tutorial
menu-button-changelog=Änderungsprotokoll
menu-button-dependency-licenses=Software‑Lizenzen
menu-button-privacy-policy=Datenschutzerklärung ↗
menu-button-achievements=Erfolge
menu-button-statistics=Statistiken
menu-dialog-text-tutorial-nag=Weißt du, wie man spielt?\n
menu-dialog-text-game-updated=Das Spiel wurde aktualisiert. Siehe das Änderungsprotokoll für Details.\n
Expand Down
27 changes: 27 additions & 0 deletions assets/skin/pixthulhu-ui.json
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,30 @@ com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator: {
magFilter: Nearest
characters: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789()[]{}%&$§!?=+-.,:;_/\\*~#\"'↗–äöüÄÖÜßẞ\n"
}
MenuHeading: {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this font used somewhere? If not, it can be removed.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is used by menu_heading, defined in SkinConstants as FONT_MENU_HEADING, and used as the heading in the dialog that opens when you tap on a specific achievement. The important thing is that it is white. This is better readable in the dialog box with its turquois/cyan/green-blue (?) background.

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This file is generated and should not be edited directly. Instead, Skin Composer should be used. In addition to that, a new label style should be created and scaled in SkinFactory. Using the tool can be a bit tricky. Can I help you with that?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you mean "do everything for me", then you have my permission ;-). If you have some pointers, and I'll take it from there, I would also be glad. I guess "Skin Composer" is that tool (=a standalone program?).

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'll take care of it :)

font: FreeSansBold.ttf
size: 42
mono: false
color: white
gamma: 1.8
renderCount: 2
borderWidth: 1
borderColor: black
borderStraight: false
borderGamma: 1.8
shadowOffsetX: 0
shadowOffsetY: 0
spaceX: 0
spaceY: 0
kerning: true
flip: false
genMipMaps: false
incremental: false
hinting: AutoMedium
minFilter: Nearest
magFilter: Nearest
characters: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789()[]{}%&$§!?=+-.,:;_/\\*~#\"'↗–\n"
}
SmallerText: {
font: FreeSans.ttf
size: 24
Expand Down Expand Up @@ -381,6 +405,9 @@ com.badlogic.gdx.scenes.scene2d.ui.Label$LabelStyle: {
overlay: {
font: Overlay
}
menu_heading: {
font: MenuHeading
}
bestagon: {
font: bestagon
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
import de.sesu8642.feudaltactics.ingame.ui.IngameScreenEventHandler;
import de.sesu8642.feudaltactics.lib.ingame.GameControllerEventHandler;
import de.sesu8642.feudaltactics.menu.about.dagger.AboutScreen;
import de.sesu8642.feudaltactics.menu.achievements.AchievementsEventHandler;
import de.sesu8642.feudaltactics.menu.achievements.ui.AchievementsScreen;
import de.sesu8642.feudaltactics.menu.campaign.ui.CampaignLevelSelectionScreen;
import de.sesu8642.feudaltactics.menu.changelog.dagger.ChangelogScreen;
import de.sesu8642.feudaltactics.menu.common.ui.GameScreen;
Expand Down Expand Up @@ -52,6 +54,7 @@ public class ScreenNavigationController {
private final Provider<GameScreen> aboutScreenProvider;
private final Provider<PreferencesScreen> preferencesScreenProvider;
private final Provider<HistoryAndStatisticsScreen> historyAndStatisticsScreenProvider;
private final Provider<AchievementsScreen> achievementsScreenProvider;
private final Provider<InformationMenuPage1Screen> informationMenuScreenProvider;
private final Provider<InformationMenuPage2Screen> informationMenuScreen2Provider;
private final Provider<DependencyLicensesScreen> dependencyLicensesScreenProvider;
Expand All @@ -65,6 +68,7 @@ public class ScreenNavigationController {
private final IngameRendererEventHandler rendererEventHandler;
private final Provider<IngameScreenEventHandler> ingameScreenEventHandlerProvider;
private final Provider<PreferencesScreenEventHandler> preferencesScreenEventHandlerProvider;
private final AchievementsEventHandler achievementsEventHandler;
private final StatisticsEventHandler statisticsEventHandler;

/**
Expand All @@ -82,6 +86,7 @@ public ScreenNavigationController(
@AboutScreen Provider<GameScreen> aboutScreenProvider,
Provider<PreferencesScreen> preferencesScreenProvider,
Provider<HistoryAndStatisticsScreen> historyAndStatisticsScreenProvider,
Provider<AchievementsScreen> achievementsScreenProvider,
Provider<InformationMenuPage1Screen> informationMenuScreenProvider,
Provider<InformationMenuPage2Screen> informationMenuScreen2Provider,
Provider<DependencyLicensesScreen> dependencyLicensesScreenProvider,
Expand All @@ -94,6 +99,7 @@ public ScreenNavigationController(
IngameRendererEventHandler rendererEventHandler,
Provider<IngameScreenEventHandler> ingameScreenEventHandlerProvider,
Provider<PreferencesScreenEventHandler> preferencesScreenEventHandlerProvider,
AchievementsEventHandler achievementsEventHandler,
StatisticsEventHandler statisticsEventHandler) {

this.eventBus = eventBus;
Expand All @@ -106,6 +112,7 @@ public ScreenNavigationController(
this.aboutScreenProvider = aboutScreenProvider;
this.preferencesScreenProvider = preferencesScreenProvider;
this.historyAndStatisticsScreenProvider = historyAndStatisticsScreenProvider;
this.achievementsScreenProvider = achievementsScreenProvider;
this.informationMenuScreenProvider = informationMenuScreenProvider;
this.informationMenuScreen2Provider = informationMenuScreen2Provider;
this.dependencyLicensesScreenProvider = dependencyLicensesScreenProvider;
Expand All @@ -118,6 +125,7 @@ public ScreenNavigationController(
this.rendererEventHandler = rendererEventHandler;
this.ingameScreenEventHandlerProvider = ingameScreenEventHandlerProvider;
this.preferencesScreenEventHandlerProvider = preferencesScreenEventHandlerProvider;
this.achievementsEventHandler = achievementsEventHandler;
this.statisticsEventHandler = statisticsEventHandler;
}

Expand Down Expand Up @@ -183,7 +191,8 @@ public void transitionToSplashScreen() {
public void transitionToIngameScreen() {
changeScreen(ingameScreenProvider.get());
Stream.of(localIngameInputHandler, gameLogicEventHandler,
ingameScreenEventHandlerProvider.get(), rendererEventHandler, statisticsEventHandler)
ingameScreenEventHandlerProvider.get(), rendererEventHandler,
statisticsEventHandler, achievementsEventHandler)
.forEach(eventBus::register);
}

Expand Down Expand Up @@ -231,6 +240,13 @@ public void transitionToCampaignLevelSelectionScreen() {
}


/**
* Transitions to the achievements screen.
*/
public void transitionToAchievementsScreen() {
changeScreen(achievementsScreenProvider.get());
}

/**
* Transitions to the history and statistics screen.
*/
Expand All @@ -250,7 +266,7 @@ private void changeScreen(Screen screen) {

private void unregisterAllEventHandlers() {
Stream.of(localIngameInputHandler, gameLogicEventHandler, ingameScreenEventHandlerProvider.get(),
rendererEventHandler, preferencesScreenEventHandlerProvider.get(), statisticsEventHandler).forEach(object -> {
rendererEventHandler, preferencesScreenEventHandlerProvider.get(), achievementsEventHandler, statisticsEventHandler).forEach(object -> {
try {
eventBus.unregister(object);
} catch (IllegalArgumentException e) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import de.sesu8642.feudaltactics.editor.dagger.EditorDaggerModule;
import de.sesu8642.feudaltactics.ingame.dagger.IngameDaggerModule;
import de.sesu8642.feudaltactics.menu.about.dagger.AboutDaggerModule;
import de.sesu8642.feudaltactics.menu.achievements.dagger.AchievementsDaggerModule;
import de.sesu8642.feudaltactics.menu.changelog.dagger.ChangelogDaggerModule;
import de.sesu8642.feudaltactics.menu.common.dagger.MenuDaggerModule;
import de.sesu8642.feudaltactics.menu.crashreporting.GameCrasher;
Expand All @@ -27,7 +28,7 @@
**/
@Component(modules = {MainDaggerModule.class, ConfigDaggerModule.class, CrashReportingDaggerModule.class,
EditorDaggerModule.class, IngameDaggerModule.class, MenuDaggerModule.class, AboutDaggerModule.class,
ChangelogDaggerModule.class, InformationMenuDaggerModule.class, PrefsDaggerModule.class,
AchievementsDaggerModule.class, ChangelogDaggerModule.class, InformationMenuDaggerModule.class, PrefsDaggerModule.class,
StatisticsDaggerModule.class, RendererDaggerModule.class})
@Singleton
public interface FeudalTacticsComponent {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package de.sesu8642.feudaltactics.events.achievements;

import de.sesu8642.feudaltactics.menu.achievements.model.AbstractAchievement;
import lombok.Getter;

/**
* Event triggered when the progress of an achievement has changed, i.e. when the player has made progress towards unlocking it.
*/
public class AchievementProgressEvent {
@Getter
private final AbstractAchievement achievement;

/**
* Constructor.
*
* @param achievement the achievement for which the progress has changed
*/
public AchievementProgressEvent(AbstractAchievement achievement) {
this.achievement = achievement;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package de.sesu8642.feudaltactics.events.achievements;

import de.sesu8642.feudaltactics.menu.achievements.model.AbstractAchievement;
import lombok.Getter;

/**
* Event triggered when an achievement has just been unlocked.
*/
public class AchievementUnlockedEvent {
@Getter
private final AbstractAchievement achievement;

/**
* Constructor.
*
* @param achievement the achievement that has been unlocked
*/
public AchievementUnlockedEvent(AbstractAchievement achievement) {
this.achievement = achievement;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -282,5 +282,4 @@ public boolean isUndoPossible() {
lock.unlock();
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package de.sesu8642.feudaltactics.menu.achievements;

/**
* Marker interface for achievements that require full storage
*/
public interface AchievementNeedsFullStorage {

public String serializeToJson();

public void deserializeFromJson(String serializedData);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package de.sesu8642.feudaltactics.menu.achievements;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.inject.Inject;
import javax.inject.Singleton;

import com.google.common.eventbus.EventBus;

import de.sesu8642.feudaltactics.ingame.NewGamePreferences.MapSizes;
import de.sesu8642.feudaltactics.lib.ingame.botai.Intelligence;
import de.sesu8642.feudaltactics.menu.achievements.model.AbortGameAchievement;
import de.sesu8642.feudaltactics.menu.achievements.model.AbstractAchievement;
import de.sesu8642.feudaltactics.menu.achievements.model.HistoricPersonOrEvent;
import de.sesu8642.feudaltactics.menu.achievements.model.LoseAgainstWeakestAiAchievement;
import de.sesu8642.feudaltactics.menu.achievements.model.PlayMoreThanNRoundsAchievement;
import de.sesu8642.feudaltactics.menu.achievements.model.WinAgainstAiLevelAchievement;
import de.sesu8642.feudaltactics.menu.achievements.model.WinAgainstManyEnemiesAchievement;
import de.sesu8642.feudaltactics.menu.achievements.model.WinInNRoundsAchievement;
import de.sesu8642.feudaltactics.menu.achievements.model.WinNGamesAchievement;
import de.sesu8642.feudaltactics.menu.achievements.model.WinOnMapSizeAchievement;
import de.sesu8642.feudaltactics.menu.achievements.model.WinVeryHardGamesInARowAchievement;
import de.sesu8642.feudaltactics.menu.achievements.model.WinWhenStartingLastAchievement;
import lombok.Getter;

/**
* Provides achievement classes, knows how to construct each individual achievement
*/
@Singleton
public class AchievementProvider {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would probably call this AchievementFacory, as provider may be confused with the @provides concept of Dagger.

Speaking of which, there could be a provideAchievments method in a dagger module that uses this factory and makes the list of achievements injectable. That way, the AchievementService can be simplified as it only calls this method once anyway.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That sounds interesting. I wasn't aware of this dagger concept.

private final EventBus eventBus;

@Inject
public AchievementProvider(
EventBus eventBus) {
this.eventBus = eventBus;
}

public List<AbstractAchievement> CreateAchievements() {
List<AbstractAchievement> list = new ArrayList<>();
list.add(new WinNGamesAchievement(eventBus, 1));
list.add(new WinNGamesAchievement(eventBus, 10));
list.add(new WinNGamesAchievement(eventBus, 50).setHistoricConnection(HistoricPersonOrEvent.CHARLEMAGNE)); // Charlemagne won many battles
list.add(new WinInNRoundsAchievement(eventBus, 18));
list.add(new WinInNRoundsAchievement(eventBus, 14));
list.add(new WinInNRoundsAchievement(eventBus, 12).setHistoricConnection(HistoricPersonOrEvent.JEANNE_DARC)); // Jeanne d'Arc won battles when she was very young
list.add(new PlayMoreThanNRoundsAchievement(eventBus, 30).setHistoricConnection(HistoricPersonOrEvent.THIRTY_YEARS_WAR));
list.add(new PlayMoreThanNRoundsAchievement(eventBus, 50).setHistoricConnection(HistoricPersonOrEvent.HUNDRED_YEARS_WAR)); // The Hundred Years' War lasted very long obviously
list.add(new LoseAgainstWeakestAiAchievement(eventBus).setHistoricConnection(HistoricPersonOrEvent.ROAD_TO_CANOSSA)); // The Walk to Canossa was a humiliation. And so is this achievement.
list.add(new WinVeryHardGamesInARowAchievement(eventBus, 3));
list.add(new WinVeryHardGamesInARowAchievement(eventBus, 10));
list.add(new WinVeryHardGamesInARowAchievement(eventBus, 20).setHistoricConnection(HistoricPersonOrEvent.WILLIAM_THE_CONQUEROR));
list.add(new WinAgainstManyEnemiesAchievement(eventBus, 3));
list.add(new WinAgainstManyEnemiesAchievement(eventBus, 4));
list.add(new WinAgainstManyEnemiesAchievement(eventBus, 5).setHistoricConnection(HistoricPersonOrEvent.LOUIS_XI));
list.add(new WinOnMapSizeAchievement(eventBus, MapSizes.SMALL));
list.add(new WinOnMapSizeAchievement(eventBus, MapSizes.MEDIUM));
list.add(new WinOnMapSizeAchievement(eventBus, MapSizes.LARGE));
list.add(new WinOnMapSizeAchievement(eventBus, MapSizes.XLARGE));
list.add(new WinOnMapSizeAchievement(eventBus, MapSizes.XXLARGE).setHistoricConnection(HistoricPersonOrEvent.RICHARD_THE_LIONHEART));
list.add(new WinAgainstAiLevelAchievement(eventBus, Intelligence.LEVEL_1));
list.add(new WinAgainstAiLevelAchievement(eventBus, Intelligence.LEVEL_2));
list.add(new WinAgainstAiLevelAchievement(eventBus, Intelligence.LEVEL_3));
list.add(new WinAgainstAiLevelAchievement(eventBus, Intelligence.LEVEL_4).setHistoricConnection(HistoricPersonOrEvent.FREDERICK_THE_GREAT));
list.add(new WinWhenStartingLastAchievement(eventBus).setHistoricConnection(HistoricPersonOrEvent.TOKUGAWA_IEYASU));
list.add(new AbortGameAchievement(eventBus).setHistoricConnection(HistoricPersonOrEvent.JOHN_THE_POSTHUMOUS));

return Collections.unmodifiableList(list);
}
}
Loading