Reimplement gacha (#32)

* Fix some grammar warning

* Reimplement gacha

* Update GachaResult#toSpinResp declaration

---------

Co-authored-by: Yostarcc <lubenwei7758258@gmail.com>
This commit is contained in:
YostarccandYostarcc authored and GitHub committed 2026-05-05 21:49:21 -07:00
1 parent c285c878f1
commit 1316654c15
32 files changed
+1992 -450

No files matched your search

@@ -1,14 +1,13 @@
package emu.nebula.server.handlers;
import emu.nebula.Nebula;
import emu.nebula.data.GameData;
import emu.nebula.game.gacha.GachaMode;
import emu.nebula.net.GameSession;
import emu.nebula.net.HandlerId;
import emu.nebula.net.NetHandler;
import emu.nebula.net.NetMsgId;
import emu.nebula.net.HandlerId;
import emu.nebula.Nebula;
import emu.nebula.net.GameSession;
import emu.nebula.proto.GachaSpin.GachaCard;
import emu.nebula.proto.GachaSpin.GachaSpinReq;
import emu.nebula.proto.GachaSpin.GachaSpinResp;
import emu.nebula.proto.Public.ItemTpl;
@HandlerId(NetMsgId.gacha_spin_req)
public class HandlerGachaSpinReq extends NetHandler {
@@ -17,34 +16,24 @@ public class HandlerGachaSpinReq extends NetHandler {
public byte[] handle(GameSession session, byte[] message) throws Exception {
// Parse request
var req = GachaSpinReq.parseFrom(message);
Integer amount = GachaMode.getAmountByMode(req.getMode());
if (amount == null) {
return session.encodeMsg(NetMsgId.gacha_spin_failed_ack);
}
// Do gacha
var result = Nebula.getGameContext().getGachaModule().spin(
session.getPlayer(),
req.getId(),
req.getMode()
amount
);
if (result == null) {
return session.encodeMsg(NetMsgId.gacha_spin_failed_ack);
}
// Build response
var rsp = GachaSpinResp.newInstance()
.setTime(Nebula.getCurrentServerTime())
.setAMissTimes(result.getInfo().getMissTimesA())
.setAupMissTimes(result.getInfo().getMissTimesA())
.setTotalTimes(result.getInfo().getTotal())
.setGachaTotalTimes(result.getInfo().getTotal())
.setAupGuaranteeTimes(result.getInfo().isUsedGuarantee() ? 0 : 1)
.setChange(result.getChange().toProto());
for (int id : result.getCards()) {
var card = GachaCard.newInstance()
.setCard(ItemTpl.newInstance().setTid(id).setQty(1));
rsp.addCards(card);
}
var gachaData = GameData.getGachaDataTable().get(req.getId());
var rsp = result.toSpinResp(gachaData);
// Encode and send response
return session.encodeMsg(NetMsgId.gacha_spin_succeed_ack, rsp);