feat(tower_defense): implement first clear rewards

This commit is contained in:
Fishia
2025-12-06 16:05:51 +07:00
committed by Melledy
parent 51f6db9803
commit 5707c1c919
5 changed files with 76 additions and 7 deletions

View File

@@ -139,6 +139,9 @@ public class GameData {
// Activity // Activity
@Getter private static DataTable<ActivityDef> ActivityDataTable = new DataTable<>(); @Getter private static DataTable<ActivityDef> ActivityDataTable = new DataTable<>();
// Tower defense
@Getter private static DataTable<TowerDefenseLevelDef> TowerDefenseLevelDataTable = new DataTable<>();
@Getter private static DataTable<TrialControlDef> TrialControlDataTable = new DataTable<>(); @Getter private static DataTable<TrialControlDef> TrialControlDataTable = new DataTable<>();
@Getter private static DataTable<TrialGroupDef> TrialGroupDataTable = new DataTable<>(); @Getter private static DataTable<TrialGroupDef> TrialGroupDataTable = new DataTable<>();

View File

@@ -0,0 +1,33 @@
package emu.nebula.data.resources;
import emu.nebula.data.BaseDef;
import emu.nebula.data.ResourceType;
import emu.nebula.game.inventory.ItemParamMap;
import lombok.Getter;
@Getter
@ResourceType(name = "TowerDefenseLevel.json")
public class TowerDefenseLevelDef extends BaseDef {
private int Id;
private int Condition2;
private int Condition3;
private int Item1;
private int Qty1;
private int Item2;
private int Qty2;
private transient ItemParamMap rewards;
@Override
public int getId() {
return Id;
}
@Override
public void onLoad() {
// Parse rewards
this.rewards = new ItemParamMap();
this.rewards.add(this.Item1, this.Qty1);
this.rewards.add(this.Item2, this.Qty2);
}
}

View File

@@ -5,9 +5,12 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
import dev.morphia.annotations.Entity; import dev.morphia.annotations.Entity;
import emu.nebula.data.GameData;
import emu.nebula.data.resources.ActivityDef; import emu.nebula.data.resources.ActivityDef;
import emu.nebula.game.activity.ActivityManager; import emu.nebula.game.activity.ActivityManager;
import emu.nebula.game.activity.GameActivity; import emu.nebula.game.activity.GameActivity;
import emu.nebula.game.inventory.ItemParamMap;
import emu.nebula.game.player.PlayerChangeInfo;
import emu.nebula.proto.ActivityDetail.ActivityMsg; import emu.nebula.proto.ActivityDetail.ActivityMsg;
import emu.nebula.proto.Public.ActivityQuest; import emu.nebula.proto.Public.ActivityQuest;
import emu.nebula.proto.Public.ActivityTowerDefenseLevel; import emu.nebula.proto.Public.ActivityTowerDefenseLevel;
@@ -26,10 +29,20 @@ public class TowerDefenseActivity extends GameActivity {
public TowerDefenseActivity(ActivityManager manager, ActivityDef data) { public TowerDefenseActivity(ActivityManager manager, ActivityDef data) {
super(manager, data); super(manager, data);
// fishiatee: Unsure if this is the correct way to do this
this.completedStages = new HashMap<Integer, Integer>(); this.completedStages = new HashMap<Integer, Integer>();
this.completedQuests = new HashMap<Integer, Integer>(); this.completedQuests = new HashMap<Integer, Integer>();
} }
public PlayerChangeInfo claimReward(int level) {
// Initialize change info
var change = new PlayerChangeInfo();
// Get rewards
var rewards = GameData.getTowerDefenseLevelDataTable().get(level).getRewards();
// Add rewards
return getPlayer().getInventory().addItems(rewards, change);
}
// public PlayerChangeInfo claimReward(int groupId) { // public PlayerChangeInfo claimReward(int groupId) {
// // Create change info // // Create change info

View File

@@ -170,7 +170,14 @@ public class HttpServer {
// https://nova-static.stellasora.global/ // https://nova-static.stellasora.global/
getApp().get("/meta/serverlist.html", new MetaServerlistHandler(this)); getApp().get("/meta/serverlist.html", new MetaServerlistHandler(this));
getApp().get("/meta/*.html", new MetaPatchListHandler(this));
/*
fishiatee: Maybe this should be handled better.
For example, if raw meta is detected in say ./web/meta, serve that instead.
Otherwise, detect and serve from custom patchlist definition.
*/
//getApp().get("/meta/*.html", new MetaPatchListHandler(this));
} }
private void addGameServerRoutes() { private void addGameServerRoutes() {

View File

@@ -2,8 +2,10 @@ package emu.nebula.server.handlers;
import emu.nebula.net.NetHandler; import emu.nebula.net.NetHandler;
import emu.nebula.net.NetMsgId; import emu.nebula.net.NetMsgId;
import emu.nebula.proto.ActivityTowerDefenseLevelSettle.ActivityTowerDefenseLevelSettleReq;
import emu.nebula.net.HandlerId; import emu.nebula.net.HandlerId;
import emu.nebula.game.player.PlayerChangeInfo; import emu.nebula.Nebula;
import emu.nebula.game.activity.type.TowerDefenseActivity;
import emu.nebula.net.GameSession; import emu.nebula.net.GameSession;
@HandlerId(NetMsgId.activity_tower_defense_level_settle_req) @HandlerId(NetMsgId.activity_tower_defense_level_settle_req)
@@ -11,12 +13,23 @@ public class HandlerActivityTowerDefenseLevelSettleReq extends NetHandler {
@Override @Override
public byte[] handle(GameSession session, byte[] message) throws Exception { public byte[] handle(GameSession session, byte[] message) throws Exception {
// Initialize change info // Parse request proto
// TODO: Handle this properly var req = ActivityTowerDefenseLevelSettleReq.parseFrom(message);
var changeInfo = new PlayerChangeInfo();
// Get activity
var activity = session.getPlayer().getActivityManager().getActivity(TowerDefenseActivity.class, 102001);
// Claim rewards
var change = activity.claimReward((int)req.getLevelId());
// Update completed stages
activity.getCompletedStages().put(req.getLevelId(), req.getStar());
// Save changes
session.getPlayer().save();
// Encode and send // Encode and send
return session.encodeMsg(NetMsgId.activity_tower_defense_level_settle_succeed_ack, changeInfo.toProto()); return session.encodeMsg(NetMsgId.activity_tower_defense_level_settle_succeed_ack, change.toProto());
} }
} }