216 lines
8.3 KiB
Zig
216 lines
8.3 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 Res_config = @import("res_config.zig");
|
|
const Data = @import("../data.zig");
|
|
const ChallegeStageManager = @import("../manager/battle_mgr.zig").ChallegeStageManager;
|
|
const ChallengeManager = @import("../manager/challenge_mgr.zig").ChallengeManager;
|
|
const SceneManager = @import("../manager/scene_mgr.zig").SceneManager;
|
|
const ChallengeSceneManager = @import("../manager/scene_mgr.zig").ChallengeSceneManager;
|
|
const LineupManager = @import("../manager/lineup_mgr.zig").LineupManager;
|
|
const ChallengeLineupManager = @import("../manager/lineup_mgr.zig").ChallengeLineupManager;
|
|
const NodeCheck = @import("../commands/value.zig");
|
|
|
|
const ArrayList = std.ArrayList;
|
|
const Allocator = std.mem.Allocator;
|
|
const CmdID = protocol.CmdID;
|
|
|
|
pub fn UidGenerator() type {
|
|
return struct {
|
|
current_id: u32,
|
|
|
|
const Self = @This();
|
|
|
|
pub fn init() Self {
|
|
return Self{ .current_id = 100000 };
|
|
}
|
|
|
|
pub fn nextId(self: *Self) u32 {
|
|
self.current_id +%= 1; // Using wrapping addition
|
|
return self.current_id;
|
|
}
|
|
};
|
|
}
|
|
|
|
fn contains(list: *const std.ArrayListAligned(u32, null), value: u32) bool {
|
|
for (list.items) |item| {
|
|
if (item == value) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
pub var on_challenge: bool = false;
|
|
|
|
pub const ChallengeBlessing = ArrayList(u32);
|
|
pub var challenge_blessing: []const u32 = &.{};
|
|
pub var challenge_mode: u32 = 0;
|
|
|
|
pub var challenge_planeID: u32 = 0;
|
|
pub var challenge_floorID: u32 = 0;
|
|
pub var challenge_entryID: u32 = 0;
|
|
pub var challenge_worldID: u32 = 0;
|
|
pub var challenge_monsterID: u32 = 0;
|
|
pub var challenge_eventID: u32 = 0;
|
|
pub var challenge_groupID: u32 = 0;
|
|
pub var challenge_maze_groupID: u32 = 0;
|
|
pub var challenge_stageID: u32 = 0;
|
|
|
|
pub var challengeID: u32 = 0;
|
|
pub var challenge_buffID: u32 = 0;
|
|
|
|
pub const ChallengeAvatarList = ArrayList(u32);
|
|
pub var avatar_list: ChallengeAvatarList = ChallengeAvatarList.init(std.heap.page_allocator);
|
|
|
|
pub fn resetChallengeState() void {
|
|
on_challenge = false;
|
|
challenge_mode = 0;
|
|
challenge_planeID = 0;
|
|
challenge_floorID = 0;
|
|
challenge_entryID = 0;
|
|
challenge_worldID = 0;
|
|
challenge_monsterID = 0;
|
|
challenge_eventID = 0;
|
|
challenge_groupID = 0;
|
|
challenge_maze_groupID = 0;
|
|
challenge_stageID = 0;
|
|
challengeID = 0;
|
|
challenge_buffID = 0;
|
|
challenge_blessing = &.{};
|
|
_ = avatar_list.clearRetainingCapacity();
|
|
}
|
|
|
|
pub fn onGetChallenge(session: *Session, _: *const Packet, allocator: Allocator) !void {
|
|
const challenge_config = try Config.loadChallengeConfig(allocator, "resources/ChallengeMazeConfig.json");
|
|
var rsp = protocol.GetChallengeScRsp.init(allocator);
|
|
|
|
rsp.retcode = 0;
|
|
for (challenge_config.challenge_config.items) |ids| {
|
|
var challenge = protocol.Challenge.init(allocator);
|
|
challenge.challenge_id = ids.id;
|
|
challenge.star = 1;
|
|
if (ids.id > 20000 and ids.id < 30000) {
|
|
challenge.score_id = 40000;
|
|
challenge.score_two = 40000;
|
|
}
|
|
try rsp.challenge_list.append(challenge);
|
|
}
|
|
|
|
try session.send(CmdID.CmdGetChallengeScRsp, rsp);
|
|
}
|
|
pub fn onGetChallengeGroupStatistics(session: *Session, packet: *const Packet, allocator: Allocator) !void {
|
|
const req = try packet.getProto(protocol.GetChallengeGroupStatisticsCsReq, allocator);
|
|
var rsp = protocol.GetChallengeGroupStatisticsScRsp.init(allocator);
|
|
rsp.retcode = 0;
|
|
rsp.group_id = req.group_id;
|
|
try session.send(CmdID.CmdGetChallengeGroupStatisticsScRsp, rsp);
|
|
}
|
|
pub fn onLeaveChallenge(session: *Session, _: *const Packet, allocator: Allocator) !void {
|
|
var lineup_mgr = LineupManager.init(allocator);
|
|
const lineup = try lineup_mgr.createLineup();
|
|
var scene_manager = SceneManager.init(allocator);
|
|
const scene_info = try scene_manager.createScene(20422, 20422001, 2042201, 1025);
|
|
try session.send(CmdID.CmdQuitBattleScNotify, protocol.QuitBattleScNotify{});
|
|
try session.send(CmdID.CmdEnterSceneByServerScNotify, protocol.EnterSceneByServerScNotify{
|
|
.reason = protocol.EnterSceneReason.ENTER_SCENE_REASON_NONE,
|
|
.lineup = lineup,
|
|
.scene = scene_info,
|
|
});
|
|
resetChallengeState();
|
|
challenge_mode = 0;
|
|
try session.send(CmdID.CmdLeaveChallengeScRsp, protocol.LeaveChallengeScRsp{
|
|
.retcode = 0,
|
|
});
|
|
}
|
|
pub fn onGetCurChallengeScRsp(session: *Session, _: *const Packet, allocator: Allocator) !void {
|
|
var rsp = protocol.GetCurChallengeScRsp.init(allocator);
|
|
var lineup_manager = ChallengeLineupManager.init(allocator);
|
|
const lineup_info = try lineup_manager.createLineup(avatar_list);
|
|
var challenge_manager = ChallengeManager.init(allocator);
|
|
const cur_challenge_info = try challenge_manager.createChallenge(
|
|
challengeID,
|
|
challenge_buffID,
|
|
);
|
|
rsp.retcode = 0;
|
|
if (on_challenge == true) {
|
|
rsp.cur_challenge = cur_challenge_info;
|
|
try rsp.lineup_list.append(lineup_info);
|
|
|
|
std.debug.print("CURRENT CHALLENGE STAGE ID:{}\n", .{challenge_stageID});
|
|
std.debug.print("CURRENT CHALLENGE LINEUP AVATAR ID:{}\n", .{avatar_list});
|
|
std.debug.print("CURRENT CHALLENGE MONSTER ID:{}\n", .{challenge_monsterID});
|
|
if (challenge_mode == 0) {
|
|
std.debug.print("CURRENT CHALLENGE: {} MOC\n", .{challenge_mode});
|
|
} else if (challenge_mode == 1) {
|
|
std.debug.print("CURRENT CHALLENGE: {} PF\n", .{challenge_mode});
|
|
std.debug.print("CURRENT CHALLENGE STAGE BLESSING ID:{}, SELECTED BLESSING ID:{}\n", .{ challenge_blessing[0], challenge_blessing[1] });
|
|
} else {
|
|
std.debug.print("CURRENT CHALLENGE: {} AS\n", .{challenge_mode});
|
|
std.debug.print("CURRENT CHALLENGE STAGE BLESSING ID:{}, SELECTED BLESSING ID:{}\n", .{ challenge_blessing[0], challenge_blessing[1] });
|
|
}
|
|
} else {
|
|
std.debug.print("CURRENT ON CHALLENGE STATE: {}\n", .{on_challenge});
|
|
}
|
|
|
|
try session.send(CmdID.CmdGetCurChallengeScRsp, rsp);
|
|
}
|
|
pub fn onStartChallenge(session: *Session, packet: *const Packet, allocator: Allocator) !void {
|
|
const req = try packet.getProto(protocol.StartChallengeCsReq, allocator);
|
|
var rsp = protocol.StartChallengeScRsp.init(allocator);
|
|
|
|
challengeID = req.challenge_id;
|
|
|
|
if (NodeCheck.challenge_node == 0) {
|
|
for (req.first_lineup.items) |id| {
|
|
try avatar_list.append(id);
|
|
}
|
|
if (challengeID > 20000 and challengeID < 30000)
|
|
challenge_buffID = req.stage_info.?.KFELKJLDKEH.?.story_info.buff_one;
|
|
if (challengeID > 30000)
|
|
challenge_buffID = req.stage_info.?.KFELKJLDKEH.?.boss_info.buff_one;
|
|
} else {
|
|
for (req.second_lineup.items) |id| {
|
|
try avatar_list.append(id);
|
|
}
|
|
if (challengeID > 20000 and challengeID < 30000)
|
|
challenge_buffID = req.stage_info.?.KFELKJLDKEH.?.story_info.buff_two;
|
|
if (challengeID > 30000)
|
|
challenge_buffID = req.stage_info.?.KFELKJLDKEH.?.boss_info.buff_two;
|
|
}
|
|
var lineup_manager = ChallengeLineupManager.init(allocator);
|
|
const lineup_info = try lineup_manager.createLineup(avatar_list);
|
|
|
|
var challenge_manager = ChallengeManager.init(allocator);
|
|
const cur_challenge_info = try challenge_manager.createChallenge(
|
|
challengeID,
|
|
challenge_buffID,
|
|
);
|
|
var scene_challenge_manager = ChallengeSceneManager.init(allocator);
|
|
const scene_info = try scene_challenge_manager.createScene(
|
|
avatar_list,
|
|
challenge_planeID,
|
|
challenge_floorID,
|
|
challenge_entryID,
|
|
challenge_worldID,
|
|
challenge_monsterID,
|
|
challenge_eventID,
|
|
challenge_groupID,
|
|
challenge_maze_groupID,
|
|
);
|
|
rsp.retcode = 0;
|
|
rsp.scene = scene_info;
|
|
rsp.cur_challenge = cur_challenge_info;
|
|
try rsp.lineup_list.append(lineup_info);
|
|
|
|
on_challenge = true;
|
|
try session.send(CmdID.CmdStartChallengeScRsp, rsp);
|
|
std.debug.print("SEND PLANE ID {} FLOOR ID {} ENTRY ID {} GROUP ID {} MAZE GROUP ID {}\n", .{
|
|
challenge_planeID,
|
|
challenge_floorID,
|
|
challenge_entryID,
|
|
challenge_groupID,
|
|
challenge_maze_groupID,
|
|
});
|
|
}
|