feat: properly handle level completion

This commit is contained in:
Fishia
2026-03-21 02:31:29 -07:00
committed by Melledy
parent d80fb0f374
commit 7bb824c009
2 changed files with 63 additions and 43 deletions
@@ -1,25 +1,28 @@
package emu.nebula.game.activity.type;
import java.util.HashMap;
import java.util.Map;
import dev.morphia.annotations.Entity;
import emu.nebula.data.GameData;
import emu.nebula.data.resources.ActivityDef;
import emu.nebula.game.activity.ActivityManager;
import emu.nebula.game.activity.GameActivity;
import emu.nebula.game.player.PlayerChangeInfo;
import emu.nebula.proto.ActivityDetail.ActivityMsg;
import emu.nebula.proto.Public.ActivityPenguinCardLevel;
import emu.nebula.proto.Public.ActivityQuest;
import emu.nebula.proto.Public.ActivityTowerDefenseLevel;
import it.unimi.dsi.fastutil.ints.Int2IntMap;
import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import lombok.Getter;
import lombok.Setter;
@Getter
@Entity
public class PenguinCardActivity extends GameActivity {
private Int2IntMap completedStages;
private Int2IntMap completedQuests;
private Map<Integer, LevelStats> completedLevels = new Int2ObjectOpenHashMap<>();
private Int2IntMap completedQuests = new Int2IntOpenHashMap();
@Deprecated // Morphia only
public PenguinCardActivity() {
@@ -28,50 +31,57 @@ public class PenguinCardActivity extends GameActivity {
public PenguinCardActivity(ActivityManager manager, ActivityDef data) {
super(manager, data);
this.completedStages = new Int2IntOpenHashMap();
this.completedQuests = new Int2IntOpenHashMap();
}
public PlayerChangeInfo claimReward(int level) {
// Get rewards
var rewards = GameData.getTowerDefenseLevelDataTable().get(level).getRewards();
// Add rewards
return getPlayer().getInventory().addItems(rewards);
}
// public PlayerChangeInfo claimReward(int groupId) {
// // Create change info
// var change = new PlayerChangeInfo();
// // Make sure we haven't completed this group yet
// if (this.getCompleted().contains(groupId)) {
// return change;
// }
// // Get trial control
// var control = GameData.getTrialControlDataTable().get(this.getId());
// if (control == null) return change;
// // Get group
// var group = GameData.getTrialGroupDataTable().get(groupId);
// if (group == null) return change;
// // Set as completed
// this.getCompleted().add(groupId);
// // Save to database
// this.save();
// // Add rewards
// return getPlayer().getInventory().addItems(group.getRewards(), change);
// }
// Proto
@Override
public void encodeActivityMsg(ActivityMsg msg) {
msg.getMutablePenguinCard();
var proto = msg.getMutablePenguinCard();
// Add completed levels
for (int id : this.completedLevels.keySet()) {
// Get level completion data
var data = this.completedLevels.get(id);
// Create proto
var level = ActivityPenguinCardLevel.newInstance();
// Set proto params
level.setId(id);
level.setScore(data.getScore());
level.setStar(data.getStars());
// Add to final msg proto
proto.addLevels(level);
}
// Add completed quests
for (int id : this.completedQuests.keySet()) {
// Create proto
var quest = ActivityQuest.newInstance();
// Set proto params
quest.setActivityId(this.getId());
quest.setId(id);
quest.setStatus(2); // TODO: properly handle event quests
// Add to final msg proto
proto.addQuests(quest);
}
}
@Getter
@Setter
@Entity(useDiscriminator = false)
public static class LevelStats {
private int stars;
private int score;
@Deprecated
public LevelStats() {
}
}
}
@@ -3,7 +3,10 @@ package emu.nebula.server.handlers;
import emu.nebula.net.NetHandler;
import emu.nebula.net.NetMsgId;
import emu.nebula.proto.ActivityPenguinCardLevelSettle.ActivityPenguinCardSettleReq;
import it.unimi.dsi.fastutil.ints.IntList;
import emu.nebula.net.HandlerId;
import emu.nebula.game.activity.type.PenguinCardActivity;
import emu.nebula.game.activity.type.PenguinCardActivity.LevelStats;
import emu.nebula.net.GameSession;
@HandlerId(NetMsgId.activity_penguin_card_level_settle_req)
@@ -15,6 +18,13 @@ public class HandlerActivityPenguinCardSettleReq extends NetHandler {
var req = ActivityPenguinCardSettleReq.parseFrom(message);
// Get activity
var activity = session.getPlayer().getActivityManager().getActivity(PenguinCardActivity.class, 800001);
// Update completed levels
LevelStats data = new LevelStats();
data.setScore(req.getScore());
data.setStars(req.getStar());
activity.getCompletedLevels().put(req.getLevelId(), data);
// Encode and send
return session.encodeMsg(NetMsgId.activity_penguin_card_level_settle_succeed_ack);