92 lines
3.7 KiB
Zig
92 lines
3.7 KiB
Zig
const std = @import("std");
|
|
const protocol = @import("protocol");
|
|
const Session = @import("../Session.zig");
|
|
const Packet = @import("../Packet.zig");
|
|
const Config = @import("config.zig");
|
|
const Data = @import("../data.zig");
|
|
const LineupManager = @import("../manager/lineup_mgr.zig").LineupManager;
|
|
const Sync = @import("../commands/sync.zig");
|
|
const ArrayList = std.ArrayList;
|
|
const Allocator = std.mem.Allocator;
|
|
const CmdID = protocol.CmdID;
|
|
|
|
pub fn onGetBag(session: *Session, _: *const Packet, allocator: Allocator) !void {
|
|
const config = try Config.loadGameConfig(allocator, "config.json");
|
|
var generator = UidGenerator().init();
|
|
// fake item inventory
|
|
// TODO: make real one
|
|
var rsp = protocol.GetBagScRsp.init(allocator);
|
|
rsp.equipment_list = ArrayList(protocol.Equipment).init(allocator);
|
|
rsp.relic_list = ArrayList(protocol.Relic).init(allocator);
|
|
|
|
for (Data.ItemList) |tid| {
|
|
try rsp.material_list.append(.{ .tid = tid, .Num = 100 });
|
|
}
|
|
|
|
for (config.avatar_config.items) |avatarConf| {
|
|
// lc
|
|
const lc = protocol.Equipment{
|
|
.unique_id = generator.nextId(),
|
|
.tid = avatarConf.lightcone.id, // id
|
|
.is_protected = true, // lock
|
|
.level = avatarConf.lightcone.level,
|
|
.rank = avatarConf.lightcone.rank,
|
|
.promotion = avatarConf.lightcone.promotion,
|
|
.equip_avatar_id = avatarConf.id, // base avatar id
|
|
};
|
|
try rsp.equipment_list.append(lc);
|
|
|
|
// relics
|
|
for (avatarConf.relics.items) |input| {
|
|
var r = protocol.Relic{
|
|
.tid = input.id, // id
|
|
.main_affix_id = input.main_affix_id,
|
|
.unique_id = generator.nextId(),
|
|
.exp = 0,
|
|
.equip_avatar_id = avatarConf.id, // base avatar id
|
|
.is_protected = true, // lock
|
|
.level = input.level,
|
|
.sub_affix_list = ArrayList(protocol.RelicAffix).init(allocator),
|
|
.reforge_sub_affix_list = ArrayList(protocol.RelicAffix).init(allocator),
|
|
};
|
|
try r.sub_affix_list.append(protocol.RelicAffix{ .affix_id = input.stat1, .cnt = input.cnt1, .step = input.step1 });
|
|
try r.sub_affix_list.append(protocol.RelicAffix{ .affix_id = input.stat2, .cnt = input.cnt2, .step = input.step2 });
|
|
try r.sub_affix_list.append(protocol.RelicAffix{ .affix_id = input.stat3, .cnt = input.cnt3, .step = input.step3 });
|
|
try r.sub_affix_list.append(protocol.RelicAffix{ .affix_id = input.stat4, .cnt = input.cnt4, .step = input.step4 });
|
|
try rsp.relic_list.append(r);
|
|
}
|
|
}
|
|
try session.send(CmdID.CmdGetBagScRsp, rsp);
|
|
}
|
|
pub fn onUseItem(session: *Session, packet: *const Packet, allocator: Allocator) !void {
|
|
const req = try packet.getProto(protocol.UseItemCsReq, allocator);
|
|
var rsp = protocol.UseItemScRsp.init(allocator);
|
|
rsp.use_item_id = req.use_item_id;
|
|
rsp.use_item_count = req.use_item_count;
|
|
rsp.retcode = 0;
|
|
var sync = protocol.SyncLineupNotify.init(allocator);
|
|
var lineup_mgr = LineupManager.init(allocator);
|
|
const lineup = try lineup_mgr.createLineup();
|
|
sync.Lineup = lineup;
|
|
try session.send(CmdID.CmdSyncLineupNotify, sync);
|
|
try session.send(CmdID.CmdUseItemScRsp, rsp);
|
|
}
|
|
|
|
pub fn UidGenerator() type {
|
|
return struct {
|
|
current_id: u32,
|
|
|
|
const Self = @This();
|
|
|
|
pub fn init() Self {
|
|
return Self{ .current_id = 0 };
|
|
}
|
|
pub fn curId(self: *const Self) u32 {
|
|
return self.current_id;
|
|
}
|
|
pub fn nextId(self: *Self) u32 {
|
|
self.current_id +%= 1; // Using wrapping addition
|
|
return self.current_id;
|
|
}
|
|
};
|
|
}
|