cipher-sr/gameserver/src/services/challenge.zig
HuLiNap 78e23046f7 First push: build.zig
First push:   build.zig.zon
	First push:   config.json
	First push:   dispatch/build.zig
	First push:   dispatch/build.zig.zon
	First push:   dispatch/src/authentication.zig
	First push:   dispatch/src/dispatch.zig
	First push:   dispatch/src/hotfix.zig
	First push:   dispatch/src/main.zig
	First push:   gameserver/build.zig
	First push:   gameserver/build.zig.zon
	First push:   gameserver/src/Packet.zig
	First push:   gameserver/src/Session.zig
	First push:   gameserver/src/command.zig
	First push:   gameserver/src/commands/help.zig
	First push:   gameserver/src/commands/refill.zig
	First push:   gameserver/src/commands/sync.zig
	First push:   gameserver/src/commands/tp.zig
	First push:   gameserver/src/commands/unstuck.zig
	First push:   gameserver/src/commands/value.zig
	First push:   gameserver/src/data.zig
	First push:   gameserver/src/handlers.zig
	First push:   gameserver/src/main.zig
	First push:   gameserver/src/manager/battle_mgr.zig
	First push:   gameserver/src/manager/lineup_mgr.zig
	First push:   gameserver/src/manager/multipath_mgr.zig
	First push:   gameserver/src/manager/scene_mgr.zig
	First push:   gameserver/src/network.zig
	First push:   gameserver/src/services/avatar.zig
	First push:   gameserver/src/services/battle.zig
	First push:   gameserver/src/services/challenge.zig
	First push:   gameserver/src/services/chat.zig
	First push:   gameserver/src/services/config.zig
	First push:   gameserver/src/services/events.zig
	First push:   gameserver/src/services/gacha.zig
	First push:   gameserver/src/services/item.zig
	First push:   gameserver/src/services/lineup.zig
	First push:   gameserver/src/services/login.zig
	First push:   gameserver/src/services/mail.zig
	First push:   gameserver/src/services/misc copy.zig
	First push:   gameserver/src/services/misc.zig
	First push:   gameserver/src/services/mission.zig
	First push:   gameserver/src/services/multipath.zig
	First push:   gameserver/src/services/pet.zig
	First push:   gameserver/src/services/profile.zig
	First push:   gameserver/src/services/res_config.zig
	First push:   gameserver/src/services/scene.zig
	First push:   hotfix.json
	First push:   protocol/build.zig
	First push:   protocol/build.zig.zon
	First push:   protocol/src/protocol.pb.zig
	First push:   protocol/src/root.zig
	First push:   resources/ChallengeMazeConfig.json
	First push:   resources/MapEntrance.json
	First push:   resources/MazePlane.json
	First push:   resources/res.json
2025-04-17 16:16:03 +07:00

207 lines
9 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 SceneManager = @import("../manager/scene_mgr.zig").SceneManager;
const ChallengeSceneManager = @import("../manager/scene_mgr.zig").ChallengeSceneManager;
const LineupManager = @import("../manager/lineup_mgr.zig").LineupManager;
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 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(20432, 20432001, 2043201, 1213);
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,
});
try session.send(CmdID.CmdLeaveChallengeScRsp, protocol.LeaveChallengeScRsp{
.retcode = 0,
});
}
//TODO: IMPLEMENT CHALLENGE BUFF AND FIX MENU
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);
const challenge_config = try Config.loadChallengeConfig(allocator, "resources/ChallengeMazeConfig.json");
const entrance_config = try Config.loadMapEntranceConfig(allocator, "resources/MapEntrance.json");
const maze_config = try Config.loadMazePlaneConfig(allocator, "resources/MazePlane.json");
var avatarList = std.ArrayList(u32).init(allocator);
var lineup1 = protocol.LineupInfo.init(allocator);
lineup1.mp = 5;
lineup1.max_mp = 5;
lineup1.extra_lineup_type = protocol.ExtraLineupType.LINEUP_CHALLENGE;
for (req.first_lineup.items, 0..) |avt, idx| {
var list = protocol.LineupAvatar.init(allocator);
try avatarList.append(avt);
list.id = avt;
list.slot = @intCast(idx);
list.satiety = 0;
list.avatar_type = protocol.AvatarType.AVATAR_FORMAL_TYPE;
list.hp = 10000;
list.sp_bar = .{ .sp_cur = 10000, .sp_max = 10000 };
try lineup1.avatar_list.append(list);
}
try rsp.lineup_list.append(lineup1);
var avatarList2 = std.ArrayList(u32).init(allocator);
var lineup2 = protocol.LineupInfo.init(allocator);
lineup2.mp = 5;
lineup2.max_mp = 5;
lineup2.extra_lineup_type = protocol.ExtraLineupType.LINEUP_CHALLENGE_2;
for (req.second_lineup.items, 0..) |avt, idx| {
var list = protocol.LineupAvatar.init(allocator);
try avatarList2.append(avt);
list.id = avt;
list.slot = @intCast(idx);
list.satiety = 0;
list.avatar_type = protocol.AvatarType.AVATAR_FORMAL_TYPE;
list.hp = 10000;
list.sp_bar = .{ .sp_cur = 10000, .sp_max = 10000 };
try lineup2.avatar_list.append(list);
}
try rsp.lineup_list.append(lineup2);
var cur_challenge_info = protocol.CurChallenge.init(allocator);
cur_challenge_info.challenge_id = req.challenge_id;
cur_challenge_info.score_id = if (req.challenge_id > 20000 and req.challenge_id < 30000) 40000 else 0;
cur_challenge_info.score_two = 0;
cur_challenge_info.status = protocol.ChallengeStatus.CHALLENGE_DOING;
cur_challenge_info.extra_lineup_type = if (NodeCheck.challenge_node == 0) protocol.ExtraLineupType.LINEUP_CHALLENGE else protocol.ExtraLineupType.LINEUP_CHALLENGE_2;
var planeID: u32 = 0;
var floorID: u32 = 0;
var entryID: u32 = 0;
var worldID: u32 = 0;
var monsterID: u32 = 0;
var groupID: u32 = 0;
var maze_groupID: u32 = 0;
if (NodeCheck.challenge_node == 0) {
for (challenge_config.challenge_config.items) |challengeConf| {
if (challengeConf.id == req.challenge_id) {
std.debug.print("TRACING CONFIG ID {} WITH CHALLENGE ID {}\n", .{ challengeConf.id, req.challenge_id });
for (entrance_config.map_entrance_config.items) |entrance| {
if (entrance.id == challengeConf.map_entrance_id) {
for (maze_config.maze_plane_config.items) |maze| {
if (contains(&maze.floor_id_list, entrance.floor_id)) {
floorID = entrance.floor_id;
worldID = maze.world_id;
monsterID = challengeConf.npc_monster_id_list1.items[challengeConf.npc_monster_id_list1.items.len - 1];
groupID = challengeConf.maze_group_id1;
maze_groupID = challengeConf.maze_group_id1;
planeID = maze.challenge_plane_id;
entryID = challengeConf.map_entrance_id;
}
}
}
}
}
}
} else {
for (challenge_config.challenge_config.items) |challengeConf| {
if (challengeConf.id == req.challenge_id) {
std.debug.print("TRACING CONFIG ID {} WITH CHALLENGE ID {}\n", .{ challengeConf.id, req.challenge_id });
for (entrance_config.map_entrance_config.items) |entrance| {
if (entrance.id == challengeConf.map_entrance_id2) {
for (maze_config.maze_plane_config.items) |maze| {
if (contains(&maze.floor_id_list, entrance.floor_id)) {
floorID = entrance.floor_id;
worldID = maze.world_id;
monsterID = challengeConf.npc_monster_id_list2.items[challengeConf.npc_monster_id_list2.items.len - 1];
groupID = challengeConf.maze_group_id2;
maze_groupID = challengeConf.maze_group_id2;
planeID = maze.challenge_plane_id;
entryID = challengeConf.map_entrance_id2;
}
}
}
}
}
}
}
var scene_PF_manager = ChallengeSceneManager.init(allocator);
const scene_info = try scene_PF_manager.createScene(
if (NodeCheck.challenge_node == 0) avatarList else avatarList2,
planeID,
floorID,
entryID,
worldID,
monsterID,
groupID,
maze_groupID,
);
rsp.retcode = 0;
rsp.scene = scene_info;
rsp.cur_challenge = cur_challenge_info;
try session.send(CmdID.CmdStartChallengeScRsp, rsp);
std.debug.print("SEND PLANE ID {} FLOOR ID {} ENTRY ID {} GROUP ID {} MAZE GROUP ID {}\n", .{ planeID, floorID, entryID, groupID, maze_groupID });
try session.send(CmdID.CmdEnterSceneByServerScNotify, protocol.EnterSceneByServerScNotify{
.lineup = if (NodeCheck.challenge_node == 0) lineup1 else lineup2,
.reason = protocol.EnterSceneReason.ENTER_SCENE_REASON_DIMENSION_MERGE,
.scene = scene_info,
});
}