Compare commits

...

3 commits
1.0.0 ... main

Author SHA1 Message Date
724e13fa38 Merge branch 'main' of https://git.xeondev.com/castorice-sr/cipher-sr 2025-04-21 16:59:33 +07:00
56085b79df update support v3: config.json
update support v3:   dispatch/src/dispatch.zig
	update support v3:   gameserver/src/data.zig
	update support v3:   gameserver/src/handlers.zig
	update support v3:   gameserver/src/manager/battle_mgr.zig
	update support v3:   gameserver/src/manager/lineup_mgr.zig
	update support v3:   gameserver/src/manager/scene_mgr.zig
	update support v3:   gameserver/src/services/avatar.zig
	update support v3:   gameserver/src/services/battle.zig
	update support v3:   gameserver/src/services/challenge.zig
	update support v3:   gameserver/src/services/config.zig
	update support v3:   gameserver/src/services/events.zig
	update support v3:   gameserver/src/services/lineup.zig
	update support v3:   gameserver/src/services/login.zig
	update support v3:   gameserver/src/services/mail.zig
	update support v3:   gameserver/src/services/mission.zig
	update support v3:   gameserver/src/services/profile.zig
	update support v3:   gameserver/src/services/scene.zig
	update support v3:   hotfix.json
	update support v3:   protocol/build.zig.zon
	update support v3:   resources/ActivityConfig.json
	update support v3:   resources/AvatarPlayerIcon.json
	update support v3:   resources/ChallengeMazeConfig.json
	update support v3:   resources/MainMission.json
	update support v3:   resources/StageConfig.json
	update support v3:   resources/TutorialData.json
	update support v3:   resources/TutorialGuideGroup.json
	update support v3:   resources/res.json
2025-04-21 16:57:34 +07:00
681207e2cb :Đ delete duplicate file 2025-04-17 17:09:22 +00:00
29 changed files with 377155 additions and 492 deletions

View file

@ -1,26 +1,26 @@
{ {
"avatar_config": [ "avatar_config": [
{ {
"name": "Cipher", "name": "Acheron",
"id": 1406, "id": 1308,
"hp": 100, "hp": 100,
"sp": 50, "sp": 0,
"level": 80, "level": 80,
"promotion": 6, "promotion": 6,
"rank": 6, "rank": 2,
"lightcone": { "lightcone": {
"id": 23043, "id": 23024,
"rank": 5, "rank": 1,
"level": 80, "level": 80,
"promotion": 6 "promotion": 6
}, },
"relics": [ "relics": [
"61261,15,1,4,8:1:1,3:4:4,7:2:2,4:2:2", "61171,15,1,4,3:2:2,4:1:2,8:2:3,9:3:1",
"61262,15,1,4,10:1:1,1:3:3,9:4:4,8:1:1", "61172,15,1,4,1:2:4,5:2:4,8:2:2,9:3:1",
"61263,15,5,4,2:3:3,4:2:2,12:2:2,6:2:2", "61173,15,5,4,4:2:0,5:3:2,8:3:5,10:1:1",
"61264,15,4,4,6:2:2,2:1:1,1:4:4,5:2:2", "61174,15,2,4,2:2:2,8:3:5,9:2:2,10:1:1",
"63145,15,9,4,9:1:1,3:2:2,7:4:4,5:2:2", "63145,15,7,4,3:3:5,4:1:2,5:1:1,8:3:4",
"63146,15,4,4,1:2:2,3:3:3,4:2:2,2:2:2" "63146,15,4,4,3:2:1,9:4:4,10:1:1,11:1:1"
], ],
"use_technique": true "use_technique": true
}, },
@ -31,84 +31,79 @@
"sp": 50, "sp": 50,
"level": 80, "level": 80,
"promotion": 6, "promotion": 6,
"rank": 6, "rank": 0,
"lightcone": { "lightcone": {
"id": 23042, "id": 23042,
"rank": 5, "rank": 1,
"level": 80, "level": 80,
"promotion": 6 "promotion": 6
}, },
"relics": [ "relics": [
"61251,15,1,4,6:1:1,11:2:2,5:2:2,2:4:4", "61251,15,1,4,5:1:1,6:3:3,7:3:3,12:1:1",
"61252,15,1,4,5:3:3,4:1:1,7:2:2,10:3:3", "61252,15,1,4,7:3:3,10:3:3,11:2:2,12:1:1",
"61253,15,5,4,3:2:2,11:2:2,10:3:3,5:2:2", "61253,15,6,4,5:1:1,6:3:5,7:2:4,12:3:4",
"61254,15,4,4,11:3:3,9:3:3,12:1:1,4:2:2", "61254,15,4,4,4:2:0,9:2:2,11:2:4,10:3:0",
"63205,15,1,4,3:1:1,8:4:4,9:2:2,2:2:2", "63205,15,8,4,2:2:3,7:3:1,8:2:1,10:2:4",
"63206,15,2,4,6:3:3,8:3:3,11:1:1,3:2:2" "63206,15,3,4,3:3:2,7:2:1,9:3:4,11:1:1"
], ],
"use_technique": true "use_technique": true
}, },
{ {
"name": "Trailblazer", "name": "Cipher",
"id": 8008, "id": 1406,
"hp": 100, "hp": 100,
"sp": 50, "sp": 50,
"level": 80, "level": 80,
"promotion": 6, "promotion": 6,
"rank": 6, "rank": 0,
"lightcone": { "lightcone": {
"id": 23042, "id": 23043,
"rank": 5, "rank": 1,
"level": 80, "level": 80,
"promotion": 6 "promotion": 6
}, },
"relics": [ "relics": [
"61261,15,1,4,12:3:3,11:2:2,8:3:3,2:1:1", "61171,15,1,4,7:2:2,5:2:3,8:1:2,9:3:2",
"61262,15,1,4,3:3:3,8:2:2,6:2:2,1:2:2", "61172,15,1,4,5:2:3,8:2:2,9:2:2,12:2:1",
"61263,15,5,4,12:1:1,5:2:2,7:3:3,4:3:3", "61173,15,5,4,8:3:3,7:2:2,5:3:0,2:1:1",
"61264,15,4,4,6:1:1,9:3:3,2:3:3,1:2:2", "61174,15,4,4,3:2:3,8:2:3,9:2:2,10:2:1",
"63145,15,6,4,7:4:4,8:1:1,3:2:2,12:2:2", "63145,15,9,4,3:2:2,5:2:2,8:2:3,9:2:3",
"63146,15,2,4,8:2:2,6:3:3,10:3:3,1:1:1" "63146,15,4,4,1:2:3,6:1:2,8:1:0,9:4:2"
], ],
"use_technique": true "use_technique": false
}, },
{ {
"name": "Acheron", "name": "Tribbie",
"id": 1308, "id": 1403,
"hp": 100, "hp": 100,
"sp": 50, "sp": 0,
"level": 80, "level": 80,
"promotion": 6, "promotion": 6,
"rank": 6, "rank": 0,
"lightcone": { "lightcone": {
"id": 23024, "id": 23038,
"rank": 5, "rank": 1,
"level": 80, "level": 80,
"promotion": 6 "promotion": 6
}, },
"relics": [ "relics": [
"61171,15,1,4,9:2:2,12:2:2,8:3:3,6:2:2", "61241,15,1,4,8:2:1,9:2:4,11:2:2,12:2:2",
"61172,15,1,4,8:4:4,4:3:3,5:1:1,6:1:1", "61242,15,1,4,3:1:0,8:3:3,9:2:1,12:2:3",
"61173,15,5,4,3:1:1,12:3:3,11:3:3,7:2:2", "61243,15,5,4,3:2:4,8:3:2,10:1:0,11:2:3",
"61174,15,4,4,5:1:1,11:2:2,4:4:4,6:2:2", "61244,15,1,4,5:2:2,8:2:3,9:2:1,12:2:4",
"63145,15,7,4,9:2:2,4:1:1,6:2:2,2:4:4", "63195,15,1,4,1:2:4,5:1:1,8:4:4,9:1:1",
"63146,15,4,4,4:2:2,7:3:3,1:2:2,2:2:2" "63196,15,3,4,7:2:1,8:4:7,9:2:1,10:1:1"
], ],
"use_technique": true "use_technique": true
} }
], ],
"battle_config": { "battle_config": {
"battle_id": 1, "battle_id": 1,
"stage_id": 30114122, "stage_id": 201012311,
"cycle_count": 30, "cycle_count": 30,
"monster_wave": [ "monster_wave": [
[ [
4033010, 4015011
4033030,
4032030
],
[
2034010
] ]
], ],
"monster_level": 95, "monster_level": 95,

View file

@ -9,8 +9,6 @@ const CNPROD_HOST = "prod-gf-cn-dp01.bhsr.com";
const CNBETA_HOST = "beta-release01-cn.bhsr.com"; const CNBETA_HOST = "beta-release01-cn.bhsr.com";
const OSPROD_HOST = "prod-official-asia-dp01.starrails.com"; const OSPROD_HOST = "prod-official-asia-dp01.starrails.com";
const OSBETA_HOST = "beta-release01-asia.starrails.com"; const OSBETA_HOST = "beta-release01-asia.starrails.com";
const OSCE_HOST = "alb-ftpc0bk5jk0c9b3go4.us-east-1.alb.aliyuncs.com";
const CNCE_HOST = "alb-xvofr71l6rrvwgcupw.cn-shanghai.alb.aliyuncs.com";
pub fn onQueryDispatch(_: *httpz.Request, res: *httpz.Response) !void { pub fn onQueryDispatch(_: *httpz.Request, res: *httpz.Response) !void {
std.log.debug("onQueryDispatch", .{}); std.log.debug("onQueryDispatch", .{});
@ -45,16 +43,8 @@ pub fn onQueryGateway(req: *httpz.Request, res: *httpz.Response) !void {
const dispatch_seed = query.get("dispatch_seed") orelse ""; const dispatch_seed = query.get("dispatch_seed") orelse "";
std.log.info("Get DispatchSeed >> {s}", .{dispatch_seed}); std.log.info("Get DispatchSeed >> {s}", .{dispatch_seed});
const host = selectHost(version); const host = selectHost(version);
var gatewayUrl: []const u8 = undefined; const gatewayUrl = constructUrl(host, version, dispatch_seed);
//Check if the client is CE version
if (std.mem.startsWith(u8, version, "OSCE") or std.mem.startsWith(u8, version, "CNCE")) {
gatewayUrl = constructCEUrl(host, version, dispatch_seed);
std.log.info("Constructed CE Gateway URL >> {s}", .{gatewayUrl});
} else {
gatewayUrl = constructUrl(host, version, dispatch_seed);
std.log.info("Constructed Gateway URL >> {s}", .{gatewayUrl}); std.log.info("Constructed Gateway URL >> {s}", .{gatewayUrl});
}
const hotfix = try hotfixInfo.Parser(res.arena, "hotfix.json", version); const hotfix = try hotfixInfo.Parser(res.arena, "hotfix.json", version);
var assetBundleUrl: []const u8 = undefined; var assetBundleUrl: []const u8 = undefined;
@ -100,46 +90,19 @@ pub fn onQueryGateway(req: *httpz.Request, res: *httpz.Response) !void {
//std.log.info("\x1b[33;1mProtobuf Message >> {}\x1b[0m", .{gateserver_proto}); //std.log.info("\x1b[33;1mProtobuf Message >> {}\x1b[0m", .{gateserver_proto});
assetBundleUrl = hotfix.assetBundleUrl; assetBundleUrl = hotfix.assetBundleUrl;
//Check if the client is CE version
if (std.mem.startsWith(u8, version, "OSCE") or std.mem.startsWith(u8, version, "CNCE")) {
exResourceUrl = "";
} else {
exResourceUrl = hotfix.exResourceUrl; exResourceUrl = hotfix.exResourceUrl;
}
luaUrl = hotfix.luaUrl; luaUrl = hotfix.luaUrl;
iFixUrl = hotfix.iFixUrl; iFixUrl = hotfix.iFixUrl;
if (assetBundleUrl.len == 0 or exResourceUrl.len == 0 or luaUrl.len == 0 or iFixUrl.len == 0) { if (assetBundleUrl.len == 0 or exResourceUrl.len == 0 or luaUrl.len == 0 or iFixUrl.len == 0) {
assetBundleUrl = gateserver_proto.asset_bundle_url.Owned.str; assetBundleUrl = gateserver_proto.asset_bundle_url.Owned.str;
//Check if the client is CE version
if (std.mem.startsWith(u8, version, "OSCE") or std.mem.startsWith(u8, version, "CNCE")) {
exResourceUrl = "";
} else {
exResourceUrl = gateserver_proto.ex_resource_url.Owned.str; exResourceUrl = gateserver_proto.ex_resource_url.Owned.str;
}
luaUrl = gateserver_proto.lua_url.Owned.str;
iFixUrl = gateserver_proto.ifix_url.Owned.str;
try hotfixInfo.putValue(version, assetBundleUrl, exResourceUrl, luaUrl, iFixUrl);
} else {
// Check if exResourceUrl has changed
const latestExResourceUrl = gateserver_proto.ex_resource_url.Owned.str;
if (!std.mem.eql(u8, exResourceUrl, latestExResourceUrl)) {
std.log.info("exResourceUrl changed from '{s}' to '{s}'", .{ exResourceUrl, latestExResourceUrl });
assetBundleUrl = gateserver_proto.asset_bundle_url.Owned.str;
//Check if the client is CE version
if (std.mem.startsWith(u8, version, "OSCE") or std.mem.startsWith(u8, version, "CNCE")) {
exResourceUrl = "";
} else {
exResourceUrl = latestExResourceUrl;
}
luaUrl = gateserver_proto.lua_url.Owned.str; luaUrl = gateserver_proto.lua_url.Owned.str;
iFixUrl = gateserver_proto.ifix_url.Owned.str; iFixUrl = gateserver_proto.ifix_url.Owned.str;
try hotfixInfo.putValue(version, assetBundleUrl, exResourceUrl, luaUrl, iFixUrl); try hotfixInfo.putValue(version, assetBundleUrl, exResourceUrl, luaUrl, iFixUrl);
} }
}
std.log.info("Get AssetBundleUrl >> {s}", .{assetBundleUrl}); std.log.info("Get AssetBundleUrl >> {s}", .{assetBundleUrl});
std.log.info("Get ExResourceUrl >> {s}", .{exResourceUrl}); std.log.info("Get ExResourceUrl >> {s}", .{exResourceUrl});
std.log.info("Get LuaUrl >> {s}", .{luaUrl}); std.log.info("Get LuaUrl >> {s}", .{luaUrl});
@ -157,17 +120,8 @@ pub fn onQueryGateway(req: *httpz.Request, res: *httpz.Response) !void {
proto.network_diagnostic = true; proto.network_diagnostic = true;
proto.enable_android_middle_package = true; proto.enable_android_middle_package = true;
proto.use_new_networking = true; proto.use_new_networking = true;
//Check if the client is CE version
if (std.mem.startsWith(u8, version, "OSCE") or std.mem.startsWith(u8, version, "CNCE")) {
proto.enable_design_data_version_update = false;
proto.enable_version_update = false;
std.log.info("CE client version {s} detected, skipping design_data download.", .{version});
} else {
proto.enable_design_data_version_update = true; proto.enable_design_data_version_update = true;
proto.enable_version_update = true; proto.enable_version_update = true;
}
proto.mtp_switch = true; proto.mtp_switch = true;
proto.forbid_recharge = true; proto.forbid_recharge = true;
proto.close_redeem_code = true; proto.close_redeem_code = true;
@ -195,10 +149,6 @@ pub fn selectHost(version: []const u8) []const u8 {
return OSPROD_HOST; return OSPROD_HOST;
} else if (std.mem.startsWith(u8, version, "OSBETA")) { } else if (std.mem.startsWith(u8, version, "OSBETA")) {
return OSBETA_HOST; return OSBETA_HOST;
} else if (std.mem.startsWith(u8, version, "OSCE")) {
return OSCE_HOST;
} else if (std.mem.startsWith(u8, version, "CNCE")) {
return CNCE_HOST;
} else { } else {
return ""; return "";
} }
@ -207,7 +157,3 @@ pub fn selectHost(version: []const u8) []const u8 {
pub fn constructUrl(host: []const u8, version: []const u8, dispatch_seed: []const u8) []const u8 { pub fn constructUrl(host: []const u8, version: []const u8, dispatch_seed: []const u8) []const u8 {
return std.fmt.allocPrint(std.heap.page_allocator, "https://{s}/query_gateway?version={s}&dispatch_seed={s}&language_type=1&platform_type=2&channel_id=1&sub_channel_id=1&is_need_url=1&account_type=1", .{ host, version, dispatch_seed }) catch ""; return std.fmt.allocPrint(std.heap.page_allocator, "https://{s}/query_gateway?version={s}&dispatch_seed={s}&language_type=1&platform_type=2&channel_id=1&sub_channel_id=1&is_need_url=1&account_type=1", .{ host, version, dispatch_seed }) catch "";
} }
pub fn constructCEUrl(host: []const u8, version: []const u8, dispatch_seed: []const u8) []const u8 {
return std.fmt.allocPrint(std.heap.page_allocator, "http://{s}/query_gateway?version={s}&dispatch_seed={s}&language_type=1&platform_type=2&channel_id=1&sub_channel_id=1&is_need_url=1&account_type=1", .{ host, version, dispatch_seed }) catch "";
}

File diff suppressed because one or more lines are too long

View file

@ -83,7 +83,6 @@ const HandlerList = [_]struct { CmdID, Action }{
.{ CmdID.CmdGetTutorialGuideCsReq, mission.onGetTutorialGuideStatus }, .{ CmdID.CmdGetTutorialGuideCsReq, mission.onGetTutorialGuideStatus },
.{ CmdID.CmdGetMissionStatusCsReq, mission.onGetMissionStatus }, .{ CmdID.CmdGetMissionStatusCsReq, mission.onGetMissionStatus },
.{ CmdID.CmdGetTutorialCsReq, mission.onGetTutorialStatus }, .{ CmdID.CmdGetTutorialCsReq, mission.onGetTutorialStatus },
.{ CmdID.CmdFinishTutorialGuideCsReq, mission.onFinishTutorialGuideStatus },
.{ CmdID.CmdUnlockTutorialGuideCsReq, mission.onUnlockTutorialGuide }, .{ CmdID.CmdUnlockTutorialGuideCsReq, mission.onUnlockTutorialGuide },
//chat //chat
.{ CmdID.CmdGetFriendListInfoCsReq, chat.onGetFriendListInfo }, .{ CmdID.CmdGetFriendListInfoCsReq, chat.onGetFriendListInfo },
@ -107,6 +106,7 @@ const HandlerList = [_]struct { CmdID, Action }{
.{ CmdID.CmdSetGroupCustomSaveDataCsReq, scene.onSetGroupCustomSaveData }, .{ CmdID.CmdSetGroupCustomSaveDataCsReq, scene.onSetGroupCustomSaveData },
//events //events
.{ CmdID.CmdGetActivityScheduleConfigCsReq, events.onGetActivity }, .{ CmdID.CmdGetActivityScheduleConfigCsReq, events.onGetActivity },
.{ CmdID.CmdUpdateServerPrefsDataCsReq, events.onUpdateServerPrefsData },
//challenge //challenge
.{ CmdID.CmdGetChallengeCsReq, challenge.onGetChallenge }, .{ CmdID.CmdGetChallengeCsReq, challenge.onGetChallenge },
.{ CmdID.CmdGetChallengeGroupStatisticsCsReq, challenge.onGetChallengeGroupStatistics }, .{ CmdID.CmdGetChallengeGroupStatisticsCsReq, challenge.onGetChallengeGroupStatistics },
@ -206,7 +206,6 @@ const DummyCmdList = [_]struct { CmdID, CmdID }{
.{ CmdID.CmdTarotBookGetDataCsReq, CmdID.CmdTarotBookGetDataScRsp }, .{ CmdID.CmdTarotBookGetDataCsReq, CmdID.CmdTarotBookGetDataScRsp },
.{ CmdID.CmdGetMarkChestCsReq, CmdID.CmdGetMarkChestScRsp }, .{ CmdID.CmdGetMarkChestCsReq, CmdID.CmdGetMarkChestScRsp },
.{ CmdID.CmdMatchThreeGetDataCsReq, CmdID.CmdMatchThreeGetDataScRsp }, .{ CmdID.CmdMatchThreeGetDataCsReq, CmdID.CmdMatchThreeGetDataScRsp },
.{ CmdID.CmdUpdateServerPrefsDataCsReq, CmdID.CmdUpdateServerPrefsDataScRsp },
.{ CmdID.CmdUpdateTrackMainMissionIdCsReq, CmdID.CmdUpdateTrackMainMissionIdScRsp }, .{ CmdID.CmdUpdateTrackMainMissionIdCsReq, CmdID.CmdUpdateTrackMainMissionIdScRsp },
.{ CmdID.CmdGetNpcMessageGroupCsReq, CmdID.CmdGetNpcMessageGroupScRsp }, .{ CmdID.CmdGetNpcMessageGroupCsReq, CmdID.CmdGetNpcMessageGroupScRsp },
.{ CmdID.CmdGetAllSaveRaidCsReq, CmdID.CmdGetAllSaveRaidScRsp }, .{ CmdID.CmdGetAllSaveRaidCsReq, CmdID.CmdGetAllSaveRaidScRsp },
@ -219,7 +218,6 @@ const DummyCmdList = [_]struct { CmdID, CmdID }{
.{ CmdID.CmdRelicSmartWearGetPlanCsReq, CmdID.CmdRelicSmartWearGetPlanScRsp }, .{ CmdID.CmdRelicSmartWearGetPlanCsReq, CmdID.CmdRelicSmartWearGetPlanScRsp },
.{ CmdID.CmdRelicSmartWearGetPinRelicCsReq, CmdID.CmdRelicSmartWearGetPinRelicScRsp }, .{ CmdID.CmdRelicSmartWearGetPinRelicCsReq, CmdID.CmdRelicSmartWearGetPinRelicScRsp },
.{ CmdID.CmdSetGrowthTargetAvatarCsReq, CmdID.CmdSetGrowthTargetAvatarScRsp }, .{ CmdID.CmdSetGrowthTargetAvatarCsReq, CmdID.CmdSetGrowthTargetAvatarScRsp },
//.{ CmdID.CmdGetStoryTokenActivityDataCsReq, CmdID.CmdGetStoryTokenActivityDataScRsp },
}; };
const SuppressLogList = [_]CmdID{CmdID.CmdSceneEntityMoveCsReq}; const SuppressLogList = [_]CmdID{CmdID.CmdSceneEntityMoveCsReq};

View file

@ -4,6 +4,7 @@ const Session = @import("../Session.zig");
const Packet = @import("../Packet.zig"); const Packet = @import("../Packet.zig");
const Config = @import("../services/config.zig"); const Config = @import("../services/config.zig");
const Data = @import("../data.zig"); const Data = @import("../data.zig");
const ChallengeData = @import("../services/challenge.zig");
const ArrayList = std.ArrayList; const ArrayList = std.ArrayList;
const Allocator = std.mem.Allocator; const Allocator = std.mem.Allocator;
@ -238,6 +239,225 @@ pub const BattleManager = struct {
return battle; return battle;
} }
}; };
pub const ChallegeStageManager = struct {
allocator: std.mem.Allocator,
pub fn init(allocator: std.mem.Allocator) ChallegeStageManager {
return ChallegeStageManager{ .allocator = allocator };
}
pub fn createChallegeStage(
self: *ChallegeStageManager,
) !protocol.SceneBattleInfo {
const config = try Config.loadGameConfig(self.allocator, "config.json");
const stage = try Config.loadStageConfig(self.allocator, "resources/StageConfig.json");
var battle = protocol.SceneBattleInfo.init(self.allocator);
const BattleBuff = protocol.BattleBuff;
for (stage.stage_config.items) |stageConf| {
if (stageConf.stage_id == ChallengeData.challenge_stageID) {
for (config.avatar_config.items, 0..) |avatarConf, idx| {
var avatar = protocol.BattleAvatar.init(self.allocator);
avatar.id = avatarConf.id;
avatar.hp = avatarConf.hp * 100;
avatar.sp_bar = .{ .sp_cur = avatarConf.sp * 100, .sp_max = 10000 };
avatar.level = avatarConf.level;
avatar.rank = avatarConf.rank;
avatar.promotion = avatarConf.promotion;
avatar.avatar_type = .AVATAR_FORMAL_TYPE;
for (avatarConf.relics.items) |relic| {
const r = try relicCoder(self.allocator, relic.id, relic.level, relic.main_affix_id, relic.stat1, relic.cnt1, relic.step1, relic.stat2, relic.cnt2, relic.step2, relic.stat3, relic.cnt3, relic.step3, relic.stat4, relic.cnt4, relic.step4);
try avatar.relic_list.append(r);
}
const lc = protocol.BattleEquipment{
.id = avatarConf.lightcone.id,
.rank = avatarConf.lightcone.rank,
.level = avatarConf.lightcone.level,
.promotion = avatarConf.lightcone.promotion,
};
try avatar.equipment_list.append(lc);
var talentLevel: u32 = 0;
const skill_list: []const u32 = if (isInList(avatar.id, &Data.Rem)) &Data.skills else &Data.skills_old;
for (skill_list) |elem| {
talentLevel = switch (elem) {
1 => 6,
2...4 => 10,
301, 302 => if (isInList(avatar.id, &Data.Rem)) 6 else 1,
else => 1,
};
const talent = protocol.AvatarSkillTree{ .point_id = avatar.id * 1000 + elem, .level = talentLevel };
try avatar.skilltree_list.append(talent);
}
if (avatarConf.use_technique) {
var targetIndexList = ArrayList(u32).init(self.allocator);
try targetIndexList.append(0);
var buffedAvatarId = avatar.id;
if (avatar.id == 8004) {
buffedAvatarId = 8003;
} else if (avatar.id == 8006) {
buffedAvatarId = 8005;
} else if (avatar.id == 8008) {
buffedAvatarId = 8007;
}
for (Data.buffs_unlocked) |buffId| {
const idPrefix = buffId / 100;
if (idPrefix == buffedAvatarId) {
var buff = BattleBuff{
.id = buffId,
.level = 1,
.owner_index = @intCast(idx),
.wave_flag = 1,
.target_index_list = targetIndexList,
.dynamic_values = ArrayList(protocol.BattleBuff.DynamicValuesEntry).init(self.allocator),
};
try buff.dynamic_values.append(.{ .key = .{ .Const = "SkillIndex" }, .value = 0 });
try battle.buff_list.append(buff);
}
}
if (isInList(buffedAvatarId, &Data.IgnoreToughness)) {
var buff_tough = BattleBuff{
.id = 1000119, //for is_ignore toughness
.level = 1,
.owner_index = @intCast(idx),
.wave_flag = 1,
.target_index_list = targetIndexList,
.dynamic_values = ArrayList(protocol.BattleBuff.DynamicValuesEntry).init(self.allocator),
};
try buff_tough.dynamic_values.append(.{ .key = .{ .Const = "SkillIndex" }, .value = 0 });
try battle.buff_list.append(buff_tough);
}
if (buffedAvatarId == 1224) {
var buff_march = protocol.BattleBuff{
.id = 122401, //for hunt march 7th tech
.level = 1,
.owner_index = @intCast(idx),
.wave_flag = 1,
.target_index_list = targetIndexList,
.dynamic_values = ArrayList(protocol.BattleBuff.DynamicValuesEntry).init(self.allocator),
};
try buff_march.dynamic_values.appendSlice(&[_]protocol.BattleBuff.DynamicValuesEntry{
.{ .key = .{ .Const = "#ADF_1" }, .value = 3 },
.{ .key = .{ .Const = "#ADF_2" }, .value = 3 },
});
try battle.buff_list.append(buff_march);
}
if (buffedAvatarId == 1310) {
var buff_firefly = BattleBuff{
.id = 1000112, //for firefly tech
.level = 1,
.owner_index = @intCast(idx),
.wave_flag = 1,
.target_index_list = targetIndexList,
.dynamic_values = ArrayList(protocol.BattleBuff.DynamicValuesEntry).init(self.allocator),
};
try buff_firefly.dynamic_values.append(.{ .key = .{ .Const = "SkillIndex" }, .value = 0 });
try battle.buff_list.append(buff_firefly);
}
if (buffedAvatarId == 8007) {
var buff_rmc = BattleBuff{
.id = 800701, //for rmc tech
.level = 1,
.owner_index = @intCast(idx),
.wave_flag = 1,
.target_index_list = targetIndexList,
.dynamic_values = ArrayList(protocol.BattleBuff.DynamicValuesEntry).init(self.allocator),
};
try buff_rmc.dynamic_values.append(.{ .key = .{ .Const = "SkillIndex" }, .value = 0 });
try battle.buff_list.append(buff_rmc);
}
}
try battle.pve_avatar_list.append(avatar);
}
battle.battle_id = 1;
battle.stage_id = stageConf.stage_id;
battle.logic_random_seed = @intCast(@mod(std.time.timestamp(), 0xFFFFFFFF));
battle.rounds_limit = if (ChallengeData.challenge_mode != 1) 30 else 4;
battle.monster_wave_length = @intCast(stageConf.monster_list.items.len);
battle.world_level = 6;
// Monster handler
for (stageConf.monster_list.items) |wave| {
var monster_wave = protocol.SceneMonsterWave.init(self.allocator);
monster_wave.wave_param = protocol.SceneMonsterWaveParam{ .level = stageConf.level };
for (wave.items) |mob_id| {
try monster_wave.monster_list.append(.{ .monster_id = mob_id });
}
try battle.monster_wave_list.append(monster_wave);
}
// stage blessings
for (ChallengeData.challenge_blessing) |blessing| {
var targetIndexList = ArrayList(u32).init(self.allocator);
try targetIndexList.append(0);
var buff = protocol.BattleBuff{
.id = blessing,
.level = 1,
.owner_index = 0xffffffff,
.wave_flag = 0xffffffff,
.target_index_list = targetIndexList,
.dynamic_values = ArrayList(protocol.BattleBuff.DynamicValuesEntry).init(self.allocator),
};
try buff.dynamic_values.append(.{ .key = .{ .Const = "SkillIndex" }, .value = 0 });
try battle.buff_list.append(buff);
}
if (isInList(1407, Data.AllAvatars)) { //support Castorice
var targetIndexList = ArrayList(u32).init(self.allocator);
try targetIndexList.append(0);
var mazebuff_data = BattleBuff{
.id = 140703,
.level = 1,
.owner_index = 1,
.wave_flag = @intCast(stageConf.monster_list.items.len),
.target_index_list = targetIndexList,
.dynamic_values = ArrayList(protocol.BattleBuff.DynamicValuesEntry).init(self.allocator),
};
try mazebuff_data.dynamic_values.append(.{ .key = .{ .Const = "SkillIndex" }, .value = 0 });
try battle.buff_list.append(mazebuff_data);
}
// PF/AS scoring
const BattleTargetInfoEntry = protocol.SceneBattleInfo.BattleTargetInfoEntry;
battle.battle_target_info = ArrayList(BattleTargetInfoEntry).init(self.allocator);
// target hardcode
var pfTargetHead = protocol.BattleTargetList{ .battle_target_list = ArrayList(protocol.BattleTarget).init(self.allocator) };
try pfTargetHead.battle_target_list.append(.{ .id = 10002, .progress = 0, .total_progress = 0 });
var pfTargetTail = protocol.BattleTargetList{ .battle_target_list = ArrayList(protocol.BattleTarget).init(self.allocator) };
try pfTargetTail.battle_target_list.append(.{ .id = 2001, .progress = 0, .total_progress = 0 });
try pfTargetTail.battle_target_list.append(.{ .id = 2002, .progress = 0, .total_progress = 0 });
var asTargetHead = protocol.BattleTargetList{ .battle_target_list = ArrayList(protocol.BattleTarget).init(self.allocator) };
try asTargetHead.battle_target_list.append(.{ .id = 90005, .progress = 0, .total_progress = 0 });
switch (battle.stage_id) {
// PF
30019000...30019100, 30021000...30021100, 30301000...30319000 => {
try battle.battle_target_info.append(.{ .key = 1, .value = pfTargetHead });
// fill blank target
for (2..5) |i| {
try battle.battle_target_info.append(.{ .key = @intCast(i) });
}
try battle.battle_target_info.append(.{ .key = 5, .value = pfTargetTail });
},
// AS
420100...420300 => {
try battle.battle_target_info.append(.{ .key = 1, .value = asTargetHead });
},
else => {},
}
}
}
return battle;
}
};
pub fn relicCoder(allocator: Allocator, id: u32, level: u32, main_affix_id: u32, stat1: u32, cnt1: u32, step1: u32, stat2: u32, cnt2: u32, step2: u32, stat3: u32, cnt3: u32, step3: u32, stat4: u32, cnt4: u32, step4: u32) !protocol.BattleRelic { pub fn relicCoder(allocator: Allocator, id: u32, level: u32, main_affix_id: u32, stat1: u32, cnt1: u32, step1: u32, stat2: u32, cnt2: u32, step2: u32, stat3: u32, cnt3: u32, step3: u32, stat4: u32, cnt4: u32, step4: u32) !protocol.BattleRelic {
var relic = protocol.BattleRelic{ var relic = protocol.BattleRelic{
.id = id, .id = id,

View file

@ -21,7 +21,7 @@ pub const LineupManager = struct {
var lineup = protocol.LineupInfo.init(self.allocator); var lineup = protocol.LineupInfo.init(self.allocator);
lineup.mp = 5; lineup.mp = 5;
lineup.max_mp = 5; lineup.max_mp = 5;
lineup.name = .{ .Const = "CastoriceSR" }; lineup.name = .{ .Const = "CipherSR" };
for (config.avatar_config.items, 0..) |avatarConf, idx| { for (config.avatar_config.items, 0..) |avatarConf, idx| {
var avatar = protocol.LineupAvatar.init(self.allocator); var avatar = protocol.LineupAvatar.init(self.allocator);

View file

@ -127,6 +127,7 @@ pub const ChallengeSceneManager = struct {
entry_id: u32, entry_id: u32,
world_id: u32, world_id: u32,
monster_id: u32, monster_id: u32,
event_id: u32,
group_id: u32, group_id: u32,
maze_group_id: u32, maze_group_id: u32,
) !protocol.SceneInfo { ) !protocol.SceneInfo {
@ -176,7 +177,7 @@ pub const ChallengeSceneManager = struct {
var monster_info = protocol.SceneNpcMonsterInfo.init(self.allocator); var monster_info = protocol.SceneNpcMonsterInfo.init(self.allocator);
monster_info.monster_id = monster_id; monster_info.monster_id = monster_id;
monster_info.event_id = monsConf.eventId; monster_info.event_id = event_id;
monster_info.world_level = 6; monster_info.world_level = 6;
try scene_group.entity_list.append(.{ try scene_group.entity_list.append(.{

View file

@ -172,7 +172,6 @@ pub fn onGetBigDataAll(session: *Session, packet: *const Packet, allocator: Allo
var rsp = protocol.GetBigDataAllRecommendScRsp.init(allocator); var rsp = protocol.GetBigDataAllRecommendScRsp.init(allocator);
rsp.retcode = 0; rsp.retcode = 0;
rsp.IANNEEIJAKH = req.IANNEEIJAKH; rsp.IANNEEIJAKH = req.IANNEEIJAKH;
std.debug.print("PRINT BIG DATA ALL REQ {}\n", .{req});
try session.send(CmdID.CmdGetBigDataAllRecommendScRsp, rsp); try session.send(CmdID.CmdGetBigDataAllRecommendScRsp, rsp);
} }
pub fn onGetBigData(session: *Session, packet: *const Packet, allocator: Allocator) !void { pub fn onGetBigData(session: *Session, packet: *const Packet, allocator: Allocator) !void {
@ -181,6 +180,5 @@ pub fn onGetBigData(session: *Session, packet: *const Packet, allocator: Allocat
rsp.retcode = 0; rsp.retcode = 0;
rsp.IANNEEIJAKH = req.IANNEEIJAKH; rsp.IANNEEIJAKH = req.IANNEEIJAKH;
rsp.EIGPMIBCIKG = req.EIGPMIBCIKG; rsp.EIGPMIBCIKG = req.EIGPMIBCIKG;
std.debug.print("PRINT BIG DATA REQ {}\n", .{req});
try session.send(CmdID.CmdGetBigDataRecommendScRsp, rsp); try session.send(CmdID.CmdGetBigDataRecommendScRsp, rsp);
} }

View file

@ -4,7 +4,9 @@ const Session = @import("../Session.zig");
const Packet = @import("../Packet.zig"); const Packet = @import("../Packet.zig");
const Config = @import("config.zig"); const Config = @import("config.zig");
const Data = @import("../data.zig"); const Data = @import("../data.zig");
const ChallengeData = @import("challenge.zig");
const BattleManager = @import("../manager/battle_mgr.zig").BattleManager; const BattleManager = @import("../manager/battle_mgr.zig").BattleManager;
const ChallegeStageManager = @import("../manager/battle_mgr.zig").ChallegeStageManager;
const ArrayList = std.ArrayList; const ArrayList = std.ArrayList;
const Allocator = std.mem.Allocator; const Allocator = std.mem.Allocator;
@ -57,7 +59,8 @@ pub fn onStartBattleCollege(session: *Session, packet: *const Packet, allocator:
pub fn onSceneCastSkill(session: *Session, packet: *const Packet, allocator: Allocator) !void { pub fn onSceneCastSkill(session: *Session, packet: *const Packet, allocator: Allocator) !void {
var battle_mgr = BattleManager.init(allocator); var battle_mgr = BattleManager.init(allocator);
const battle = try battle_mgr.createBattle(); const battle = try battle_mgr.createBattle();
var challege_mgr = ChallegeStageManager.init(allocator);
const challenge = try challege_mgr.createChallegeStage();
const req = try packet.getProto(protocol.SceneCastSkillCsReq, allocator); const req = try packet.getProto(protocol.SceneCastSkillCsReq, allocator);
var monster_battle_info_list = ArrayList(protocol.HitMonsterBattleInfo).init(allocator); var monster_battle_info_list = ArrayList(protocol.HitMonsterBattleInfo).init(allocator);
try monster_battle_info_list.appendSlice(&[_]protocol.HitMonsterBattleInfo{ try monster_battle_info_list.appendSlice(&[_]protocol.HitMonsterBattleInfo{
@ -70,7 +73,11 @@ pub fn onSceneCastSkill(session: *Session, packet: *const Packet, allocator: All
.retcode = 0, .retcode = 0,
.cast_entity_id = req.cast_entity_id, .cast_entity_id = req.cast_entity_id,
.monster_battle_info = monster_battle_info_list, .monster_battle_info = monster_battle_info_list,
.battle_info = if (req.assist_monster_entity_id_list.items.len > 0 or (req.attacked_by_entity_id >= 1 and req.attacked_by_entity_id <= 99)) battle else null, .battle_info = if (req.assist_monster_entity_id_list.items.len > 0 or
(req.attacked_by_entity_id >= 1 and req.attacked_by_entity_id <= 99))
(if (ChallengeData.on_challenge) challenge else battle)
else
null,
}); });
} }

View file

@ -5,6 +5,7 @@ const Packet = @import("../Packet.zig");
const Config = @import("config.zig"); const Config = @import("config.zig");
const Res_config = @import("res_config.zig"); const Res_config = @import("res_config.zig");
const Data = @import("../data.zig"); const Data = @import("../data.zig");
const ChallegeStageManager = @import("../manager/battle_mgr.zig").ChallegeStageManager;
const SceneManager = @import("../manager/scene_mgr.zig").SceneManager; const SceneManager = @import("../manager/scene_mgr.zig").SceneManager;
const ChallengeSceneManager = @import("../manager/scene_mgr.zig").ChallengeSceneManager; const ChallengeSceneManager = @import("../manager/scene_mgr.zig").ChallengeSceneManager;
const LineupManager = @import("../manager/lineup_mgr.zig").LineupManager; const LineupManager = @import("../manager/lineup_mgr.zig").LineupManager;
@ -39,6 +40,13 @@ fn contains(list: *const std.ArrayListAligned(u32, null), value: u32) bool {
} }
return false; return false;
} }
pub var challenge_stageID: u32 = 0;
pub var challenge_mode: u32 = 0;
pub var on_challenge: bool = false;
pub const ChallengeBlessing = ArrayList(u32);
pub var challenge_blessing: []const u32 = &.{};
pub fn onGetChallenge(session: *Session, _: *const Packet, allocator: Allocator) !void { pub fn onGetChallenge(session: *Session, _: *const Packet, allocator: Allocator) !void {
const challenge_config = try Config.loadChallengeConfig(allocator, "resources/ChallengeMazeConfig.json"); const challenge_config = try Config.loadChallengeConfig(allocator, "resources/ChallengeMazeConfig.json");
@ -77,12 +85,18 @@ pub fn onLeaveChallenge(session: *Session, _: *const Packet, allocator: Allocato
.lineup = lineup, .lineup = lineup,
.scene = scene_info, .scene = scene_info,
}); });
on_challenge = false;
challenge_mode = 0;
try session.send(CmdID.CmdLeaveChallengeScRsp, protocol.LeaveChallengeScRsp{ try session.send(CmdID.CmdLeaveChallengeScRsp, protocol.LeaveChallengeScRsp{
.retcode = 0, .retcode = 0,
}); });
} }
//TODO: IMPLEMENT CHALLENGE BUFF AND FIX MENU
pub fn onStartChallenge(session: *Session, packet: *const Packet, allocator: Allocator) !void { pub fn onStartChallenge(session: *Session, packet: *const Packet, allocator: Allocator) !void {
var challenge_blessing_list = ChallengeBlessing{
.allocator = std.heap.page_allocator,
.items = &.{},
.capacity = 0,
};
const req = try packet.getProto(protocol.StartChallengeCsReq, allocator); const req = try packet.getProto(protocol.StartChallengeCsReq, allocator);
var rsp = protocol.StartChallengeScRsp.init(allocator); var rsp = protocol.StartChallengeScRsp.init(allocator);
const challenge_config = try Config.loadChallengeConfig(allocator, "resources/ChallengeMazeConfig.json"); const challenge_config = try Config.loadChallengeConfig(allocator, "resources/ChallengeMazeConfig.json");
@ -90,10 +104,12 @@ pub fn onStartChallenge(session: *Session, packet: *const Packet, allocator: All
const maze_config = try Config.loadMazePlaneConfig(allocator, "resources/MazePlane.json"); const maze_config = try Config.loadMazePlaneConfig(allocator, "resources/MazePlane.json");
var avatarList = std.ArrayList(u32).init(allocator); var avatarList = std.ArrayList(u32).init(allocator);
var lineup1 = protocol.LineupInfo.init(allocator); var lineup = protocol.LineupInfo.init(allocator);
lineup1.mp = 5; lineup.mp = 5;
lineup1.max_mp = 5; lineup.max_mp = 5;
lineup1.extra_lineup_type = protocol.ExtraLineupType.LINEUP_CHALLENGE; lineup.extra_lineup_type = if (NodeCheck.challenge_node == 0) protocol.ExtraLineupType.LINEUP_CHALLENGE else protocol.ExtraLineupType.LINEUP_CHALLENGE_2;
if (NodeCheck.challenge_node == 0) {
for (req.first_lineup.items, 0..) |avt, idx| { for (req.first_lineup.items, 0..) |avt, idx| {
var list = protocol.LineupAvatar.init(allocator); var list = protocol.LineupAvatar.init(allocator);
try avatarList.append(avt); try avatarList.append(avt);
@ -103,27 +119,23 @@ pub fn onStartChallenge(session: *Session, packet: *const Packet, allocator: All
list.avatar_type = protocol.AvatarType.AVATAR_FORMAL_TYPE; list.avatar_type = protocol.AvatarType.AVATAR_FORMAL_TYPE;
list.hp = 10000; list.hp = 10000;
list.sp_bar = .{ .sp_cur = 10000, .sp_max = 10000 }; list.sp_bar = .{ .sp_cur = 10000, .sp_max = 10000 };
try lineup1.avatar_list.append(list); try lineup.avatar_list.append(list);
} }
try rsp.lineup_list.append(lineup1); try rsp.lineup_list.append(lineup);
} else {
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| { for (req.second_lineup.items, 0..) |avt, idx| {
var list = protocol.LineupAvatar.init(allocator); var list = protocol.LineupAvatar.init(allocator);
try avatarList2.append(avt); try avatarList.append(avt);
list.id = avt; list.id = avt;
list.slot = @intCast(idx); list.slot = @intCast(idx);
list.satiety = 0; list.satiety = 0;
list.avatar_type = protocol.AvatarType.AVATAR_FORMAL_TYPE; list.avatar_type = protocol.AvatarType.AVATAR_FORMAL_TYPE;
list.hp = 10000; list.hp = 10000;
list.sp_bar = .{ .sp_cur = 10000, .sp_max = 10000 }; list.sp_bar = .{ .sp_cur = 10000, .sp_max = 10000 };
try lineup2.avatar_list.append(list); try lineup.avatar_list.append(list);
}
try rsp.lineup_list.append(lineup);
} }
try rsp.lineup_list.append(lineup2);
var cur_challenge_info = protocol.CurChallenge.init(allocator); var cur_challenge_info = protocol.CurChallenge.init(allocator);
cur_challenge_info.challenge_id = req.challenge_id; cur_challenge_info.challenge_id = req.challenge_id;
@ -136,6 +148,7 @@ pub fn onStartChallenge(session: *Session, packet: *const Packet, allocator: All
var entryID: u32 = 0; var entryID: u32 = 0;
var worldID: u32 = 0; var worldID: u32 = 0;
var monsterID: u32 = 0; var monsterID: u32 = 0;
var eventID: u32 = 0;
var groupID: u32 = 0; var groupID: u32 = 0;
var maze_groupID: u32 = 0; var maze_groupID: u32 = 0;
if (NodeCheck.challenge_node == 0) { if (NodeCheck.challenge_node == 0) {
@ -146,9 +159,38 @@ pub fn onStartChallenge(session: *Session, packet: *const Packet, allocator: All
if (entrance.id == challengeConf.map_entrance_id) { if (entrance.id == challengeConf.map_entrance_id) {
for (maze_config.maze_plane_config.items) |maze| { for (maze_config.maze_plane_config.items) |maze| {
if (contains(&maze.floor_id_list, entrance.floor_id)) { if (contains(&maze.floor_id_list, entrance.floor_id)) {
if (req.challenge_id > 20000 and req.challenge_id < 30000) {
var story_buff = protocol.ChallengeStoryBuffList{
.buff_list = ArrayList(u32).init(allocator),
};
try story_buff.buff_list.append(challengeConf.maze_buff_id);
try story_buff.buff_list.append(req.stage_info.?.IEICDGGELNE.?.story_info.buff_one);
try challenge_blessing_list.appendSlice(story_buff.buff_list.items);
cur_challenge_info.stage_info = .{
.IEICDGGELNE = .{
.cur_story_buffs = story_buff,
},
};
challenge_mode = 1;
} else if (req.challenge_id > 30000) {
var boss_buff = protocol.ChallengeBossBuffList{
.buff_list = ArrayList(u32).init(allocator),
.challenge_boss_const = 1,
};
try boss_buff.buff_list.append(challengeConf.maze_buff_id);
try boss_buff.buff_list.append(req.stage_info.?.IEICDGGELNE.?.boss_info.buff_one);
try challenge_blessing_list.appendSlice(boss_buff.buff_list.items);
cur_challenge_info.stage_info = .{
.IEICDGGELNE = .{
.cur_boss_buffs = boss_buff,
},
};
challenge_mode = 2;
}
floorID = entrance.floor_id; floorID = entrance.floor_id;
worldID = maze.world_id; worldID = maze.world_id;
monsterID = challengeConf.npc_monster_id_list1.items[challengeConf.npc_monster_id_list1.items.len - 1]; monsterID = challengeConf.npc_monster_id_list1.items[challengeConf.npc_monster_id_list1.items.len - 1];
eventID = challengeConf.event_id_list1.items[challengeConf.event_id_list1.items.len - 1];
groupID = challengeConf.maze_group_id1; groupID = challengeConf.maze_group_id1;
maze_groupID = challengeConf.maze_group_id1; maze_groupID = challengeConf.maze_group_id1;
planeID = maze.challenge_plane_id; planeID = maze.challenge_plane_id;
@ -167,13 +209,46 @@ pub fn onStartChallenge(session: *Session, packet: *const Packet, allocator: All
if (entrance.id == challengeConf.map_entrance_id2) { if (entrance.id == challengeConf.map_entrance_id2) {
for (maze_config.maze_plane_config.items) |maze| { for (maze_config.maze_plane_config.items) |maze| {
if (contains(&maze.floor_id_list, entrance.floor_id)) { if (contains(&maze.floor_id_list, entrance.floor_id)) {
if (challengeConf.maze_group_id2) |id| {
if (req.challenge_id > 20000 and req.challenge_id < 30000) {
var story_buff = protocol.ChallengeStoryBuffList{
.buff_list = ArrayList(u32).init(allocator),
};
try story_buff.buff_list.append(challengeConf.maze_buff_id);
try story_buff.buff_list.append(req.stage_info.?.IEICDGGELNE.?.story_info.buff_two);
try challenge_blessing_list.appendSlice(story_buff.buff_list.items);
cur_challenge_info.stage_info = .{
.IEICDGGELNE = .{
.cur_story_buffs = story_buff,
},
};
challenge_mode = 1;
} else if (req.challenge_id > 30000) {
var boss_buff = protocol.ChallengeBossBuffList{
.buff_list = ArrayList(u32).init(allocator),
.challenge_boss_const = 1,
};
try boss_buff.buff_list.append(challengeConf.maze_buff_id);
try boss_buff.buff_list.append(req.stage_info.?.IEICDGGELNE.?.boss_info.buff_two);
try challenge_blessing_list.appendSlice(boss_buff.buff_list.items);
cur_challenge_info.stage_info = .{
.IEICDGGELNE = .{
.cur_boss_buffs = boss_buff,
},
};
challenge_mode = 2;
}
floorID = entrance.floor_id; floorID = entrance.floor_id;
worldID = maze.world_id; worldID = maze.world_id;
monsterID = challengeConf.npc_monster_id_list2.items[challengeConf.npc_monster_id_list2.items.len - 1]; monsterID = challengeConf.npc_monster_id_list2.items[challengeConf.npc_monster_id_list2.items.len - 1];
groupID = challengeConf.maze_group_id2; eventID = challengeConf.event_id_list2.items[challengeConf.event_id_list2.items.len - 1];
maze_groupID = challengeConf.maze_group_id2; groupID = id;
maze_groupID = id;
planeID = maze.challenge_plane_id; planeID = maze.challenge_plane_id;
entryID = challengeConf.map_entrance_id2; entryID = challengeConf.map_entrance_id2;
} else {
std.debug.print("THIS CHALLENGE ID: {} DOES NOT SUPPORT 2ND NODE. PLEASE DO COMMAND /node TO SWITCH BACK TO FIRST NODE\n", .{req.challenge_id});
}
} }
} }
} }
@ -183,12 +258,13 @@ pub fn onStartChallenge(session: *Session, packet: *const Packet, allocator: All
} }
var scene_PF_manager = ChallengeSceneManager.init(allocator); var scene_PF_manager = ChallengeSceneManager.init(allocator);
const scene_info = try scene_PF_manager.createScene( const scene_info = try scene_PF_manager.createScene(
if (NodeCheck.challenge_node == 0) avatarList else avatarList2, avatarList,
planeID, planeID,
floorID, floorID,
entryID, entryID,
worldID, worldID,
monsterID, monsterID,
eventID,
groupID, groupID,
maze_groupID, maze_groupID,
); );
@ -196,12 +272,9 @@ pub fn onStartChallenge(session: *Session, packet: *const Packet, allocator: All
rsp.scene = scene_info; rsp.scene = scene_info;
rsp.cur_challenge = cur_challenge_info; rsp.cur_challenge = cur_challenge_info;
on_challenge = true;
challenge_stageID = eventID;
challenge_blessing = challenge_blessing_list.items[0..challenge_blessing_list.items.len];
try session.send(CmdID.CmdStartChallengeScRsp, rsp); 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 }); 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,
});
} }

View file

@ -11,7 +11,11 @@ const BattleConfig = struct {
monster_level: u32, monster_level: u32,
blessings: ArrayList(u32), blessings: ArrayList(u32),
}; };
const Stage = struct {
level: u32,
stage_id: u32,
monster_list: ArrayList(ArrayList(u32)),
};
const ExtraMazeBuff = struct { const ExtraMazeBuff = struct {
enable: bool, enable: bool,
mazebuff: ArrayList(u32), mazebuff: ArrayList(u32),
@ -54,17 +58,33 @@ const Avatar = struct {
relics: ArrayList(Relic), relics: ArrayList(Relic),
use_technique: bool, use_technique: bool,
}; };
const PlayerIcon = struct {
id: u32,
};
const MainMission = struct {
main_mission_id: u32,
};
const TutorialGuide = struct {
guide_group_id: u32,
};
const Tutorial = struct {
tutorial_id: u32,
};
const Activity = struct {
activity_module_list: ArrayList(u32),
panel_id: u32,
};
const ChallengeConfig = struct { const ChallengeConfig = struct {
id: u32, // id: u32,
npc_monster_id_list1: ArrayList(u32), // npc_monster_id_list1: ArrayList(u32),
npc_monster_id_list2: ArrayList(u32), // npc_monster_id_list2: ArrayList(u32),
event_id_list1: ArrayList(u32), // event_id_list1: ArrayList(u32),
event_id_list2: ArrayList(u32), // event_id_list2: ArrayList(u32),
map_entrance_id: u32, // map_entrance_id: u32,
map_entrance_id2: u32, // map_entrance_id2: u32,
maze_group_id1: u32, // maze_group_id1: u32,
maze_group_id2: u32, // maze_group_id2: ?u32, // to check if it missing MazeGroupID2 field
maze_buff_id: u32,
}; };
const MapEntrance = struct { const MapEntrance = struct {
@ -85,6 +105,24 @@ pub const GameConfig = struct {
battle_config: BattleConfig, battle_config: BattleConfig,
avatar_config: ArrayList(Avatar), avatar_config: ArrayList(Avatar),
}; };
pub const StageConfig = struct {
stage_config: ArrayList(Stage),
};
pub const PlayerIconConfig = struct {
player_icon_config: ArrayList(PlayerIcon),
};
pub const MainMissionConfig = struct {
main_mission_config: ArrayList(MainMission),
};
pub const TutorialGuideConfig = struct {
tutorial_guide_config: ArrayList(TutorialGuide),
};
pub const TutorialConfig = struct {
tutorial_config: ArrayList(Tutorial),
};
pub const ActivityConfig = struct {
activity_config: ArrayList(Activity),
};
pub const ChallengeMazeConfig = struct { pub const ChallengeMazeConfig = struct {
challenge_config: ArrayList(ChallengeConfig), challenge_config: ArrayList(ChallengeConfig),
}; };
@ -121,6 +159,30 @@ pub fn loadGameConfig(allocator: Allocator, filename: []const u8) ErrorSet!GameC
return loadConfig(GameConfig, parseConfig, allocator, filename); return loadConfig(GameConfig, parseConfig, allocator, filename);
} }
pub fn loadStageConfig(allocator: Allocator, filename: []const u8) ErrorSet!StageConfig {
return loadConfig(StageConfig, parseStageConfig, allocator, filename);
}
pub fn loadPlayerIconConfig(allocator: Allocator, filename: []const u8) ErrorSet!PlayerIconConfig {
return loadConfig(PlayerIconConfig, parsePlayerIconConfig, allocator, filename);
}
pub fn loadMainMissionConfig(allocator: Allocator, filename: []const u8) ErrorSet!MainMissionConfig {
return loadConfig(MainMissionConfig, parseMainMissionConfig, allocator, filename);
}
pub fn loadTutorialGuideConfig(allocator: Allocator, filename: []const u8) ErrorSet!TutorialGuideConfig {
return loadConfig(TutorialGuideConfig, parseTutorialGuideConfig, allocator, filename);
}
pub fn loadTutorialConfig(allocator: Allocator, filename: []const u8) ErrorSet!TutorialConfig {
return loadConfig(TutorialConfig, parseTutorialConfig, allocator, filename);
}
pub fn loadActivityConfig(allocator: Allocator, filename: []const u8) ErrorSet!ActivityConfig {
return loadConfig(ActivityConfig, parseActivityConfig, allocator, filename);
}
pub fn loadChallengeConfig(allocator: Allocator, filename: []const u8) ErrorSet!ChallengeMazeConfig { pub fn loadChallengeConfig(allocator: Allocator, filename: []const u8) ErrorSet!ChallengeMazeConfig {
return loadConfig(ChallengeMazeConfig, parseChallengeConfig, allocator, filename); return loadConfig(ChallengeMazeConfig, parseChallengeConfig, allocator, filename);
} }
@ -144,8 +206,6 @@ pub fn parseConfig(root: std.json.Value, allocator: Allocator) ErrorSet!GameConf
.blessings = ArrayList(u32).init(allocator), .blessings = ArrayList(u32).init(allocator),
}; };
std.debug.print("loading config stageID = {}\n", .{battle_config.stage_id});
for (battle_config_json.object.get("monster_wave").?.array.items) |wave| { for (battle_config_json.object.get("monster_wave").?.array.items) |wave| {
var wave_list = ArrayList(u32).init(allocator); var wave_list = ArrayList(u32).init(allocator);
for (wave.array.items) |monster| { for (wave.array.items) |monster| {
@ -192,11 +252,100 @@ pub fn parseConfig(root: std.json.Value, allocator: Allocator) ErrorSet!GameConf
.avatar_config = avatar_config, .avatar_config = avatar_config,
}; };
} }
pub fn parseStageConfig(root: std.json.Value, allocator: Allocator) ErrorSet!StageConfig {
var stage_config = ArrayList(Stage).init(allocator);
for (root.object.get("stage_config").?.array.items) |stage_json| {
var stage = Stage{
.level = @intCast(stage_json.object.get("Level").?.integer),
.stage_id = @intCast(stage_json.object.get("StageID").?.integer),
.monster_list = ArrayList(ArrayList(u32)).init(allocator),
};
for (stage_json.object.get("MonsterList").?.array.items) |wave| {
var wave_list = ArrayList(u32).init(allocator);
for (wave.array.items) |monster| {
try wave_list.append(@intCast(monster.integer));
}
try stage.monster_list.append(wave_list);
}
try stage_config.append(stage);
}
return StageConfig{
.stage_config = stage_config,
};
}
fn parsePlayerIconConfig(root: std.json.Value, allocator: Allocator) ErrorSet!PlayerIconConfig {
var player_icon_config = ArrayList(PlayerIcon).init(allocator);
for (root.object.get("player_icon_config").?.array.items) |icon_json| {
const icon = PlayerIcon{
.id = @intCast(icon_json.object.get("ID").?.integer),
};
try player_icon_config.append(icon);
}
return PlayerIconConfig{
.player_icon_config = player_icon_config,
};
}
fn parseMainMissionConfig(root: std.json.Value, allocator: Allocator) ErrorSet!MainMissionConfig {
var main_mission_config = ArrayList(MainMission).init(allocator);
for (root.object.get("main_mission_config").?.array.items) |main_json| {
const main_mission = MainMission{
.main_mission_id = @intCast(main_json.object.get("MainMissionID").?.integer),
};
try main_mission_config.append(main_mission);
}
return MainMissionConfig{
.main_mission_config = main_mission_config,
};
}
fn parseTutorialGuideConfig(root: std.json.Value, allocator: Allocator) ErrorSet!TutorialGuideConfig {
var tutorial_guide_config = ArrayList(TutorialGuide).init(allocator);
for (root.object.get("tutorial_guide_config").?.array.items) |guide_json| {
const tutorial_guide = TutorialGuide{
.guide_group_id = @intCast(guide_json.object.get("GroupID").?.integer),
};
try tutorial_guide_config.append(tutorial_guide);
}
return TutorialGuideConfig{
.tutorial_guide_config = tutorial_guide_config,
};
}
fn parseTutorialConfig(root: std.json.Value, allocator: Allocator) ErrorSet!TutorialConfig {
var tutorial_config = ArrayList(Tutorial).init(allocator);
for (root.object.get("tutorial_config").?.array.items) |tutorial_json| {
const tutorial = Tutorial{
.tutorial_id = @intCast(tutorial_json.object.get("TutorialID").?.integer),
};
try tutorial_config.append(tutorial);
}
return TutorialConfig{
.tutorial_config = tutorial_config,
};
}
fn parseActivityConfig(root: std.json.Value, allocator: Allocator) ErrorSet!ActivityConfig {
var activity_config = ArrayList(Activity).init(allocator);
for (root.object.get("activity_config").?.array.items) |activity_json| {
var activity = Activity{
.panel_id = @intCast(activity_json.object.get("ActivityID").?.integer),
.activity_module_list = ArrayList(u32).init(allocator),
};
for (activity_json.object.get("ActivityModuleIDList").?.array.items) |id| {
try activity.activity_module_list.append(@intCast(id.integer));
}
try activity_config.append(activity);
}
return ActivityConfig{
.activity_config = activity_config,
};
}
fn parseChallengeConfig(root: std.json.Value, allocator: Allocator) ErrorSet!ChallengeMazeConfig { fn parseChallengeConfig(root: std.json.Value, allocator: Allocator) ErrorSet!ChallengeMazeConfig {
var challenge_config = ArrayList(ChallengeConfig).init(allocator); var challenge_config = ArrayList(ChallengeConfig).init(allocator);
for (root.object.get("challenge_config").?.array.items) |challenge_json| { for (root.object.get("challenge_config").?.array.items) |challenge_json| {
var challenge = ChallengeConfig{ var challenge = ChallengeConfig{
.id = @intCast(challenge_json.object.get("ID").?.integer), .id = @intCast(challenge_json.object.get("ID").?.integer),
.maze_buff_id = @intCast(challenge_json.object.get("MazeBuffID").?.integer),
.npc_monster_id_list1 = ArrayList(u32).init(allocator), .npc_monster_id_list1 = ArrayList(u32).init(allocator),
.npc_monster_id_list2 = ArrayList(u32).init(allocator), .npc_monster_id_list2 = ArrayList(u32).init(allocator),
.event_id_list1 = ArrayList(u32).init(allocator), .event_id_list1 = ArrayList(u32).init(allocator),
@ -204,7 +353,10 @@ fn parseChallengeConfig(root: std.json.Value, allocator: Allocator) ErrorSet!Cha
.map_entrance_id = @intCast(challenge_json.object.get("MapEntranceID").?.integer), .map_entrance_id = @intCast(challenge_json.object.get("MapEntranceID").?.integer),
.map_entrance_id2 = @intCast(challenge_json.object.get("MapEntranceID2").?.integer), .map_entrance_id2 = @intCast(challenge_json.object.get("MapEntranceID2").?.integer),
.maze_group_id1 = @intCast(challenge_json.object.get("MazeGroupID1").?.integer), .maze_group_id1 = @intCast(challenge_json.object.get("MazeGroupID1").?.integer),
.maze_group_id2 = @intCast(challenge_json.object.get("MazeGroupID2").?.integer), .maze_group_id2 = if (challenge_json.object.get("MazeGroupID2")) |val|
@intCast(val.integer)
else
null,
}; };
for (challenge_json.object.get("NpcMonsterIDList1").?.array.items) |npc1| { for (challenge_json.object.get("NpcMonsterIDList1").?.array.items) |npc1| {
try challenge.npc_monster_id_list1.append(@intCast(npc1.integer)); try challenge.npc_monster_id_list1.append(@intCast(npc1.integer));

View file

@ -2,7 +2,7 @@ const std = @import("std");
const protocol = @import("protocol"); const protocol = @import("protocol");
const Session = @import("../Session.zig"); const Session = @import("../Session.zig");
const Packet = @import("../Packet.zig"); const Packet = @import("../Packet.zig");
const Data = @import("../data.zig"); const Config = @import("config.zig");
const ArrayList = std.ArrayList; const ArrayList = std.ArrayList;
const Allocator = std.mem.Allocator; const Allocator = std.mem.Allocator;
@ -10,20 +10,28 @@ const CmdID = protocol.CmdID;
pub fn onGetActivity(session: *Session, _: *const Packet, allocator: Allocator) !void { pub fn onGetActivity(session: *Session, _: *const Packet, allocator: Allocator) !void {
var rsp = protocol.GetActivityScheduleConfigScRsp.init(allocator); var rsp = protocol.GetActivityScheduleConfigScRsp.init(allocator);
const activity_config = try Config.loadActivityConfig(allocator, "resources/ActivityConfig.json");
for (Data.EventList) |id| { for (activity_config.activity_config.items) |activityConf| {
if (activityConf.panel_id != 30002) {
for (activityConf.activity_module_list.items) |id| {
var activ_list = protocol.ActivityScheduleData.init(allocator); var activ_list = protocol.ActivityScheduleData.init(allocator);
activ_list.begin_time = 0; activ_list.begin_time = 1664308800;
activ_list.end_time = 1924992000; activ_list.end_time = 4294967295;
if (id >= 100000) { activ_list.activity_id = id;
activ_list.activity_id = ((id % 100000) * 100) + 1; activ_list.panel_id = activityConf.panel_id;
} else {
activ_list.activity_id = id * 100 + 1;
}
activ_list.panel_id = id;
try rsp.schedule_data.append(activ_list); try rsp.schedule_data.append(activ_list);
} }
}
}
rsp.retcode = 0; rsp.retcode = 0;
try session.send(CmdID.CmdGetActivityScheduleConfigScRsp, rsp); try session.send(CmdID.CmdGetActivityScheduleConfigScRsp, rsp);
} }
pub fn onUpdateServerPrefsData(session: *Session, packet: *const Packet, allocator: Allocator) !void {
var rsp = protocol.UpdateServerPrefsDataScRsp.init(allocator);
const req = try packet.getProto(protocol.UpdateServerPrefsDataCsReq, allocator);
rsp.server_prefs_id = req.server_prefs.?.server_prefs_id;
rsp.retcode = 0;
try session.send(CmdID.CmdUpdateServerPrefsDataScRsp, rsp);
}

View file

@ -30,7 +30,7 @@ pub fn onReplaceLineup(session: *Session, packet: *const Packet, allocator: Allo
var lineup = protocol.LineupInfo.init(allocator); var lineup = protocol.LineupInfo.init(allocator);
lineup.mp = 5; lineup.mp = 5;
lineup.max_mp = 5; lineup.max_mp = 5;
lineup.name = .{ .Const = "CastoriceSR" }; lineup.name = .{ .Const = "CipherSR" };
for (req.lineup_slot_list.items) |ok| { for (req.lineup_slot_list.items) |ok| {
const avatar = protocol.LineupAvatar{ const avatar = protocol.LineupAvatar{
.id = ok.id, .id = ok.id,

View file

@ -12,8 +12,10 @@ pub fn onPlayerGetToken(session: *Session, _: *const Packet, allocator: Allocato
rsp.retcode = 0; rsp.retcode = 0;
rsp.uid = 1; rsp.uid = 1;
try session.send(CmdID.CmdPlayerGetTokenScRsp, rsp); try session.send(CmdID.CmdPlayerGetTokenScRsp, rsp);
} }
pub fn onPlayerLogin(session: *Session, packet: *const Packet, allocator: Allocator) !void { pub fn onPlayerLogin(session: *Session, packet: *const Packet, allocator: Allocator) !void {
const req = try packet.getProto(protocol.PlayerLoginCsReq, allocator); const req = try packet.getProto(protocol.PlayerLoginCsReq, allocator);

View file

@ -20,7 +20,7 @@ pub fn onGetMail(session: *Session, _: *const Packet, allocator: Allocator) !voi
mail.Title = .{ .Const = "Readme" }; mail.Title = .{ .Const = "Readme" };
mail.IsRead = false; mail.IsRead = false;
mail.id = 1; mail.id = 1;
mail.Content = .{ .Const = "CastoriceSR is a free and open-source sofware\nJoin our discord: https://discord.gg/reversedrooms\nUse https://yunlisr-relic-builder.vercel.app to setup relic :Đ\n" }; mail.Content = .{ .Const = "CipherSR is a free and open-source sofware\nJoin our discord: https://discord.gg/reversedrooms\nUse https://yunlisr-relic-builder.vercel.app to setup relic :Đ\n" };
mail.Time = 1723334400; mail.Time = 1723334400;
mail.ExpireTime = 17186330890; mail.ExpireTime = 17186330890;
mail.MailType = protocol.MailType.MAIL_TYPE_STAR; mail.MailType = protocol.MailType.MAIL_TYPE_STAR;

View file

@ -1,42 +0,0 @@
const std = @import("std");
const protocol = @import("protocol");
const Session = @import("../Session.zig");
const Packet = @import("../Packet.zig");
const Allocator = std.mem.Allocator;
const CmdID = protocol.CmdID;
const B64Decoder = std.base64.standard.Decoder;
pub fn onPlayerHeartBeat(session: *Session, packet: *const Packet, allocator: Allocator) !void {
const req = try packet.getProto(protocol.PlayerHeartBeatCsReq, allocator);
const lua_code =
\\local function setTextComponent(path, newText)
\\ local obj = CS.UnityEngine.GameObject.Find(path)
\\ if obj then
\\ local textComponent = obj:GetComponentInChildren(typeof(CS.RPG.Client.LocalizedText))
\\ if textComponent then
\\ textComponent.text = newText
\\ end
\\ end
\\end
\\
\\setTextComponent("UIRoot/AboveDialog/BetaHintDialog(Clone)", "<color=#ffc800>CipherSR is a free and open source software.</color>")
\\setTextComponent("VersionText", "<color=#ffc800>Visit discord.gg/reversedrooms for more info!</color>")
;
const data = protocol.ClientDownloadData{
.version = 51,
.time = @intCast(std.time.milliTimestamp()),
.data = .{ .Owned = .{
.allocator = allocator,
.str = try allocator.dupe(u8, lua_code),
} },
};
const rsp = protocol.PlayerHeartBeatScRsp{
.retcode = 0,
.client_time_ms = req.client_time_ms,
.server_time_ms = @intCast(std.time.milliTimestamp()),
.download_data = data,
};
try session.send(CmdID.CmdPlayerHeartBeatScRsp, rsp);
}

View file

@ -3,6 +3,7 @@ const protocol = @import("protocol");
const Session = @import("../Session.zig"); const Session = @import("../Session.zig");
const Packet = @import("../Packet.zig"); const Packet = @import("../Packet.zig");
const Data = @import("../data.zig"); const Data = @import("../data.zig");
const Config = @import("config.zig");
const ArrayList = std.ArrayList; const ArrayList = std.ArrayList;
const Allocator = std.mem.Allocator; const Allocator = std.mem.Allocator;
@ -11,45 +12,37 @@ const CmdID = protocol.CmdID;
pub fn onGetMissionStatus(session: *Session, packet: *const Packet, allocator: Allocator) !void { pub fn onGetMissionStatus(session: *Session, packet: *const Packet, allocator: Allocator) !void {
const req = try packet.getProto(protocol.GetMissionStatusCsReq, allocator); const req = try packet.getProto(protocol.GetMissionStatusCsReq, allocator);
var rsp = protocol.GetMissionStatusScRsp.init(allocator); var rsp = protocol.GetMissionStatusScRsp.init(allocator);
const main_mission_config = try Config.loadMainMissionConfig(allocator, "resources/MainMission.json");
rsp.retcode = 0; rsp.retcode = 0;
for (req.sub_mission_id_list.items) |id| { for (req.sub_mission_id_list.items) |id| {
try rsp.SubMissionStatusList.append(protocol.Mission{ .id = id, .status = protocol.MissionStatus.MISSION_FINISH, .progress = 1 }); try rsp.SubMissionStatusList.append(protocol.Mission{ .id = id, .status = protocol.MissionStatus.MISSION_FINISH, .progress = 1 });
} }
try rsp.FinishedMainMissionIdList.appendSlice(&Data.FinishedMainMissionIdList); for (main_mission_config.main_mission_config.items) |main_missionConf| {
try rsp.CurversionFinishedMainMissionIdList.appendSlice(&Data.FinishedMainMissionIdList); try rsp.FinishedMainMissionIdList.append(main_missionConf.main_mission_id);
try rsp.CurversionFinishedMainMissionIdList.append(main_missionConf.main_mission_id);
}
try session.send(CmdID.CmdGetMissionStatusScRsp, rsp); try session.send(CmdID.CmdGetMissionStatusScRsp, rsp);
} }
pub fn onGetTutorialGuideStatus(session: *Session, _: *const Packet, allocator: Allocator) !void { pub fn onGetTutorialGuideStatus(session: *Session, _: *const Packet, allocator: Allocator) !void {
var rsp = protocol.GetTutorialGuideScRsp.init(allocator); var rsp = protocol.GetTutorialGuideScRsp.init(allocator);
const tutorial_guide_config = try Config.loadTutorialGuideConfig(allocator, "resources/TutorialGuideGroup.json");
rsp.retcode = 0; rsp.retcode = 0;
for (Data.TutorialGuideIdList) |id| { for (tutorial_guide_config.tutorial_guide_config.items) |guideConf| {
try rsp.TutorialGuideList.append(protocol.TutorialGuide{ .id = id, .Status = protocol.TutorialStatus.TUTORIAL_FINISH }); try rsp.TutorialGuideList.append(protocol.TutorialGuide{ .id = guideConf.guide_group_id, .Status = protocol.TutorialStatus.TUTORIAL_FINISH });
} }
try session.send(CmdID.CmdGetTutorialGuideScRsp, rsp); try session.send(CmdID.CmdGetTutorialGuideScRsp, rsp);
} }
pub fn onFinishTutorialGuideStatus(session: *Session, _: *const Packet, allocator: Allocator) !void {
var rsp = protocol.FinishTutorialGuideScRsp.init(allocator);
rsp.retcode = 0;
for (Data.TutorialGuideIdList) |id| {
rsp.TutorialGuide = .{ .id = id, .Status = protocol.TutorialStatus.TUTORIAL_FINISH };
}
try session.send(CmdID.CmdFinishTutorialScRsp, rsp);
}
pub fn onGetTutorialStatus(session: *Session, _: *const Packet, allocator: Allocator) !void { pub fn onGetTutorialStatus(session: *Session, _: *const Packet, allocator: Allocator) !void {
var rsp = protocol.GetTutorialScRsp.init(allocator); var rsp = protocol.GetTutorialScRsp.init(allocator);
const tutorial_guide_config = try Config.loadTutorialConfig(allocator, "resources/TutorialData.json");
rsp.retcode = 0; rsp.retcode = 0;
for (Data.FinishedTutorialIdList) |id| { for (tutorial_guide_config.tutorial_config.items) |tutorialConf| {
try rsp.TutorialList.append(protocol.Tutorial{ .id = id, .Status = protocol.TutorialStatus.TUTORIAL_FINISH }); try rsp.TutorialList.append(protocol.Tutorial{ .id = tutorialConf.tutorial_id, .Status = protocol.TutorialStatus.TUTORIAL_FINISH });
} }
try session.send(CmdID.CmdGetTutorialScRsp, rsp); try session.send(CmdID.CmdGetTutorialScRsp, rsp);
} }
@ -57,9 +50,7 @@ pub fn onGetTutorialStatus(session: *Session, _: *const Packet, allocator: Alloc
pub fn onUnlockTutorialGuide(session: *Session, packet: *const Packet, allocator: Allocator) !void { pub fn onUnlockTutorialGuide(session: *Session, packet: *const Packet, allocator: Allocator) !void {
const req = try packet.getProto(protocol.UnlockTutorialGuideCsReq, allocator); const req = try packet.getProto(protocol.UnlockTutorialGuideCsReq, allocator);
var rsp = protocol.UnlockTutorialGuideScRsp.init(allocator); var rsp = protocol.UnlockTutorialGuideScRsp.init(allocator);
rsp.retcode = 0; rsp.retcode = 0;
std.debug.print("UNLOCK TUTORIAL GUIDE ID: {}\n", .{req.group_id}); std.debug.print("UNLOCK TUTORIAL GUIDE ID: {}\n", .{req.group_id});
try session.send(CmdID.CmdUnlockTutorialGuideScRsp, rsp); try session.send(CmdID.CmdUnlockTutorialGuideScRsp, rsp);
} }

View file

@ -3,6 +3,7 @@ const protocol = @import("protocol");
const Session = @import("../Session.zig"); const Session = @import("../Session.zig");
const Packet = @import("../Packet.zig"); const Packet = @import("../Packet.zig");
const Data = @import("../data.zig"); const Data = @import("../data.zig");
const Config = @import("config.zig");
const UidGenerator = @import("item.zig").UidGenerator; const UidGenerator = @import("item.zig").UidGenerator;
const ArrayList = std.ArrayList; const ArrayList = std.ArrayList;
@ -46,10 +47,11 @@ pub fn onGetPlayerBoardData(session: *Session, _: *const Packet, allocator: Allo
var rsp = protocol.GetPlayerBoardDataScRsp.init(allocator); var rsp = protocol.GetPlayerBoardDataScRsp.init(allocator);
var generator = UidGenerator().init(); var generator = UidGenerator().init();
var display_list = protocol.DisplayAvatarVec.init(allocator); var display_list = protocol.DisplayAvatarVec.init(allocator);
const player_icon_config = try Config.loadPlayerIconConfig(allocator, "resources/AvatarPlayerIcon.json");
display_list.is_display = true; display_list.is_display = true;
rsp.retcode = 0; rsp.retcode = 0;
rsp.OLDMJONBJOM = 253000; rsp.OLDMJONBJOM = 253000;
rsp.signature = .{ .Const = "Visit discord.gg/reversedrooms for more info!" }; rsp.signature = .{ .Const = "" };
try rsp.assist_avatar_id_list.appendSlice(&SupportAvatar); try rsp.assist_avatar_id_list.appendSlice(&SupportAvatar);
for (ListAvatar) |id| { for (ListAvatar) |id| {
var A_list = protocol.DisplayAvatarData.init(allocator); var A_list = protocol.DisplayAvatarData.init(allocator);
@ -58,9 +60,9 @@ pub fn onGetPlayerBoardData(session: *Session, _: *const Packet, allocator: Allo
try display_list.display_avatar_list.append(A_list); try display_list.display_avatar_list.append(A_list);
} }
rsp.display_avatar_vec = display_list; rsp.display_avatar_vec = display_list;
for (Data.OwnedHeadIcon) |head_id| { for (player_icon_config.player_icon_config.items) |head_id| {
const head_icon = protocol.HeadIconData{ const head_icon = protocol.HeadIconData{
.id = head_id, .id = head_id.id,
}; };
try rsp.unlocked_head_icon_list.append(head_icon); try rsp.unlocked_head_icon_list.append(head_icon);
} }
@ -104,5 +106,6 @@ pub fn onSetHeadIcon(session: *Session, packet: *const Packet, allocator: Alloca
var rsp = protocol.SetHeadIconScRsp.init(allocator); var rsp = protocol.SetHeadIconScRsp.init(allocator);
rsp.retcode = 0; rsp.retcode = 0;
rsp.current_head_icon_id = req.id; rsp.current_head_icon_id = req.id;
std.debug.print("SET HEAD ICON ID: {}\n", .{req.id});
try session.send(CmdID.CmdSetHeadIconScRsp, rsp); try session.send(CmdID.CmdSetHeadIconScRsp, rsp);
} }

View file

@ -84,7 +84,6 @@ pub fn onGetSceneMapInfo(session: *Session, packet: *const Packet, allocator: Al
.{ .chest_type = protocol.ChestType.MAP_INFO_CHEST_TYPE_CHALLENGE }, .{ .chest_type = protocol.ChestType.MAP_INFO_CHEST_TYPE_CHALLENGE },
.{ .chest_type = protocol.ChestType.MAP_INFO_CHEST_TYPE_PUZZLE }, .{ .chest_type = protocol.ChestType.MAP_INFO_CHEST_TYPE_PUZZLE },
}; };
std.debug.print("SCENE MAP FLOOR ID REQ: {}\n", .{req.floor_id_list});
for (req.floor_id_list.items) |floor_id| { for (req.floor_id_list.items) |floor_id| {
var rsp = protocol.GetSceneMapInfoScRsp.init(allocator); var rsp = protocol.GetSceneMapInfoScRsp.init(allocator);
rsp.retcode = 0; rsp.retcode = 0;
@ -129,9 +128,7 @@ pub fn onGetSceneMapInfo(session: *Session, packet: *const Packet, allocator: Al
try session.send(CmdID.CmdGetSceneMapInfoScRsp, rsp); try session.send(CmdID.CmdGetSceneMapInfoScRsp, rsp);
} }
} }
pub fn onGetUnlockTeleport(session: *Session, packet: *const Packet, allocator: Allocator) !void { pub fn onGetUnlockTeleport(session: *Session, _: *const Packet, allocator: Allocator) !void {
const req = try packet.getProto(protocol.GetUnlockTeleportCsReq, allocator);
std.debug.print("UNLOCK TELEPORT ENTRY ID REQ: {}\n", .{req.entry_id_list});
var rsp = protocol.GetUnlockTeleportScRsp.init(allocator); var rsp = protocol.GetUnlockTeleportScRsp.init(allocator);
const res_config = try Res_config.anchorLoader(allocator, "resources/res.json"); const res_config = try Res_config.anchorLoader(allocator, "resources/res.json");
for (res_config.scene_config.items) |sceneCof| { for (res_config.scene_config.items) |sceneCof| {
@ -216,17 +213,17 @@ pub fn onDeactivateFarmElement(session: *Session, packet: *const Packet, allocat
} }
pub fn onSetGroupCustomSaveData(session: *Session, packet: *const Packet, allocator: Allocator) !void { pub fn onSetGroupCustomSaveData(session: *Session, packet: *const Packet, allocator: Allocator) !void {
const req = try packet.getProto(protocol.SetGroupCustomSaveDataCsReq, allocator); const req = try packet.getProto(protocol.SetGroupCustomSaveDataCsReq, allocator);
switch (req.AAMHHECOCOI) { //switch (req.AAMHHECOCOI) {
.Owned => |val| { // .Owned => |val| {
std.debug.print("CUSTOM SAVE DATA REQ: {s}\n", .{val.str}); // std.debug.print("CUSTOM SAVE DATA REQ: {s}\n", .{val.str});
}, // },
.Const => |val| { // .Const => |val| {
std.debug.print("CUSTOM SAVE DATA REQ: {s}\n", .{val}); // std.debug.print("CUSTOM SAVE DATA REQ: {s}\n", .{val});
}, // },
.Empty => { // .Empty => {
std.debug.print("CUSTOM SAVE DATA REQ: <empty string>\n", .{}); // std.debug.print("CUSTOM SAVE DATA REQ: <empty string>\n", .{});
}, // },
} //}
try session.send(CmdID.CmdSetGroupCustomSaveDataScRsp, protocol.SetGroupCustomSaveDataScRsp{ try session.send(CmdID.CmdSetGroupCustomSaveDataScRsp, protocol.SetGroupCustomSaveDataScRsp{
.retcode = 0, .retcode = 0,
.group_id = req.group_id, .group_id = req.group_id,

View file

@ -14,5 +14,13 @@
"ifix_version": "0", "ifix_version": "0",
"lua_url": "https://autopatchos.starrails.com/lua/BetaLive/output_10025298_1dc728a6c8ee_1128f068b506d4", "lua_url": "https://autopatchos.starrails.com/lua/BetaLive/output_10025298_1dc728a6c8ee_1128f068b506d4",
"lua_version": "" "lua_version": ""
},
"OSBETAWin3.2.53": {
"asset_bundle_url": "https://autopatchos.starrails.com/asb/BetaLive/output_10104345_a5535dc0c779_a36b870100988f",
"ex_resource_url": "https://autopatchos.starrails.com/design_data/BetaLive/output_10114007_b191beeb9546_2f88552ee48ab1",
"ifix_url": "https://autopatchos.starrails.com/ifix/BetaLive/output_0_40d2ce0253_6d871f8bca6eb4",
"ifix_version": "0",
"lua_url": "https://autopatchos.starrails.com/lua/BetaLive/output_10104505_31a450a7e7a3_0793e9a5426e39",
"lua_version": ""
} }
} }

View file

@ -3,9 +3,7 @@
.version = "0.0.0", .version = "0.0.0",
.dependencies = .{ .dependencies = .{
.protobuf = .{ .protobuf = .{
//.url = "https://github.com/Arwalk/zig-protobuf/archive/7c49ed66e029c9c7e6253b3d6d256118745550a4.tar.gz", .url = "https://github.com/Arwalk/zig-protobuf/archive/7c49ed66e029c9c7e6253b3d6d256118745550a4.tar.gz",
.url = "git+https://github.com/Arwalk/zig-protobuf?ref=v2.0.0#42ccf142e5d6b7de886b766af7d287021c561dfd",
.hash = "122063ee7ff32a3c1aefd91a46a9fc23df0571949c3a02e2f44d39afbad0b53018a3", .hash = "122063ee7ff32a3c1aefd91a46a9fc23df0571949c3a02e2f44d39afbad0b53018a3",
}, },
}, },

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,753 @@
{
"player_icon_config": [
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/UI_Message_Contacts_Anonymous.png",
"ID": 200001,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200101.png",
"ID": 200101,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200102.png",
"ID": 200102,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200103.png",
"ID": 200103,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200104.png",
"ID": 200104,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200105.png",
"ID": 200105,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200106.png",
"ID": 200106,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200107.png",
"ID": 200107,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200108.png",
"ID": 200108,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200109.png",
"ID": 200109,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200110.png",
"ID": 200110,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200111.png",
"ID": 200111,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200112.png",
"ID": 200112,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200113.png",
"ID": 200113,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200114.png",
"ID": 200114,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200115.png",
"ID": 200115,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200116.png",
"ID": 200116,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200117.png",
"ID": 200117,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200118.png",
"ID": 200118,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200119.png",
"ID": 200119,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200120.png",
"ID": 200120,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200121.png",
"ID": 200121,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200122.png",
"ID": 200122,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200123.png",
"ID": 200123,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200124.png",
"ID": 200124,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200125.png",
"ID": 200125,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200126.png",
"ID": 200126,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200127.png",
"ID": 200127,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200128.png",
"ID": 200128,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200129.png",
"ID": 200129,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200130.png",
"ID": 200130,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200131.png",
"ID": 200131,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200132.png",
"ID": 200132,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200133.png",
"ID": 200133,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200134.png",
"ID": 200134,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200135.png",
"ID": 200135,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200136.png",
"ID": 200136,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200137.png",
"ID": 200137,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200138.png",
"ID": 200138,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200139.png",
"ID": 200139,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200140.png",
"ID": 200140,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202001.png",
"ID": 202001,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202002.png",
"ID": 202002,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202003.png",
"ID": 202003,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202004.png",
"ID": 202004,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202005.png",
"ID": 202005,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202006.png",
"ID": 202006,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202007.png",
"ID": 202007,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202008.png",
"ID": 202008,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202009.png",
"ID": 202009,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202010.png",
"ID": 202010,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202011.png",
"ID": 202011,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202012.png",
"ID": 202012,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202013.png",
"ID": 202013,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202014.png",
"ID": 202014,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202015.png",
"ID": 202015,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202016.png",
"ID": 202016,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202017.png",
"ID": 202017,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202018.png",
"ID": 202018,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202019.png",
"ID": 202019,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202020.png",
"ID": 202020,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202022.png",
"ID": 202022,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202023.png",
"ID": 202023,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202024.png",
"ID": 202024,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202025.png",
"ID": 202025,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202028.png",
"ID": 202028,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/AvatarSkin/1100101.png",
"ID": 202029,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202031.png",
"ID": 202031,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202033.png",
"ID": 202033,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1001.png",
"ID": 201001,
"IsVisible": true,
"AvatarID": 1001
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1002.png",
"ID": 201002,
"IsVisible": true,
"AvatarID": 1002
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1003.png",
"ID": 201003,
"IsVisible": true,
"AvatarID": 1003
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1004.png",
"ID": 201004,
"IsVisible": true,
"AvatarID": 1004
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1005.png",
"ID": 201005,
"IsVisible": true,
"AvatarID": 1005
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1006.png",
"ID": 201006,
"IsVisible": true,
"AvatarID": 1006
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1008.png",
"ID": 201008,
"IsVisible": true,
"AvatarID": 1008
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1009.png",
"ID": 201009,
"IsVisible": true,
"AvatarID": 1009
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1013.png",
"ID": 201013,
"IsVisible": true,
"AvatarID": 1013
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1101.png",
"ID": 201101,
"IsVisible": true,
"AvatarID": 1101
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1102.png",
"ID": 201102,
"IsVisible": true,
"AvatarID": 1102
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1103.png",
"ID": 201103,
"IsVisible": true,
"AvatarID": 1103
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1104.png",
"ID": 201104,
"IsVisible": true,
"AvatarID": 1104
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1105.png",
"ID": 201105,
"IsVisible": true,
"AvatarID": 1105
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1106.png",
"ID": 201106,
"IsVisible": true,
"AvatarID": 1106
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1107.png",
"ID": 201107,
"IsVisible": true,
"AvatarID": 1107
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1108.png",
"ID": 201108,
"IsVisible": true,
"AvatarID": 1108
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1109.png",
"ID": 201109,
"IsVisible": true,
"AvatarID": 1109
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1110.png",
"ID": 201110,
"IsVisible": true,
"AvatarID": 1110
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1111.png",
"ID": 201111,
"IsVisible": true,
"AvatarID": 1111
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1203.png",
"ID": 201203,
"IsVisible": true,
"AvatarID": 1203
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1204.png",
"ID": 201204,
"IsVisible": true,
"AvatarID": 1204
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1205.png",
"ID": 201205,
"IsVisible": true,
"AvatarID": 1205
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1206.png",
"ID": 201206,
"AvatarID": 1206
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/8001.png",
"ID": 208001,
"IsVisible": true,
"AvatarID": 8001
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/8002.png",
"ID": 208002,
"IsVisible": true,
"AvatarID": 8002
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/8003.png",
"ID": 208003,
"IsVisible": true,
"AvatarID": 8003
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/8004.png",
"ID": 208004,
"IsVisible": true,
"AvatarID": 8004
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/8005.png",
"ID": 208005,
"IsVisible": true,
"AvatarID": 8005
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/8006.png",
"ID": 208006,
"IsVisible": true,
"AvatarID": 8006
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1201.png",
"ID": 201201,
"AvatarID": 1201
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1202.png",
"ID": 201202,
"AvatarID": 1202
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1207.png",
"ID": 201207,
"AvatarID": 1207
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1208.png",
"ID": 201208,
"AvatarID": 1208
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1209.png",
"ID": 201209,
"AvatarID": 1209
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1210.png",
"ID": 201210,
"AvatarID": 1210
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1211.png",
"ID": 201211,
"AvatarID": 1211
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1212.png",
"ID": 201212,
"AvatarID": 1212
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1213.png",
"ID": 201213,
"AvatarID": 1213
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1214.png",
"ID": 201214,
"AvatarID": 1214
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1215.png",
"ID": 201215,
"AvatarID": 1215
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1112.png",
"ID": 201112,
"AvatarID": 1112
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1301.png",
"ID": 201301,
"AvatarID": 1301
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1302.png",
"ID": 201302,
"AvatarID": 1302
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1217.png",
"ID": 201217,
"AvatarID": 1217
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1303.png",
"ID": 201303,
"AvatarID": 1303
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1304.png",
"ID": 201304,
"AvatarID": 1304
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1305.png",
"ID": 201305,
"AvatarID": 1305
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1307.png",
"ID": 201307,
"AvatarID": 1307
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1308.png",
"ID": 201308,
"AvatarID": 1308
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1309.png",
"ID": 201309,
"AvatarID": 1309
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1312.png",
"ID": 201312,
"AvatarID": 1312
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1314.png",
"ID": 201314,
"AvatarID": 1314
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1315.png",
"ID": 201315,
"AvatarID": 1315
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1310.png",
"ID": 201310,
"AvatarID": 1310
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1306.png",
"ID": 201306,
"AvatarID": 1306
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1218.png",
"ID": 201218,
"AvatarID": 1218
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1224.png",
"ID": 201224,
"AvatarID": 1224
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1313.png",
"ID": 201313,
"AvatarID": 1313
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1221.png",
"ID": 201221,
"AvatarID": 1221
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1220.png",
"ID": 201220,
"AvatarID": 1220
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1317.png",
"ID": 201317,
"AvatarID": 1317
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1223.png",
"ID": 201223,
"AvatarID": 1223
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1222.png",
"ID": 201222,
"AvatarID": 1222
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1225.png",
"ID": 201225,
"AvatarID": 1225
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1402.png",
"ID": 201402,
"AvatarID": 1402
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1401.png",
"ID": 201401,
"AvatarID": 1401
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1403.png",
"ID": 201403,
"AvatarID": 1403
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/8007.png",
"ID": 208007,
"AvatarID": 8007
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1404.png",
"ID": 201404,
"AvatarID": 1404
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/8008.png",
"ID": 208008,
"AvatarID": 8008
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1407.png",
"ID": 201407,
"AvatarID": 1407
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1405.png",
"ID": 201405,
"AvatarID": 1405
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1409.png",
"ID": 201409,
"AvatarID": 1409
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1406.png",
"ID": 201406,
"AvatarID": 1406
}
]
}

View file

@ -41,8 +41,7 @@
"Hash": -585545512, "Hash": -585545512,
"hash64": 7610618346915917303 "hash64": 7610618346915917303
}, },
"MazeGroupID1": 2, "MazeGroupID1": 2
"MazeGroupID2": 0
}, },
{ {
"NpcMonsterIDList2": [], "NpcMonsterIDList2": [],
@ -86,8 +85,7 @@
"Hash": 2143337843, "Hash": 2143337843,
"hash64": 17271419042682156335 "hash64": 17271419042682156335
}, },
"MazeGroupID1": 2, "MazeGroupID1": 2
"MazeGroupID2": 0
}, },
{ {
"NpcMonsterIDList2": [], "NpcMonsterIDList2": [],
@ -131,8 +129,7 @@
"Hash": 577253902, "Hash": 577253902,
"hash64": 5150775987177055706 "hash64": 5150775987177055706
}, },
"MazeGroupID1": 2, "MazeGroupID1": 2
"MazeGroupID2": 0
}, },
{ {
"NpcMonsterIDList2": [], "NpcMonsterIDList2": [],
@ -176,8 +173,7 @@
"Hash": -1345060399, "Hash": -1345060399,
"hash64": 7564248973955320288 "hash64": 7564248973955320288
}, },
"MazeGroupID1": 2, "MazeGroupID1": 2
"MazeGroupID2": 0
}, },
{ {
"NpcMonsterIDList2": [], "NpcMonsterIDList2": [],
@ -221,8 +217,7 @@
"Hash": 1383822956, "Hash": 1383822956,
"hash64": 5242189358921793964 "hash64": 5242189358921793964
}, },
"MazeGroupID1": 2, "MazeGroupID1": 2
"MazeGroupID2": 0
}, },
{ {
"NpcMonsterIDList2": [], "NpcMonsterIDList2": [],
@ -267,8 +262,7 @@
"Hash": -182260985, "Hash": -182260985,
"hash64": 15269943691528539554 "hash64": 15269943691528539554
}, },
"MazeGroupID1": 4, "MazeGroupID1": 4
"MazeGroupID2": 0
}, },
{ {
"NpcMonsterIDList2": [], "NpcMonsterIDList2": [],
@ -314,8 +308,7 @@
"Hash": -1748344926, "Hash": -1748344926,
"hash64": 8853592441228331582 "hash64": 8853592441228331582
}, },
"MazeGroupID1": 4, "MazeGroupID1": 4
"MazeGroupID2": 0
}, },
{ {
"NpcMonsterIDList2": [], "NpcMonsterIDList2": [],
@ -361,8 +354,7 @@
"Hash": 1336768789, "Hash": 1336768789,
"hash64": 11639544939584837964 "hash64": 11639544939584837964
}, },
"MazeGroupID1": 4, "MazeGroupID1": 4
"MazeGroupID2": 0
}, },
{ {
"NpcMonsterIDList2": [], "NpcMonsterIDList2": [],
@ -407,8 +399,7 @@
"Hash": -229315152, "Hash": -229315152,
"hash64": 13127512314370178244 "hash64": 13127512314370178244
}, },
"MazeGroupID1": 4, "MazeGroupID1": 4
"MazeGroupID2": 0
}, },
{ {
"NpcMonsterIDList2": [], "NpcMonsterIDList2": [],
@ -454,8 +445,7 @@
"Hash": 1577274280, "Hash": 1577274280,
"hash64": 3433035089102959956 "hash64": 3433035089102959956
}, },
"MazeGroupID1": 4, "MazeGroupID1": 4
"MazeGroupID2": 0
}, },
{ {
"NpcMonsterIDList2": [ "NpcMonsterIDList2": [

48200
resources/MainMission.json Normal file

File diff suppressed because it is too large Load diff

299010
resources/StageConfig.json Normal file

File diff suppressed because it is too large Load diff

13462
resources/TutorialData.json Normal file

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -199568,9 +199568,9 @@
"instId": 200001, "instId": 200001,
"eventId": 99999011, "eventId": 99999011,
"pos": { "pos": {
"x": -714570, "x": 580,
"y": 6270, "y": 8551,
"z": 67130 "z": 54030
}, },
"rot": { "rot": {
"x": 0, "x": 0,