diff --git a/src/main/java/emu/nebula/game/tower/StarTowerCase.java b/src/main/java/emu/nebula/game/tower/StarTowerCase.java index 9dc7c35..c646294 100644 --- a/src/main/java/emu/nebula/game/tower/StarTowerCase.java +++ b/src/main/java/emu/nebula/game/tower/StarTowerCase.java @@ -1,5 +1,9 @@ package emu.nebula.game.tower; +import java.util.HashMap; +import java.util.Map; + +import emu.nebula.proto.PublicStarTower.HawkerGoods; import emu.nebula.proto.PublicStarTower.StarTowerRoomCase; import it.unimi.dsi.fastutil.ints.IntArrayList; import it.unimi.dsi.fastutil.ints.IntList; @@ -22,9 +26,15 @@ public class StarTowerCase { private int floorId; private int roomType; + private int eventId; + private int npcId; + // Selector private IntList ids; + // Hawker + private Map goodsList; + public StarTowerCase(CaseType type) { this.type = type; } @@ -49,6 +59,16 @@ public class StarTowerCase { return this.getIds().getInt(index); } + public void addGoods(StarTowerShopGoods goods) { + if (this.goodsList == null) { + this.goodsList = new HashMap<>(); + } + + this.getGoodsList().put(getGoodsList().size() + 1, goods); + } + + // Proto + public StarTowerRoomCase toProto() { var proto = StarTowerRoomCase.newInstance() .setId(this.getId()); @@ -74,6 +94,30 @@ public class StarTowerCase { case PotentialSelect -> { proto.getMutableSelectPotentialCase(); } + case NpcEvent -> { + proto.getMutableSelectOptionsEventCase() + .setEvtId(this.getEventId()) + .setNPCId(this.getNpcId()) + .addAllOptions(this.getIds().toIntArray()); + } + case Hawker -> { + var hawker = proto.getMutableHawkerCase(); + + for (var entry : getGoodsList().entrySet()) { + var id = entry.getKey(); + var goods = entry.getValue(); + + var info = HawkerGoods.newInstance() + .setIdx(goods.getGoodsId()) + .setSid(id) + .setType(goods.getType()) + .setGoodsId(102) // ? + .setPrice(goods.getPrice()) + .setTag(1); + + hawker.addList(info); + } + } default -> { } diff --git a/src/main/java/emu/nebula/game/tower/StarTowerGame.java b/src/main/java/emu/nebula/game/tower/StarTowerGame.java index 1fb55b3..9f95789 100644 --- a/src/main/java/emu/nebula/game/tower/StarTowerGame.java +++ b/src/main/java/emu/nebula/game/tower/StarTowerGame.java @@ -24,6 +24,7 @@ import it.unimi.dsi.fastutil.ints.IntSet; import lombok.Getter; import lombok.SneakyThrows; +import us.hebi.quickbuf.RepeatedMessage; @Getter @Entity(useDiscriminator = false) @@ -58,8 +59,9 @@ public class StarTowerGame { // Case private int lastCaseId = 0; - private int selectorCaseIndex = -1; private int battleCaseIndex = -1; + private int selectorCaseIndex = -1; + private int hawkerCaseIndex = -1; private List cases; // Bag @@ -202,11 +204,19 @@ public class StarTowerGame { return this.getCases().get(this.getSelectorCaseIndex()); } + public StarTowerCase getHawkerCase() { + if (this.getHawkerCaseIndex() < 0 || this.getHawkerCaseIndex() >= this.getCases().size()) { + return null; + } + + return this.getCases().get(this.getHawkerCaseIndex()); + } + public StarTowerCase addCase(StarTowerCase towerCase) { return this.addCase(null, towerCase); } - public StarTowerCase addCase(StarTowerInteractResp rsp, StarTowerCase towerCase) { + public StarTowerCase addCase(RepeatedMessage cases, StarTowerCase towerCase) { // Add to cases list this.getCases().add(towerCase); @@ -214,8 +224,8 @@ public class StarTowerGame { towerCase.setId(++this.lastCaseId); // Set proto - if (rsp != null) { - rsp.getMutableCases().add(towerCase.toProto()); + if (cases != null) { + cases.add(towerCase.toProto()); } // @@ -223,6 +233,8 @@ public class StarTowerGame { this.selectorCaseIndex = this.getCases().size() - 1; } else if (towerCase.getType() == CaseType.Battle) { this.battleCaseIndex = this.getCases().size() - 1; + } else if (towerCase.getType() == CaseType.Hawker) { + this.hawkerCaseIndex = this.getCases().size() - 1; } return towerCase; @@ -351,6 +363,8 @@ public class StarTowerGame { rsp = this.onSelect(req, rsp); } else if (req.hasEnterReq()) { rsp = this.onEnterReq(req, rsp); + } else if (req.hasHawkerReq()) { + rsp = this.onHawkerReq(req, rsp); } // Add any items @@ -377,7 +391,7 @@ public class StarTowerGame { } // Interact events - + @SneakyThrows public StarTowerInteractResp onBattleEnd(StarTowerInteractReq req, StarTowerInteractResp rsp) { var proto = req.getBattleEndReq(); @@ -400,7 +414,7 @@ public class StarTowerGame { var potentialCase = this.createPotentialSelector(charId); // Add case - this.addCase(rsp, potentialCase); + this.addCase(rsp.getMutableCases(), potentialCase); // Add sub note skills var battleCase = this.getBattleCase(); @@ -481,8 +495,9 @@ public class StarTowerGame { } // Clear cases - this.selectorCaseIndex = -1; this.battleCaseIndex = -1; + this.selectorCaseIndex = -1; + this.hawkerCaseIndex = -1; this.lastCaseId = 0; this.cases.clear(); @@ -506,28 +521,38 @@ public class StarTowerGame { var battleCase = new StarTowerCase(CaseType.Battle); battleCase.setSubNoteSkillNum(Utils.randomRange(1, 3)); - this.addCase(battleCase); - room.addCases(battleCase.toProto()); + this.addCase(room.getMutableCases(), battleCase); + } else if (this.roomType == StarTowerRoomType.EventRoom.getValue()) { + + } else if (this.roomType == StarTowerRoomType.ShopRoom.getValue()) { + var hawkerCase = new StarTowerCase(CaseType.Hawker); + + hawkerCase.addGoods(new StarTowerShopGoods(1, 1, 200)); + hawkerCase.addGoods(new StarTowerShopGoods(1, 1, 200)); + hawkerCase.addGoods(new StarTowerShopGoods(1, 1, 200)); + + this.addCase(room.getMutableCases(), hawkerCase); } // Add cases - this.addCase(syncHpCase); - this.addCase(doorCase); - - // Add cases to room - room.addCases(syncHpCase.toProto()); - room.addCases(doorCase.toProto()); + this.addCase(room.getMutableCases(), syncHpCase); + this.addCase(room.getMutableCases(), doorCase); + // Done return rsp; } public StarTowerInteractResp onRecoveryHP(StarTowerInteractReq req, StarTowerInteractResp rsp) { // Add case - this.addCase(rsp, new StarTowerCase(CaseType.RecoveryHP)); + this.addCase(rsp.getMutableCases(), new StarTowerCase(CaseType.RecoveryHP)); return rsp; } + private StarTowerInteractResp onHawkerReq(StarTowerInteractReq req, StarTowerInteractResp rsp) { + return rsp; + } + public StarTowerInteractResp settle(StarTowerInteractResp rsp) { // End game this.getManager().endGame(); diff --git a/src/main/java/emu/nebula/game/tower/StarTowerShopGoods.java b/src/main/java/emu/nebula/game/tower/StarTowerShopGoods.java new file mode 100644 index 0000000..95f67aa --- /dev/null +++ b/src/main/java/emu/nebula/game/tower/StarTowerShopGoods.java @@ -0,0 +1,20 @@ +package emu.nebula.game.tower; + +import dev.morphia.annotations.Entity; +import lombok.Getter; + +@Getter +@Entity(useDiscriminator = false) +public class StarTowerShopGoods { + private int type; + private int goodsId; + private int price; + private boolean sold; + + public StarTowerShopGoods(int type, int goodsId, int price) { + this.type = type; + this.goodsId = goodsId; + this.price = price; + } + +}