Skip to content

Commit

Permalink
大量重构:Achievement更像是Quest,定义解锁顺序,showAchievementMaskBoard用队列支持同一帧完成多个任…
Browse files Browse the repository at this point in the history
…务依次展示。
  • Loading branch information
hundun000 committed Sep 17, 2023
1 parent 58c4c03 commit 1d15e95
Show file tree
Hide file tree
Showing 16 changed files with 210 additions and 98 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,6 @@ public DemoChildGameConfig() {
);
this.setScreenIdToFilePathMap(screenIdToFilePathMap);

this.setAchievementPrototypeIds(JavaFeatureForGwt.listOf(
DemoAchievementId.STEP_1,
DemoAchievementId.STEP_2
));
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ public Map<String, AbstractAchievement> getProviderMap(Language language) {
JavaFeatureForGwt.mapOf(
ConstructionPrototypeId.COOKIE_AUTO_PROVIDER, new SimpleEntry<>(1, 2)
),
DemoAchievementId.STEP_2,
new ResourcePair(ResourceType.COIN, 1000L)
);
OwnConstructionAchievement.Companion.quickAddOwnConstructionAchievement(
Expand All @@ -63,6 +64,7 @@ public Map<String, AbstractAchievement> getProviderMap(Language language) {
JavaFeatureForGwt.mapOf(
ConstructionPrototypeId.COOKIE_AUTO_SELLER, new SimpleEntry<>(1, 2)
),
null,
new ResourcePair(ResourceType.COIN, 1000L)
);
return map;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@
import hundun.gdxgame.idleshare.gamelib.framework.data.GameplaySaveData;
import hundun.gdxgame.idleshare.gamelib.framework.data.SystemSettingSaveData;
import hundun.gdxgame.idleshare.gamelib.framework.model.grid.GridPosition;
import hundun.gdxgame.idleshare.gamelib.framework.model.manager.AchievementManager;
import hundun.gdxgame.idleshare.gamelib.framework.model.manager.AchievementManager.AchievementSaveData;
import hundun.gdxgame.idleshare.gamelib.framework.model.manager.AchievementManager.AchievementState;
import hundun.gdxgame.idleshare.gamelib.framework.util.text.Language;

/**
Expand Down Expand Up @@ -79,7 +82,10 @@ protected RootSaveData genereateStarterRootSaveData() {
.constructionSaveDataMap(map)
.ownResources(ownResources)
.unlockedResourceTypes(new HashSet<>())
.unlockedAchievementIds(new HashSet<>())
.achievementSaveDataMap(JavaFeatureForGwt.mapOf(
DemoAchievementId.STEP_1,
new AchievementSaveData(AchievementState.RUNNING)
))
.build())
.systemSettingSaveData(SystemSettingSaveData.builder()
.language(Language.EN)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,24 +10,30 @@
import hundun.gdxgame.idledemo.DemoIdleGame;
import hundun.gdxgame.idledemo.logic.GameArea;
import hundun.gdxgame.idledemo.logic.RootSaveData;
import hundun.gdxgame.idledemo.ui.sub.FirstLockedAchievementBoardVM;
import hundun.gdxgame.idledemo.ui.sub.FirstRunningAchievementBoardVM;
import hundun.gdxgame.idledemo.ui.world.HexCellVM;
import hundun.gdxgame.idledemo.ui.sub.AchievementMaskBoard;
import hundun.gdxgame.idleshare.core.starter.ui.component.GameAreaControlBoard;
import hundun.gdxgame.idleshare.core.starter.ui.screen.play.BaseIdleScreen;
import hundun.gdxgame.idleshare.core.starter.ui.screen.play.PlayScreenLayoutConst;
import hundun.gdxgame.idleshare.gamelib.framework.callback.IAchievementUnlockCallback;
import hundun.gdxgame.idleshare.gamelib.framework.callback.IAchievementBoardCallback;
import hundun.gdxgame.idleshare.gamelib.framework.callback.IAchievementStateChangeListener;
import hundun.gdxgame.idleshare.gamelib.framework.model.achievement.AbstractAchievement;
import hundun.gdxgame.idleshare.gamelib.framework.model.manager.AchievementManager.AchievementState;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public abstract class BaseDemoPlayScreen extends BaseIdleScreen<DemoIdleGame, RootSaveData>
implements IGameAreaChangeListener, IAchievementUnlockCallback
implements IGameAreaChangeListener, IAchievementBoardCallback, IAchievementStateChangeListener
{

protected FirstLockedAchievementBoardVM<DemoIdleGame, RootSaveData> firstLockedAchievementBoardVM;
protected FirstRunningAchievementBoardVM<DemoIdleGame, RootSaveData> firstRunningAchievementBoardVM;
protected AchievementMaskBoard achievementMaskBoard;

protected List<AbstractAchievement> showAchievementMaskBoardQueue = new ArrayList<>();

public BaseDemoPlayScreen(DemoIdleGame game) {
super(game, customLayoutConst(game));
}
Expand Down Expand Up @@ -55,7 +61,6 @@ protected void lazyInitLogicContext() {
super.lazyInitLogicContext();

gameAreaChangeListeners.add(this);
gameAreaChangeListeners.add(firstLockedAchievementBoardVM);
}

@Override
Expand All @@ -64,8 +69,8 @@ protected void lazyInitUiRootContext() {

Table rightSideGroup = new Table();

firstLockedAchievementBoardVM = new FirstLockedAchievementBoardVM<>(this);
rightSideGroup.add(firstLockedAchievementBoardVM)
firstRunningAchievementBoardVM = new FirstRunningAchievementBoardVM<>(this);
rightSideGroup.add(firstRunningAchievementBoardVM)
.width(getLayoutConst().FIRST_LOCKED_ACHIEVEMENT_BOARD_WIDTH)
.height(getLayoutConst().FIRST_LOCKED_ACHIEVEMENT_BOARD_HEIGHT)
.row();
Expand All @@ -86,10 +91,26 @@ public void onGameAreaChange(String last, String current) {
game.getScreenManager().pushScreen(currentScreen, null);
game.getAudioPlayManager().intoScreen(currentScreen);
}
firstRunningAchievementBoardVM.updateData();
}

public abstract void onDeskClicked(HexCellVM vm);

@Override
protected void onLogicFrame() {
super.onLogicFrame();

if (showAchievementMaskBoardQueue.size() > 0) {
AbstractAchievement achievement = showAchievementMaskBoardQueue.remove(0);

game.getFrontend().log(this.getClass().getSimpleName(), "onAchievementUnlock called");
achievementMaskBoard.setAchievementPrototype(achievement);
achievementMaskBoard.setVisible(true);
Gdx.input.setInputProcessor(popupUiStage);
logicFrameHelper.setLogicFramePause(true);
}
}

@Override
public void hideAchievementMaskBoard() {
game.getFrontend().log(this.getClass().getSimpleName(), "hideAchievementMaskBoard called");
Expand All @@ -99,15 +120,11 @@ public void hideAchievementMaskBoard() {
}

@Override
public void showAchievementMaskBoard(AbstractAchievement prototype) {
public void showAchievementMaskBoard(AbstractAchievement achievement) {
if (this.hidden) {
return;
}
game.getFrontend().log(this.getClass().getSimpleName(), "onAchievementUnlock called");
achievementMaskBoard.setAchievementPrototype(prototype);
achievementMaskBoard.setVisible(true);
Gdx.input.setInputProcessor(popupUiStage);
logicFrameHelper.setLogicFramePause(true);
showAchievementMaskBoardQueue.add(achievement);
}

@Override
Expand All @@ -126,4 +143,14 @@ protected void lazyInitBackUiAndPopupUiContent() {


}

@Override
public void onAchievementStateChange(AbstractAchievement achievement, AchievementState state) {
if (state == AchievementState.COMPLETED) {
showAchievementMaskBoard(achievement);
firstRunningAchievementBoardVM.updateData();
} else if (state == AchievementState.RUNNING) {
firstRunningAchievementBoardVM.updateData();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@
import com.badlogic.gdx.scenes.scene2d.ui.Label;
import com.badlogic.gdx.scenes.scene2d.ui.Table;
import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable;
import hundun.gdxgame.gamelib.starter.listerner.IGameAreaChangeListener;
import hundun.gdxgame.gamelib.base.util.JavaFeatureForGwt;
import hundun.gdxgame.idleshare.core.framework.BaseIdleGame;
import hundun.gdxgame.idleshare.core.starter.ui.screen.play.BaseIdleScreen;
import hundun.gdxgame.idleshare.gamelib.framework.model.manager.AchievementManager.AchievementInfoPackage;

import java.util.List;

public class FirstLockedAchievementBoardVM<T_GAME extends BaseIdleGame<T_SAVE>, T_SAVE> extends Table implements IGameAreaChangeListener {
public class FirstRunningAchievementBoardVM<T_GAME extends BaseIdleGame<T_SAVE>, T_SAVE> extends Table {

BaseIdleScreen<T_GAME, T_SAVE> parent;

Expand All @@ -22,7 +22,7 @@ public class FirstLockedAchievementBoardVM<T_GAME extends BaseIdleGame<T_SAVE>,

List<String> texts;

public FirstLockedAchievementBoardVM(BaseIdleScreen<T_GAME, T_SAVE> parent)
public FirstRunningAchievementBoardVM(BaseIdleScreen<T_GAME, T_SAVE> parent)
{
this.parent = parent;
this.texts = parent.getGame().getIdleGameplayExport().getGameDictionary()
Expand All @@ -46,27 +46,27 @@ public FirstLockedAchievementBoardVM(BaseIdleScreen<T_GAME, T_SAVE> parent)
updateData();
}

private void updateData()
public void updateData()
{
AchievementInfoPackage data = parent.getGame().getIdleGameplayExport().getGameplayContext().getAchievementManager().getAchievementInfoPackage();
if (data.getFirstLockedAchievement() != null)
if (data.getFirstRunningAchievement() != null)
{
nameValueLabel.setText(data.getFirstLockedAchievement().getName());
descriptionLabel.setText(data.getFirstLockedAchievement().getDescription());
nameValueLabel.setText(data.getFirstRunningAchievement().getName());
descriptionLabel.setText(data.getFirstRunningAchievement().getDescription());
}
else
{
nameValueLabel.setText("");
descriptionLabel.setText(texts.get(5));
}

countValueLabel.setText(" " + data.getUnLockedSize() + "/" + data.getTotal());
countValueLabel.setText(JavaFeatureForGwt.stringFormat(
"已完成:%s;未解锁:%s",
data.getCompletedSize(),
data.getLockedSize()
));


}

@Override
public void onGameAreaChange(String last, String current) {
updateData();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public class PlayScreenLayoutConst {

public int RESOURCE_AMOUNT_PAIR_NODE_HEIGHT = 25;
public int RESOURCE_AMOUNT_PAIR_NODE_WIDTH = 70;
public int FIRST_LOCKED_ACHIEVEMENT_BOARD_WIDTH = 150;
public int FIRST_LOCKED_ACHIEVEMENT_BOARD_WIDTH = 250;
public int FIRST_LOCKED_ACHIEVEMENT_BOARD_HEIGHT = 150;
public PlayScreenLayoutConst(int gameLogicWidth, int gameLogicHeight) {
this.EXPECTED_DRAW_MIN_X = 0;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,10 @@ public void applyGameplaySaveData(GameplaySaveData gameplaySaveData) {

gameplayContext.getStorageManager().setUnlockedResourceTypes(gameplaySaveData.getUnlockedResourceTypes());
gameplayContext.getStorageManager().setOwnResoueces(gameplaySaveData.getOwnResources());
gameplayContext.getAchievementManager().setUnlockedAchievementIds(gameplaySaveData.getUnlockedAchievementIds());
gameplayContext.getAchievementManager().subApplyGameplaySaveData(
builtinAchievementsLoader.getProviderMap(language),
gameplaySaveData.getAchievementSaveDataMap()
);
}

@Override
Expand All @@ -84,7 +87,7 @@ public void currentSituationToGameplaySaveData(GameplaySaveData gameplaySaveData
);
gameplaySaveData.setUnlockedResourceTypes(gameplayContext.getStorageManager().getUnlockedResourceTypes());
gameplaySaveData.setOwnResources(gameplayContext.getStorageManager().getOwnResoueces());
gameplaySaveData.setUnlockedAchievementIds(gameplayContext.getAchievementManager().getUnlockedAchievementIds());
gameplaySaveData.setAchievementSaveDataMap(gameplayContext.getAchievementManager().getAchievementSaveDataMap());
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,6 @@ public void allLazyInit(
this.getConstructionFactory().lazyInit(this, language, providerMap);
this.getConstructionManager().lazyInit(childGameConfig.getAreaControlableConstructionVMPrototypeIds(),
childGameConfig.getAreaControlableConstructionPrototypeVMPrototypeIds());
this.getAchievementManager().lazyInit(achievementProviderMap, childGameConfig.getAchievementPrototypeIds());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
* @author hundun
* Created on 2022/01/21
*/
public interface IAchievementUnlockCallback {
public interface IAchievementBoardCallback {
void hideAchievementMaskBoard();
void showAchievementMaskBoard(AbstractAchievement prototype);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package hundun.gdxgame.idleshare.gamelib.framework.callback;

import hundun.gdxgame.idleshare.gamelib.framework.model.achievement.AbstractAchievement;
import hundun.gdxgame.idleshare.gamelib.framework.model.manager.AchievementManager.AchievementState;

/**
* @author hundun
* Created on 2022/01/21
*/
public interface IAchievementStateChangeListener {
void onAchievementStateChange(AbstractAchievement achievement, AchievementState state);
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,4 @@ public abstract class ChildGameConfig {
Map<String, List<String>> areaShowEntityByOwnAmountResourceIds;
Map<String, List<String>> areaShowEntityByChangeAmountResourceIds;
Map<String, String> screenIdToFilePathMap;
List<String> achievementPrototypeIds;
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import java.util.Map;
import java.util.Set;

import hundun.gdxgame.idleshare.gamelib.framework.model.manager.AchievementManager.AchievementSaveData;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.NoArgsConstructor;
Expand All @@ -21,5 +22,5 @@ public class GameplaySaveData {
Map<String, Long> ownResources;
Set<String> unlockedResourceTypes;
Map<String, ConstructionSaveData> constructionSaveDataMap;
Set<String> unlockedAchievementIds;
Map<String, AchievementSaveData> achievementSaveDataMap;
}
Original file line number Diff line number Diff line change
@@ -1,21 +1,18 @@
package hundun.gdxgame.idleshare.gamelib.framework.model.achievement;

import hundun.gdxgame.idleshare.gamelib.framework.IdleGameplayContext;
import hundun.gdxgame.idleshare.gamelib.framework.model.resource.ResourcePack;
import hundun.gdxgame.idleshare.gamelib.framework.model.resource.ResourcePair;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;
import java.util.Map;

/**
* @author hundun
* Created on 2021/11/12
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public abstract class AbstractAchievement {
protected IdleGameplayContext gameplayContext;
Expand All @@ -24,15 +21,24 @@ public abstract class AbstractAchievement {
protected String description;
protected String congratulationText;
protected List<ResourcePair> awardResourceMap;
protected String nextAchievementId;

public abstract boolean checkUnlock();
public abstract boolean checkComplete();

public AbstractAchievement(String id, String name, String description, String congratulationText, List<ResourcePair> awardResourceMap) {
public AbstractAchievement(
String id,
String name,
String description,
String congratulationText,
List<ResourcePair> awardResourceMap,
String nextAchievementId
) {
this.id = id;
this.name = name;
this.description = description;
this.congratulationText = congratulationText;
this.awardResourceMap = awardResourceMap;
this.nextAchievementId = nextAchievementId;
}

public void lazyInitDescription(IdleGameplayContext gameplayContext)
Expand Down
Loading

0 comments on commit 1d15e95

Please sign in to comment.