feat: tower defense activity

Bare minimum work done.
This commit is contained in:
Fishia
2025-12-05 12:21:04 +07:00
committed by Melledy
parent f44262f427
commit 3df873e385
5 changed files with 137 additions and 0 deletions

View File

@@ -111,6 +111,7 @@ public class ActivityManager extends PlayerManager implements GameDatabaseObject
GameActivity activity = switch (data.getType()) {
case Trial -> new TrialActivity(this, data);
case TowerDefense -> new TowerDefenseActivity(this, data);
default -> null;
};

View File

@@ -20,6 +20,8 @@ public class ActivityModule extends GameContextModule {
this.activities.add(700104);
this.activities.add(700107);
this.activities.add(102001); // Tower defense activity
//this.activities.add(101002);
//this.activities.add(101003);
}

View File

@@ -0,0 +1,95 @@
package emu.nebula.game.activity.type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import dev.morphia.annotations.Entity;
import emu.nebula.data.resources.ActivityDef;
import emu.nebula.game.activity.ActivityManager;
import emu.nebula.game.activity.GameActivity;
import emu.nebula.proto.ActivityDetail.ActivityMsg;
import emu.nebula.proto.Public.ActivityQuest;
import emu.nebula.proto.Public.ActivityTowerDefenseLevel;
import lombok.Getter;
@Getter
@Entity
public class TowerDefenseActivity extends GameActivity {
private Map<Integer, Integer> completedStages;
private Map<Integer, Integer> completedQuests;
@Deprecated // Morphia only
public TowerDefenseActivity() {
}
public TowerDefenseActivity(ActivityManager manager, ActivityDef data) {
super(manager, data);
// fishiatee: Unsure if this is the correct way to do this
this.completedStages = new HashMap<Integer, Integer>();
this.completedQuests = new HashMap<Integer, Integer>();
}
// 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) {
var proto = msg.getMutableTowerDefense();
// Add completed stages
for (int id : this.completedStages.values()) {
// Create proto
var level = ActivityTowerDefenseLevel.newInstance();
// Set proto params
level.setId(id);
level.setStar(this.completedStages.get(id));
// Add to final msg proto
proto.addLevels(level);
}
// Add completed quests
for (int id : this.completedStages.values()) {
// 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);
}
}
}

View File

@@ -0,0 +1,17 @@
package emu.nebula.server.handlers;
import emu.nebula.net.NetHandler;
import emu.nebula.net.NetMsgId;
import emu.nebula.net.HandlerId;
import emu.nebula.net.GameSession;
@HandlerId(NetMsgId.activity_tower_defense_level_apply_req)
public class HandlerActivityTowerDefenseLevelApplyReq extends NetHandler {
@Override
public byte[] handle(GameSession session, byte[] message) throws Exception {
// Encode and send
return session.encodeMsg(NetMsgId.activity_tower_defense_level_apply_succeed_ack);
}
}

View File

@@ -0,0 +1,22 @@
package emu.nebula.server.handlers;
import emu.nebula.net.NetHandler;
import emu.nebula.net.NetMsgId;
import emu.nebula.net.HandlerId;
import emu.nebula.game.player.PlayerChangeInfo;
import emu.nebula.net.GameSession;
@HandlerId(NetMsgId.activity_tower_defense_level_settle_req)
public class HandlerActivityTowerDefenseLevelSettleReq extends NetHandler {
@Override
public byte[] handle(GameSession session, byte[] message) throws Exception {
// Initialize change info
// TODO: Handle this properly
var changeInfo = new PlayerChangeInfo();
// Encode and send
return session.encodeMsg(NetMsgId.activity_tower_defense_level_settle_succeed_ack, changeInfo.toProto());
}
}