Compare commits

...

7 commits
1.0.0 ... main

Author SHA1 Message Date
6bf275c682 Merge branch 'main' of https://git.xeondev.com/castorice-sr/cipher-sr 2025-05-02 15:31:42 +07:00
0828923c2d fix some issues with lineup 2025-05-02 15:31:07 +07:00
923be22ad5 :Đ fix current map icon display 2025-04-30 10:39:58 +00:00
3075e30f2f added useless stuffs in
added useless stuffs in
	added useless stuffs in
	added useless stuffs in
	added useless stuffs in
	added useless stuffs in
	added useless stuffs in
	added useless stuffs in
	added useless stuffs in
	added useless stuffs in
	added useless stuffs in
	added useless stuffs in
	added useless stuffs in
	added useless stuffs in
	added useless stuffs in
2025-04-29 22:34:15 +07:00
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
33 changed files with 377886 additions and 819 deletions

View file

@ -9,20 +9,20 @@
"promotion": 6,
"rank": 6,
"lightcone": {
"id": 23043,
"rank": 5,
"level": 80,
"promotion": 6
"id": 23043,
"rank": 5,
"level": 80,
"promotion": 6
},
"relics": [
"61261,15,1,4,8:1:1,3:4:4,7:2:2,4:2:2",
"61262,15,1,4,10:1:1,1:3:3,9:4:4,8:1:1",
"61263,15,5,4,2:3:3,4:2:2,12:2:2,6:2:2",
"61264,15,4,4,6:2:2,2:1:1,1:4:4,5:2:2",
"63145,15,9,4,9:1:1,3:2:2,7:4:4,5:2:2",
"63146,15,4,4,1:2:2,3:3:3,4:2:2,2:2:2"
"61261,15,1,4,9:5:5,10:2:2,6:1:1,5:1:1",
"61262,15,1,4,12:1:1,6:3:3,4:2:2,11:3:3",
"61263,15,5,4,7:3:3,6:1:1,2:2:2,4:3:3",
"61264,15,4,4,11:1:1,12:1:1,9:5:5,6:2:2",
"63145,15,7,4,3:3:3,2:2:2,4:3:3,8:1:1",
"63146,15,4,4,9:3:3,2:2:2,3:1:1,6:3:3"
],
"use_technique": true
"use_technique": false
},
{
"name": "Hyacine",
@ -33,20 +33,116 @@
"promotion": 6,
"rank": 6,
"lightcone": {
"id": 23042,
"rank": 5,
"level": 80,
"promotion": 6
"id": 23042,
"rank": 5,
"level": 80,
"promotion": 6
},
"relics": [
"61251,15,1,4,6:1:1,11:2:2,5:2:2,2:4:4",
"61252,15,1,4,5:3:3,4:1:1,7:2:2,10:3:3",
"61253,15,5,4,3:2:2,11:2:2,10:3:3,5:2:2",
"61254,15,4,4,11:3:3,9:3:3,12:1:1,4:2:2",
"63205,15,1,4,3:1:1,8:4:4,9:2:2,2:2:2",
"63206,15,2,4,6:3:3,8:3:3,11:1:1,3:2:2"
"61251,15,1,4,7:3:3,2:2:2,12:3:3,9:1:1",
"61252,15,1,4,7:1:1,12:5:5,10:2:2,3:1:1",
"61253,15,6,4,5:3:3,8:1:1,7:3:3,10:2:2",
"61254,15,4,4,9:1:1,8:4:4,11:2:2,5:2:2",
"63205,15,1,4,7:3:3,8:2:2,10:1:1,2:3:3",
"63206,15,3,4,5:3:3,8:2:2,11:3:3,6:1:1"
],
"use_technique": true
"use_technique": false
},
{
"name": "Anaxa",
"id": 1405,
"hp": 100,
"sp": 50,
"level": 80,
"promotion": 6,
"rank": 6,
"lightcone": {
"id": 23041,
"rank": 5,
"level": 80,
"promotion": 6
},
"relics": [
"61081,15,1,4,12:2:2,6:2:2,2:3:3,10:2:2",
"61082,15,1,4,5:2:2,6:4:4,11:1:1,8:2:2",
"61083,15,5,4,7:3:3,3:1:1,6:3:3,5:2:2",
"61084,15,4,4,12:1:1,8:1:1,9:2:2,4:5:5",
"63175,15,8,4,7:4:4,9:2:2,3:2:2,11:1:1",
"63176,15,2,4,5:4:4,10:2:2,7:2:2,11:1:1"
],
"use_technique": false
},
{
"name": "Castorice",
"id": 1407,
"hp": 100,
"sp": 50,
"level": 80,
"promotion": 6,
"rank": 6,
"lightcone": {
"id": 23040,
"rank": 5,
"level": 80,
"promotion": 6
},
"relics": [
"61241,15,1,4,6:3:3,9:4:4,4:1:1,10:1:1",
"61242,15,1,4,9:2:2,3:1:1,7:4:4,5:2:2",
"61243,15,5,4,7:1:1,3:2:2,10:3:3,6:3:3",
"61244,15,1,4,1:2:2,5:2:2,12:2:2,8:3:3",
"63195,15,1,4,2:3:3,12:1:1,8:2:2,5:3:3",
"63196,15,3,4,9:3:3,6:2:2,8:3:3,3:1:1"
],
"use_technique": false
},
{
"name": "Mydei",
"id": 1404,
"hp": 100,
"sp": 50,
"level": 80,
"promotion": 6,
"rank": 6,
"lightcone": {
"id": 23039,
"rank": 5,
"level": 80,
"promotion": 6
},
"relics": [
"61241,15,1,4,3:2:2,12:2:2,6:2:2,2:3:3",
"61242,15,1,4,5:1:1,6:3:3,10:3:3,9:2:2",
"61243,15,5,4,10:3:3,12:1:1,8:2:2,3:3:3",
"61244,15,1,4,8:2:2,11:2:2,10:2:2,2:3:3",
"63195,15,1,4,12:2:2,7:4:4,3:1:1,8:2:2",
"63196,15,3,4,7:3:3,10:1:1,6:3:3,3:2:2"
],
"use_technique": false
},
{
"name": "Tribbie",
"id": 1403,
"hp": 100,
"sp": 50,
"level": 80,
"promotion": 6,
"rank": 6,
"lightcone": {
"id": 23038,
"rank": 5,
"level": 80,
"promotion": 6
},
"relics": [
"61241,15,1,4,9:3:3,11:2:2,12:2:2,2:2:2",
"61242,15,1,4,1:1:1,12:2:2,6:4:4,9:2:2",
"61243,15,5,4,6:3:3,1:2:2,7:3:3,11:1:1",
"61244,15,1,4,1:2:2,2:2:2,3:1:1,8:4:4",
"63195,15,1,4,8:3:3,3:2:2,2:2:2,11:2:2",
"63196,15,2,4,9:3:3,11:3:3,7:2:2,6:1:1"
],
"use_technique": false
},
{
"name": "Trailblazer",
@ -57,58 +153,197 @@
"promotion": 6,
"rank": 6,
"lightcone": {
"id": 23042,
"rank": 5,
"level": 80,
"promotion": 6
"id": 24005,
"rank": 5,
"level": 80,
"promotion": 6
},
"relics": [
"61261,15,1,4,12:3:3,11:2:2,8:3:3,2:1:1",
"61262,15,1,4,3:3:3,8:2:2,6:2:2,1:2:2",
"61263,15,5,4,12:1:1,5:2:2,7:3:3,4:3:3",
"61264,15,4,4,6:1:1,9:3:3,2:3:3,1:2:2",
"63145,15,6,4,7:4:4,8:1:1,3:2:2,12:2:2",
"63146,15,2,4,8:2:2,6:3:3,10:3:3,1:1:1"
"61231,15,1,4,6:2:2,3:1:1,7:3:3,11:3:3",
"61232,15,1,4,9:2:2,8:3:3,7:2:2,3:2:2",
"61233,15,5,4,5:2:2,7:3:3,4:3:3,8:1:1",
"61234,15,4,4,4:3:3,11:2:2,5:3:3,12:1:1",
"63185,15,6,4,7:2:2,11:3:3,6:3:3,2:1:1",
"63186,15,2,4,8:2:2,1:3:3,5:2:2,6:2:2"
],
"use_technique": true
"use_technique": false
},
{
"name": "Acheron",
"id": 1308,
"name": "March 7th",
"id": 1001,
"hp": 100,
"sp": 50,
"level": 80,
"promotion": 6,
"rank": 6,
"lightcone": {
"id": 23024,
"rank": 5,
"level": 80,
"promotion": 6
"id": 23023,
"rank": 5,
"level": 80,
"promotion": 6
},
"relics": [
"61171,15,1,4,9:2:2,12:2:2,8:3:3,6:2:2",
"61172,15,1,4,8:4:4,4:3:3,5:1:1,6:1:1",
"61173,15,5,4,3:1:1,12:3:3,11:3:3,7:2:2",
"61174,15,4,4,5:1:1,11:2:2,4:4:4,6:2:2",
"63145,15,7,4,9:2:2,4:1:1,6:2:2,2:4:4",
"63146,15,4,4,4:2:2,7:3:3,1:2:2,2:2:2"
"61031,15,1,4,8:2:2,2:2:2,5:2:2,7:3:3",
"61032,15,1,4,10:3:3,7:1:1,3:2:2,5:3:3",
"61033,15,5,4,6:3:3,8:3:3,11:1:1,4:2:2",
"61034,15,4,4,6:2:2,9:2:2,3:2:2,10:3:3",
"63085,15,6,4,5:1:1,4:3:3,7:4:4,6:1:1",
"63186,15,2,4,10:3:3,1:1:1,9:3:3,11:2:2"
],
"use_technique": true
"use_technique": false
},
{
"name": "Aglaea",
"id": 1402,
"hp": 100,
"sp": 50,
"level": 80,
"promotion": 6,
"rank": 6,
"lightcone": {
"id": 23036,
"rank": 5,
"level": 80,
"promotion": 6
},
"relics": [
"61231,15,1,4,3:1:1,9:2:2,12:3:3,8:3:3",
"61232,15,1,4,12:3:3,4:2:2,3:2:2,11:2:2",
"61233,15,5,4,2:3:3,3:2:2,6:2:2,5:2:2",
"61234,15,4,4,6:1:1,2:2:2,4:3:3,3:3:3",
"63185,15,7,4,7:4:4,10:2:2,11:1:1,5:2:2",
"63186,15,4,4,8:4:4,3:1:1,1:2:2,9:2:2"
],
"use_technique": false
},
{
"name": "The Herta",
"id": 1401,
"hp": 100,
"sp": 50,
"level": 80,
"promotion": 6,
"rank": 6,
"lightcone": {
"id": 23037,
"rank": 5,
"level": 80,
"promotion": 6
},
"relics": [
"61221,15,1,4,7:2:2,2:3:3,9:1:1,12:3:3",
"61222,15,1,4,11:2:2,5:2:2,1:2:2,10:3:3",
"61223,15,5,4,10:3:3,12:2:2,5:3:3,4:1:1",
"61224,15,4,4,5:2:2,2:1:1,6:3:3,3:3:3",
"63145,15,6,4,8:2:2,1:1:1,5:3:3,12:3:3",
"63146,15,4,4,11:2:2,8:2:2,1:3:3,9:2:2"
],
"use_technique": false
},
{
"name": "Fugue",
"id": 1225,
"hp": 100,
"sp": 50,
"level": 80,
"promotion": 6,
"rank": 6,
"lightcone": {
"id": 23035,
"rank": 5,
"level": 80,
"promotion": 6
},
"relics": [
"61191,15,1,4,11:3:3,12:1:1,4:3:3,7:2:2",
"61192,15,1,4,9:3:3,12:1:1,1:2:2,7:3:3",
"61193,15,7,4,5:2:2,1:3:3,9:2:2,7:2:2",
"61194,15,4,4,8:1:1,12:1:1,2:4:4,4:3:3",
"63165,15,2,4,12:2:2,6:2:2,2:1:1,7:4:4",
"63166,15,1,4,10:1:1,4:4:4,3:2:2,7:2:2"
],
"use_technique": false
},
{
"name": "Sunday",
"id": 1313,
"hp": 100,
"sp": 50,
"level": 80,
"promotion": 6,
"rank": 6,
"lightcone": {
"id": 23034,
"rank": 5,
"level": 80,
"promotion": 6
},
"relics": [
"61211,15,1,4,8:2:2,9:3:3,4:3:3,2:1:1",
"61212,15,1,4,9:3:3,4:3:3,7:2:2,8:1:1",
"61213,15,5,4,4:1:1,11:3:3,8:3:3,10:2:2",
"61214,15,4,4,12:3:3,10:3:3,1:2:2,8:1:1",
"63085,15,2,4,7:3:3,3:1:1,9:2:2,11:3:3",
"63086,15,2,4,9:1:1,12:3:3,4:2:2,8:3:3"
],
"use_technique": false
},
{
"name": "Rappa",
"id": 1317,
"hp": 100,
"sp": 50,
"level": 80,
"promotion": 6,
"rank": 6,
"lightcone": {
"id": 23033,
"rank": 5,
"level": 80,
"promotion": 6
},
"relics": [
"61191,15,1,4,12:1:1,3:3:3,6:4:4,7:1:1",
"61192,15,1,4,1:2:2,12:2:2,5:1:1,9:4:4",
"61193,15,2,4,7:2:2,2:3:3,6:2:2,1:2:2",
"61194,15,4,4,1:2:2,2:3:3,10:2:2,11:2:2",
"63165,15,2,4,1:2:2,2:1:1,12:4:4,4:2:2",
"63166,15,2,4,5:3:3,6:2:2,10:2:2,9:2:2"
],
"use_technique": false
},
{
"name": "Lingsha",
"id": 1222,
"hp": 100,
"sp": 50,
"level": 80,
"promotion": 6,
"rank": 6,
"lightcone": {
"id": 23032,
"rank": 5,
"level": 80,
"promotion": 6
},
"relics": [
"61191,15,1,4,11:2:2,9:4:4,5:2:2,2:1:1",
"61192,15,1,4,7:1:1,1:4:4,6:3:3,3:1:1",
"61193,15,6,4,11:2:2,8:2:2,7:2:2,9:3:3",
"61194,15,4,4,6:1:1,1:3:3,8:2:2,12:3:3",
"63165,15,2,4,1:4:4,8:1:1,4:2:2,2:2:2",
"63166,15,2,4,12:3:3,10:3:3,9:2:2,8:1:1"
],
"use_technique": false
}
],
"battle_config": {
"battle_id": 1,
"stage_id": 30114122,
"stage_id": 201012311,
"cycle_count": 30,
"monster_wave": [
[
4033010,
4033030,
4032030
],
[
2034010
4015011
]
],
"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 OSPROD_HOST = "prod-official-asia-dp01.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 {
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 "";
std.log.info("Get DispatchSeed >> {s}", .{dispatch_seed});
const host = selectHost(version);
var gatewayUrl: []const u8 = undefined;
//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});
}
const gatewayUrl = constructUrl(host, version, dispatch_seed);
std.log.info("Constructed Gateway URL >> {s}", .{gatewayUrl});
const hotfix = try hotfixInfo.Parser(res.arena, "hotfix.json", version);
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});
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;
iFixUrl = hotfix.iFixUrl;
if (assetBundleUrl.len == 0 or exResourceUrl.len == 0 or luaUrl.len == 0 or iFixUrl.len == 0) {
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;
iFixUrl = gateserver_proto.ifix_url.Owned.str;
try hotfixInfo.putValue(version, assetBundleUrl, exResourceUrl, luaUrl, iFixUrl);
}
}
std.log.info("Get AssetBundleUrl >> {s}", .{assetBundleUrl});
std.log.info("Get ExResourceUrl >> {s}", .{exResourceUrl});
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.enable_android_middle_package = 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_version_update = true;
}
proto.enable_design_data_version_update = true;
proto.enable_version_update = true;
proto.mtp_switch = true;
proto.forbid_recharge = true;
proto.close_redeem_code = true;
@ -195,10 +149,6 @@ pub fn selectHost(version: []const u8) []const u8 {
return OSPROD_HOST;
} else if (std.mem.startsWith(u8, version, "OSBETA")) {
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 {
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 {
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 "";
}

View file

@ -5,6 +5,7 @@ const protocol = @import("protocol");
const Packet = @import("../Packet.zig");
const Config = @import("../services/config.zig");
const Data = @import("../data.zig");
const LineupManager = @import("../manager/lineup_mgr.zig");
const ArrayList = std.ArrayList;
const Allocator = std.mem.Allocator;
@ -21,13 +22,16 @@ fn isInList(id: u32, list: []const u32) bool {
return false;
}
pub var max_avatar_list: u32 = 0;
fn syncItems(session: *Session, allocator: Allocator, equip_avatar: bool) !void {
resetGlobalUidGens();
var sync = protocol.PlayerSyncScNotify.init(allocator);
const config = try Config.loadGameConfig(allocator, "config.json");
for (config.avatar_config.items) |avatarConf| {
const equip_avatar_id: u32 = if (equip_avatar) avatarConf.id else 0;
const lc = protocol.Equipment{
.unique_id = if (equip_avatar) nextGlobalId(.Default) else nextGlobalId(.Undress),
.unique_id = if (equip_avatar) nextGlobalId() else nextGlobalId(),
.tid = avatarConf.lightcone.id,
.is_protected = true,
.level = avatarConf.lightcone.level,
@ -40,7 +44,7 @@ fn syncItems(session: *Session, allocator: Allocator, equip_avatar: bool) !void
var r = protocol.Relic{
.tid = input.id,
.main_affix_id = input.main_affix_id,
.unique_id = if (equip_avatar) nextGlobalId(.Default) else nextGlobalId(.Undress),
.unique_id = if (equip_avatar) nextGlobalId() else nextGlobalId(),
.exp = 0,
.equip_avatar_id = equip_avatar_id,
.is_protected = true,
@ -58,12 +62,15 @@ fn syncItems(session: *Session, allocator: Allocator, equip_avatar: bool) !void
try session.send(CmdID.CmdPlayerSyncScNotify, sync);
}
pub fn onSyncEquipment(session: *Session, _: []const u8, allocator: Allocator) Error!void {
pub fn onUndressEquipment(session: *Session, _: []const u8, allocator: Allocator) Error!void {
try syncItems(session, allocator, false);
}
pub fn onSyncEquipment(session: *Session, _: []const u8, allocator: Allocator) Error!void {
try syncItems(session, allocator, true);
}
pub fn onSyncAvatar(session: *Session, _: []const u8, allocator: Allocator) Error!void {
resetGlobalUidGens();
var sync = protocol.PlayerSyncScNotify.init(allocator);
const config = try Config.loadGameConfig(allocator, "config.json");
var char = protocol.AvatarSync.init(allocator);
@ -103,15 +110,13 @@ pub fn onSyncAvatar(session: *Session, _: []const u8, allocator: Allocator) Erro
avatar.level = avatarConf.level;
avatar.promotion = avatarConf.promotion;
avatar.rank = avatarConf.rank;
avatar.equipment_unique_id = nextGlobalId(.Avatar);
std.debug.print("LIGHTCONE SYNC {}\n", .{avatar.equipment_unique_id});
avatar.equipment_unique_id = nextGlobalId();
avatar.equip_relic_list = ArrayList(protocol.EquipRelic).init(allocator);
for (0..6) |i| {
try avatar.equip_relic_list.append(.{
.relic_unique_id = nextGlobalId(.Avatar), // uid
.relic_unique_id = nextGlobalId(), // uid
.type = @intCast(i), // slot
});
std.debug.print("EQUIPING SYNC {}:{}:{}\n", .{ avatarConf.id, avatar.equip_relic_list.items[i].relic_unique_id, i });
}
var talentLevel: u32 = 0;
const skill_list: []const u32 = if (isInList(avatar.base_avatar_id, &Data.Rem)) &Data.skills else &Data.skills_old;
@ -128,13 +133,13 @@ pub fn onSyncAvatar(session: *Session, _: []const u8, allocator: Allocator) Erro
try char.avatar_list.append(avatar);
const avatarType: protocol.MultiPathAvatarType = @enumFromInt(avatarConf.id);
if (@intFromEnum(avatarType) > 1) {
std.debug.print("setting avatar type: {}\n", .{avatarConf.id});
try session.send(CmdID.CmdSetAvatarPathScRsp, protocol.SetAvatarPathScRsp{
.retcode = 0,
.avatar_id = avatarType,
});
}
}
max_avatar_list = @intCast(config.avatar_config.items.len);
sync.avatar_sync = char;
try session.send(CmdID.CmdPlayerSyncScNotify, sync);
}
@ -142,7 +147,7 @@ pub fn onSyncAvatar(session: *Session, _: []const u8, allocator: Allocator) Erro
pub fn onSyncMultiPath(session: *Session, _: []const u8, allocator: Allocator) Error!void {
var sync = protocol.PlayerSyncScNotify.init(allocator);
const config = try Config.loadGameConfig(allocator, "config.json");
const currentAvatarId = getCurrentGlobalId(.Avatar);
const currentAvatarId = getCurrentGlobalId();
const GeneratorType = UidGen();
const avatar_ids = [_][]const u32{
&[_]u32{ 8001, 8002 },
@ -172,8 +177,13 @@ pub fn onSyncMultiPath(session: *Session, _: []const u8, allocator: Allocator) E
counts[i] += 1;
for (avatar_ids[i]) |id| {
if (avatar.id == id) {
if (avatar.id >= 8001 and avatar.id <= 8008) {
LineupManager.mc_id = avatar.id;
} else {
LineupManager.m7_id = avatar.id;
}
multis[i].rank = avatar.rank;
indexes[i] = 5 - counts[i];
indexes[i] = max_avatar_list + 1 - counts[i];
}
}
}
@ -215,30 +225,25 @@ pub fn onSyncMultiPath(session: *Session, _: []const u8, allocator: Allocator) E
try session.send(CmdID.CmdPlayerSyncScNotify, sync);
}
pub const UidType = enum { Default, Undress, Avatar };
pub var global_uid_gen = UidGenerator.init(.Default, 28);
pub var global_uid_gen_undress = UidGenerator.init(.Undress, 0);
pub var global_uid_gen_avatar = UidGenerator.init(.Avatar, 28);
pub fn nextGlobalId(uid_type: UidType) u32 {
return switch (uid_type) {
.Default => global_uid_gen.nextId(),
.Undress => global_uid_gen_undress.nextId(),
.Avatar => global_uid_gen_avatar.nextId(),
};
pub var global_uid_gen: UidGenerator = undefined;
fn resetGlobalUidGens() void {
global_uid_gen = UidGenerator.init(0);
}
pub fn getCurrentGlobalId(uid_type: UidType) u32 {
return switch (uid_type) {
.Default => global_uid_gen.getCurrentId(),
.Undress => global_uid_gen_undress.getCurrentId(),
.Avatar => global_uid_gen_avatar.getCurrentId(),
};
pub fn nextGlobalId() u32 {
return global_uid_gen.nextId();
}
pub fn getCurrentGlobalId() u32 {
return global_uid_gen.getCurrentId();
}
pub const UidGenerator = struct {
current_id: u32,
uid_type: UidType,
pub fn init(uid_type: UidType, start_id: u32) UidGenerator {
return UidGenerator{ .uid_type = uid_type, .current_id = start_id };
pub fn init(start_id: u32) UidGenerator {
return UidGenerator{ .current_id = start_id };
}
pub fn nextId(self: *UidGenerator) u32 {
@ -250,22 +255,30 @@ pub const UidGenerator = struct {
return self.current_id;
}
};
pub fn UidGen() type {
return struct {
current_id: u32,
const Self = @This();
pub fn init(initial_id: u32) Self {
return Self{ .current_id = initial_id };
pub fn init(start_id: u32) Self {
return Self{ .current_id = start_id };
}
pub fn nextId(self: *Self) u32 {
self.current_id +%= 1;
self.current_id += 1;
return self.current_id;
}
pub fn getCurrentId(self: *const Self) u32 {
return self.current_id;
}
};
}
pub fn onGenerateAndSync(session: *Session, placeholder: []const u8, allocator: Allocator) Error!void {
try commandhandler.sendMessage(session, "Sync items with config\n", allocator);
try onSyncEquipment(session, placeholder, allocator);
try onSyncAvatar(session, placeholder, allocator);
try syncItems(session, allocator, false);
try syncItems(session, allocator, true);
try onSyncMultiPath(session, placeholder, allocator);
}

File diff suppressed because one or more lines are too long

View file

@ -42,6 +42,7 @@ const HandlerList = [_]struct { CmdID, Action }{
.{ CmdID.CmdDressAvatarSkinCsReq, avatar.onDressAvatarSkin },
.{ CmdID.CmdGetBigDataAllRecommendCsReq, avatar.onGetBigDataAll },
.{ CmdID.CmdGetBigDataRecommendCsReq, avatar.onGetBigData },
.{ CmdID.CmdGetPreAvatarGrowthInfoCsReq, avatar.onGetPreAvatarGrowthInfo },
//bag
.{ CmdID.CmdGetBagCsReq, item.onGetBag },
.{ CmdID.CmdUseItemCsReq, item.onUseItem },
@ -57,6 +58,8 @@ const HandlerList = [_]struct { CmdID, Action }{
.{ CmdID.CmdQuickStartCocoonStageCsReq, battle.onQuickStartCocoonStage },
.{ CmdID.CmdQuickStartFarmElementCsReq, battle.onQuickStartFarmElement },
.{ CmdID.CmdStartBattleCollegeCsReq, battle.onStartBattleCollege },
.{ CmdID.CmdGetCurBattleInfoCsReq, battle.onGetCurBattleInfo },
.{ CmdID.CmdSyncClientResVersionCsReq, battle.onSyncClientResVersion },
//gacha
.{ CmdID.CmdGetGachaInfoCsReq, gacha.onGetGachaInfo },
.{ CmdID.CmdBuyGoodsCsReq, gacha.onBuyGoods },
@ -83,7 +86,6 @@ const HandlerList = [_]struct { CmdID, Action }{
.{ CmdID.CmdGetTutorialGuideCsReq, mission.onGetTutorialGuideStatus },
.{ CmdID.CmdGetMissionStatusCsReq, mission.onGetMissionStatus },
.{ CmdID.CmdGetTutorialCsReq, mission.onGetTutorialStatus },
.{ CmdID.CmdFinishTutorialGuideCsReq, mission.onFinishTutorialGuideStatus },
.{ CmdID.CmdUnlockTutorialGuideCsReq, mission.onUnlockTutorialGuide },
//chat
.{ CmdID.CmdGetFriendListInfoCsReq, chat.onGetFriendListInfo },
@ -105,13 +107,16 @@ const HandlerList = [_]struct { CmdID, Action }{
.{ CmdID.CmdChangePropTimelineInfoCsReq, scene.onChangePropTimeline },
.{ CmdID.CmdDeactivateFarmElementCsReq, scene.onDeactivateFarmElement },
.{ CmdID.CmdSetGroupCustomSaveDataCsReq, scene.onSetGroupCustomSaveData },
.{ CmdID.CmdGetEnteredSceneCsReq, scene.onGetEnteredScene },
//events
.{ CmdID.CmdGetActivityScheduleConfigCsReq, events.onGetActivity },
.{ CmdID.CmdUpdateServerPrefsDataCsReq, events.onUpdateServerPrefsData },
//challenge
.{ CmdID.CmdGetChallengeCsReq, challenge.onGetChallenge },
.{ CmdID.CmdGetChallengeGroupStatisticsCsReq, challenge.onGetChallengeGroupStatistics },
.{ CmdID.CmdStartChallengeCsReq, challenge.onStartChallenge },
.{ CmdID.CmdLeaveChallengeCsReq, challenge.onLeaveChallenge },
.{ CmdID.CmdGetCurChallengeCsReq, challenge.onGetCurChallengeScRsp },
};
const DummyCmdList = [_]struct { CmdID, CmdID }{
@ -123,21 +128,18 @@ const DummyCmdList = [_]struct { CmdID, CmdID }{
.{ CmdID.CmdGetAllServerPrefsDataCsReq, CmdID.CmdGetAllServerPrefsDataScRsp },
.{ CmdID.CmdGetMissionDataCsReq, CmdID.CmdGetMissionDataScRsp },
.{ CmdID.CmdGetQuestDataCsReq, CmdID.CmdGetQuestDataScRsp },
.{ CmdID.CmdGetCurChallengeCsReq, CmdID.CmdGetCurChallengeScRsp },
.{ CmdID.CmdGetRogueCommonDialogueDataCsReq, CmdID.CmdGetRogueCommonDialogueDataScRsp },
.{ CmdID.CmdGetRogueInfoCsReq, CmdID.CmdGetRogueInfoScRsp },
.{ CmdID.CmdGetRogueHandbookDataCsReq, CmdID.CmdGetRogueHandbookDataScRsp },
.{ CmdID.CmdGetRogueEndlessActivityDataCsReq, CmdID.CmdGetRogueEndlessActivityDataScRsp },
.{ CmdID.CmdChessRogueQueryCsReq, CmdID.CmdChessRogueQueryScRsp },
.{ CmdID.CmdRogueTournQueryCsReq, CmdID.CmdRogueTournQueryScRsp },
.{ CmdID.CmdSyncClientResVersionCsReq, CmdID.CmdSyncClientResVersionScRsp },
.{ CmdID.CmdDailyFirstMeetPamCsReq, CmdID.CmdDailyFirstMeetPamScRsp },
.{ CmdID.CmdGetBattleCollegeDataCsReq, CmdID.CmdGetBattleCollegeDataScRsp },
.{ CmdID.CmdGetNpcStatusCsReq, CmdID.CmdGetNpcStatusScRsp },
.{ CmdID.CmdGetSecretKeyInfoCsReq, CmdID.CmdGetSecretKeyInfoScRsp },
.{ CmdID.CmdGetHeartDialInfoCsReq, CmdID.CmdGetHeartDialInfoScRsp },
.{ CmdID.CmdGetVideoVersionKeyCsReq, CmdID.CmdGetVideoVersionKeyScRsp },
.{ CmdID.CmdGetCurBattleInfoCsReq, CmdID.CmdGetCurBattleInfoScRsp },
.{ CmdID.CmdHeliobusActivityDataCsReq, CmdID.CmdHeliobusActivityDataScRsp },
.{ CmdID.CmdGetAetherDivideInfoCsReq, CmdID.CmdGetAetherDivideInfoScRsp },
.{ CmdID.CmdGetMapRotationDataCsReq, CmdID.CmdGetMapRotationDataScRsp },
@ -162,7 +164,6 @@ const DummyCmdList = [_]struct { CmdID, CmdID }{
.{ CmdID.CmdRogueArcadeGetInfoCsReq, CmdID.CmdRogueArcadeGetInfoScRsp },
.{ CmdID.CmdGetMissionMessageInfoCsReq, CmdID.CmdGetMissionMessageInfoScRsp },
.{ CmdID.CmdTrainPartyGetDataCsReq, CmdID.CmdTrainPartyGetDataScRsp },
.{ CmdID.CmdGetEnteredSceneCsReq, CmdID.CmdGetEnteredSceneScRsp },
.{ CmdID.CmdQueryProductInfoCsReq, CmdID.CmdQueryProductInfoScRsp },
.{ CmdID.CmdGetPamSkinDataCsReq, CmdID.CmdGetPamSkinDataScRsp },
.{ CmdID.CmdGetRogueScoreRewardInfoCsReq, CmdID.CmdGetRogueScoreRewardInfoScRsp },
@ -206,7 +207,6 @@ const DummyCmdList = [_]struct { CmdID, CmdID }{
.{ CmdID.CmdTarotBookGetDataCsReq, CmdID.CmdTarotBookGetDataScRsp },
.{ CmdID.CmdGetMarkChestCsReq, CmdID.CmdGetMarkChestScRsp },
.{ CmdID.CmdMatchThreeGetDataCsReq, CmdID.CmdMatchThreeGetDataScRsp },
.{ CmdID.CmdUpdateServerPrefsDataCsReq, CmdID.CmdUpdateServerPrefsDataScRsp },
.{ CmdID.CmdUpdateTrackMainMissionIdCsReq, CmdID.CmdUpdateTrackMainMissionIdScRsp },
.{ CmdID.CmdGetNpcMessageGroupCsReq, CmdID.CmdGetNpcMessageGroupScRsp },
.{ CmdID.CmdGetAllSaveRaidCsReq, CmdID.CmdGetAllSaveRaidScRsp },
@ -219,7 +219,6 @@ const DummyCmdList = [_]struct { CmdID, CmdID }{
.{ CmdID.CmdRelicSmartWearGetPlanCsReq, CmdID.CmdRelicSmartWearGetPlanScRsp },
.{ CmdID.CmdRelicSmartWearGetPinRelicCsReq, CmdID.CmdRelicSmartWearGetPinRelicScRsp },
.{ CmdID.CmdSetGrowthTargetAvatarCsReq, CmdID.CmdSetGrowthTargetAvatarScRsp },
//.{ CmdID.CmdGetStoryTokenActivityDataCsReq, CmdID.CmdGetStoryTokenActivityDataScRsp },
};
const SuppressLogList = [_]CmdID{CmdID.CmdSceneEntityMoveCsReq};

View file

@ -4,12 +4,15 @@ const Session = @import("../Session.zig");
const Packet = @import("../Packet.zig");
const Config = @import("../services/config.zig");
const Data = @import("../data.zig");
const ChallengeData = @import("../services/challenge.zig");
const ArrayList = std.ArrayList;
const Allocator = std.mem.Allocator;
const CmdID = protocol.CmdID;
// function to check the list if true
pub var selectedAvatarID = [_]u32{ 1304, 1313, 1406, 1004 };
// Function to check if an ID is in a list
fn isInList(id: u32, list: []const u32) bool {
for (list) |item| {
if (item == id) {
@ -18,227 +21,7 @@ fn isInList(id: u32, list: []const u32) bool {
}
return false;
}
pub const BattleManager = struct {
allocator: std.mem.Allocator,
pub fn init(allocator: std.mem.Allocator) BattleManager {
return BattleManager{ .allocator = allocator };
}
pub fn createBattle(self: *BattleManager) !protocol.SceneBattleInfo {
const config = try Config.loadGameConfig(self.allocator, "config.json");
var battle = protocol.SceneBattleInfo.init(self.allocator);
const BattleBuff = protocol.BattleBuff;
// Avatar handler
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;
// Relics
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);
}
// Lightcone (LC)
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);
//max trace
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);
}
// enable technique
if (avatarConf.use_technique) {
var targetIndexList = ArrayList(u32).init(self.allocator);
try targetIndexList.append(0);
//Add new ID when modifying for new patch
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);
}
// Basic battle info
battle.battle_id = config.battle_config.battle_id;
battle.stage_id = config.battle_config.stage_id;
battle.logic_random_seed = @intCast(@mod(std.time.timestamp(), 0xFFFFFFFF));
battle.rounds_limit = config.battle_config.cycle_count;
battle.monster_wave_length = @intCast(config.battle_config.monster_wave.items.len);
battle.world_level = 6;
// Monster handler
for (config.battle_config.monster_wave.items) |wave| {
var monster_wave = protocol.SceneMonsterWave.init(self.allocator);
monster_wave.wave_param = protocol.SceneMonsterWaveParam{ .level = config.battle_config.monster_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 (config.battle_config.blessings.items) |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(config.battle_config.monster_wave.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 {
fn createBattleRelic(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{
.id = id,
.main_affix_id = main_affix_id,
@ -249,6 +32,305 @@ pub fn relicCoder(allocator: Allocator, id: u32, level: u32, main_affix_id: u32,
try relic.sub_affix_list.append(protocol.RelicAffix{ .affix_id = stat2, .cnt = cnt2, .step = step2 });
try relic.sub_affix_list.append(protocol.RelicAffix{ .affix_id = stat3, .cnt = cnt3, .step = step3 });
try relic.sub_affix_list.append(protocol.RelicAffix{ .affix_id = stat4, .cnt = cnt4, .step = step4 });
return relic;
}
fn createBattleAvatar(allocator: Allocator, avatarConf: Config.Avatar) !protocol.BattleAvatar {
var avatar = protocol.BattleAvatar.init(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;
// Relics
for (avatarConf.relics.items) |relic| {
const r = try createBattleRelic(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);
}
// Lightcone
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);
// Skills
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);
}
return avatar;
}
// Function to add technique buffs
fn addTechniqueBuffs(allocator: Allocator, battle: *protocol.SceneBattleInfo, avatar: protocol.BattleAvatar, avatarConf: Config.Avatar, avatar_index: u32) !void {
if (!avatarConf.use_technique) return;
var targetIndexList = ArrayList(u32).init(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 = protocol.BattleBuff{
.id = buffId,
.level = 1,
.owner_index = @intCast(avatar_index),
.wave_flag = 1,
.target_index_list = targetIndexList,
.dynamic_values = ArrayList(protocol.BattleBuff.DynamicValuesEntry).init(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 = protocol.BattleBuff{
.id = 1000119, //for is_ignore toughness
.level = 1,
.owner_index = @intCast(avatar_index),
.wave_flag = 1,
.target_index_list = targetIndexList,
.dynamic_values = ArrayList(protocol.BattleBuff.DynamicValuesEntry).init(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(avatar_index),
.wave_flag = 1,
.target_index_list = targetIndexList,
.dynamic_values = ArrayList(protocol.BattleBuff.DynamicValuesEntry).init(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 = protocol.BattleBuff{
.id = 1000112, //for firefly tech
.level = 1,
.owner_index = @intCast(avatar_index),
.wave_flag = 1,
.target_index_list = targetIndexList,
.dynamic_values = ArrayList(protocol.BattleBuff.DynamicValuesEntry).init(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 = protocol.BattleBuff{
.id = 800701, //for rmc tech
.level = 1,
.owner_index = @intCast(avatar_index),
.wave_flag = 1,
.target_index_list = targetIndexList,
.dynamic_values = ArrayList(protocol.BattleBuff.DynamicValuesEntry).init(allocator),
};
try buff_rmc.dynamic_values.append(.{ .key = .{ .Const = "SkillIndex" }, .value = 0 });
try battle.buff_list.append(buff_rmc);
}
}
// Function to add future global buff.
fn addGolbalPassive(allocator: Allocator, battle: *protocol.SceneBattleInfo, wave_flag: u32) !void {
if (isInList(1407, Data.AllAvatars)) { //support Castorice
var targetIndexList = ArrayList(u32).init(allocator);
try targetIndexList.append(0);
var mazebuff_data = protocol.BattleBuff{
.id = 140703,
.level = 1,
.owner_index = 1,
.wave_flag = wave_flag,
.target_index_list = targetIndexList,
.dynamic_values = ArrayList(protocol.BattleBuff.DynamicValuesEntry).init(allocator),
};
try mazebuff_data.dynamic_values.append(.{ .key = .{ .Const = "SkillIndex" }, .value = 0 });
try battle.buff_list.append(mazebuff_data);
}
}
fn createBattleInfo(allocator: Allocator, config: Config.GameConfig, stage_monster_wave_len: u32, stage_id: u32, rounds_limit: u32) protocol.SceneBattleInfo {
var battle = protocol.SceneBattleInfo.init(allocator);
battle.battle_id = config.battle_config.battle_id;
battle.stage_id = stage_id;
battle.logic_random_seed = @intCast(@mod(std.time.timestamp(), 0xFFFFFFFF));
battle.rounds_limit = rounds_limit;
battle.monster_wave_length = @intCast(stage_monster_wave_len);
battle.world_level = 6;
return battle;
}
fn addMonsterWaves(allocator: Allocator, battle: *protocol.SceneBattleInfo, monster_wave_configs: std.ArrayList(std.ArrayList(u32)), monster_level: u32) !void { // Added monster_level
for (monster_wave_configs.items) |wave| {
var monster_wave = protocol.SceneMonsterWave.init(allocator);
monster_wave.wave_param = protocol.SceneMonsterWaveParam{ .level = monster_level };
for (wave.items) |mob_id| {
try monster_wave.monster_list.append(.{ .monster_id = mob_id });
}
try battle.monster_wave_list.append(monster_wave);
}
}
fn addStageBlessings(allocator: Allocator, battle: *protocol.SceneBattleInfo, blessings: []const u32) !void {
for (blessings) |blessing| {
var targetIndexList = ArrayList(u32).init(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(allocator),
};
try buff.dynamic_values.append(.{ .key = .{ .Const = "SkillIndex" }, .value = 0 });
try battle.buff_list.append(buff);
}
}
fn addBattleTargets(allocator: Allocator, battle: *protocol.SceneBattleInfo) !void {
// PF/AS scoring
battle.battle_target_info = ArrayList(protocol.SceneBattleInfo.BattleTargetInfoEntry).init(allocator);
// target hardcode
var pfTargetHead = protocol.BattleTargetList{ .battle_target_list = ArrayList(protocol.BattleTarget).init(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(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(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 => {},
}
}
pub const BattleManager = struct {
allocator: Allocator,
pub fn init(allocator: Allocator) BattleManager {
return BattleManager{ .allocator = allocator };
}
pub fn createBattle(self: *BattleManager) !protocol.SceneBattleInfo {
const config = try Config.loadGameConfig(self.allocator, "config.json");
var battle = createBattleInfo(self.allocator, config, @intCast(config.battle_config.monster_wave.items.len), config.battle_config.stage_id, config.battle_config.cycle_count);
var avatarIndex: u32 = 0;
var initial_mode = false;
while (true) {
if (!initial_mode) {
for (selectedAvatarID) |selected_id| {
for (config.avatar_config.items) |avatarConf| {
if (avatarConf.id == selected_id) {
const avatar = try createBattleAvatar(self.allocator, avatarConf);
try addTechniqueBuffs(self.allocator, &battle, avatar, avatarConf, avatarIndex);
try battle.pve_avatar_list.append(avatar);
avatarIndex += 1;
break;
}
}
if (avatarIndex >= 4) break;
}
}
if (avatarIndex == 0 and !initial_mode) {
initial_mode = true;
continue;
}
break;
}
try addMonsterWaves(self.allocator, &battle, config.battle_config.monster_wave, config.battle_config.monster_level);
try addStageBlessings(self.allocator, &battle, config.battle_config.blessings.items);
try addGolbalPassive(self.allocator, &battle, @intCast(config.battle_config.monster_wave.items.len));
try addBattleTargets(self.allocator, &battle);
return battle;
}
};
pub const ChallegeStageManager = struct {
allocator: Allocator,
pub fn init(allocator: 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 = undefined;
for (stage.stage_config.items) |stageConf| {
if (stageConf.stage_id == ChallengeData.challenge_stageID) {
battle = createBattleInfo(self.allocator, config, @intCast(stageConf.monster_list.items.len), stageConf.stage_id, if (ChallengeData.challenge_mode != 1) 30 else 4);
var avatarIndex: u32 = 0;
var initial_mode = false;
while (true) {
if (!initial_mode) {
for (selectedAvatarID) |selected_id| {
for (config.avatar_config.items) |avatarConf| {
if (avatarConf.id == selected_id) {
const avatar = try createBattleAvatar(self.allocator, avatarConf);
try addTechniqueBuffs(self.allocator, &battle, avatar, avatarConf, avatarIndex);
try battle.pve_avatar_list.append(avatar);
avatarIndex += 1;
break;
}
}
if (avatarIndex >= 4) break;
}
}
if (avatarIndex == 0 and !initial_mode) {
initial_mode = true;
continue;
}
break;
}
try addMonsterWaves(self.allocator, &battle, stageConf.monster_list, stageConf.level);
try addStageBlessings(self.allocator, &battle, ChallengeData.challenge_blessing);
try addGolbalPassive(self.allocator, &battle, @intCast(stageConf.monster_list.items.len));
try addBattleTargets(self.allocator, &battle);
break;
}
}
return battle;
}
};

View file

@ -0,0 +1,158 @@
const std = @import("std");
const protocol = @import("protocol");
const Session = @import("../Session.zig");
const Packet = @import("../Packet.zig");
const Config = @import("../services/config.zig");
const Data = @import("../data.zig");
const ChallengeData = @import("../services/challenge.zig");
const NodeCheck = @import("../commands/value.zig");
const ArrayList = std.ArrayList;
const Allocator = std.mem.Allocator;
const CmdID = protocol.CmdID;
fn contains(list: *const std.ArrayListAligned(u32, null), value: u32) bool {
for (list.items) |item| {
if (item == value) {
return true;
}
}
return false;
}
pub const ChallengeManager = struct {
allocator: std.mem.Allocator,
pub fn init(allocator: std.mem.Allocator) ChallengeManager {
return ChallengeManager{ .allocator = allocator };
}
pub fn createChallenge(
self: *ChallengeManager,
challenge_id: u32,
buff_id: u32,
) !protocol.CurChallenge {
const challenge_config = try Config.loadChallengeConfig(self.allocator, "resources/ChallengeMazeConfig.json");
const entrance_config = try Config.loadMapEntranceConfig(self.allocator, "resources/MapEntrance.json");
const maze_config = try Config.loadMazePlaneConfig(self.allocator, "resources/MazePlane.json");
var challenge_blessing_list = ChallengeData.ChallengeBlessing{
.allocator = std.heap.page_allocator,
.items = &.{},
.capacity = 0,
};
var cur_challenge_info = protocol.CurChallenge.init(self.allocator);
cur_challenge_info.challenge_id = challenge_id;
cur_challenge_info.score_id = if (challenge_id > 20000 and 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;
if (NodeCheck.challenge_node == 0) {
for (challenge_config.challenge_config.items) |challengeConf| {
if (challengeConf.id == challenge_id) {
std.debug.print("TRACING CONFIG ID {} WITH CHALLENGE ID {}\n", .{ challengeConf.id, 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)) {
if (challenge_id > 20000 and challenge_id < 30000) {
var story_buff = protocol.ChallengeStoryBuffList{
.buff_list = ArrayList(u32).init(self.allocator),
};
try story_buff.buff_list.append(challengeConf.maze_buff_id);
try story_buff.buff_list.append(buff_id);
try challenge_blessing_list.appendSlice(story_buff.buff_list.items);
cur_challenge_info.stage_info = .{
.IEICDGGELNE = .{
.cur_story_buffs = story_buff,
},
};
ChallengeData.challenge_mode = 1;
} else if (challenge_id > 30000) {
var boss_buff = protocol.ChallengeBossBuffList{
.buff_list = ArrayList(u32).init(self.allocator),
.challenge_boss_const = 1,
};
try boss_buff.buff_list.append(challengeConf.maze_buff_id);
try boss_buff.buff_list.append(buff_id);
try challenge_blessing_list.appendSlice(boss_buff.buff_list.items);
cur_challenge_info.stage_info = .{
.IEICDGGELNE = .{
.cur_boss_buffs = boss_buff,
},
};
ChallengeData.challenge_mode = 2;
}
ChallengeData.challenge_floorID = entrance.floor_id;
ChallengeData.challenge_worldID = maze.world_id;
ChallengeData.challenge_monsterID = challengeConf.npc_monster_id_list1.items[challengeConf.npc_monster_id_list1.items.len - 1];
ChallengeData.challenge_eventID = challengeConf.event_id_list1.items[challengeConf.event_id_list1.items.len - 1];
ChallengeData.challenge_groupID = challengeConf.maze_group_id1;
ChallengeData.challenge_maze_groupID = challengeConf.maze_group_id1;
ChallengeData.challenge_planeID = maze.challenge_plane_id;
ChallengeData.challenge_entryID = challengeConf.map_entrance_id;
}
}
}
}
}
}
} else {
for (challenge_config.challenge_config.items) |challengeConf| {
if (challengeConf.id == challenge_id) {
std.debug.print("TRACING CONFIG ID {} WITH CHALLENGE ID {}\n", .{ challengeConf.id, 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)) {
if (challengeConf.maze_group_id2) |id| {
if (challenge_id > 20000 and challenge_id < 30000) {
var story_buff = protocol.ChallengeStoryBuffList{
.buff_list = ArrayList(u32).init(self.allocator),
};
try story_buff.buff_list.append(challengeConf.maze_buff_id);
try story_buff.buff_list.append(buff_id);
try challenge_blessing_list.appendSlice(story_buff.buff_list.items);
cur_challenge_info.stage_info = .{
.IEICDGGELNE = .{
.cur_story_buffs = story_buff,
},
};
ChallengeData.challenge_mode = 1;
} else if (challenge_id > 30000) {
var boss_buff = protocol.ChallengeBossBuffList{
.buff_list = ArrayList(u32).init(self.allocator),
.challenge_boss_const = 1,
};
try boss_buff.buff_list.append(challengeConf.maze_buff_id);
try boss_buff.buff_list.append(buff_id);
try challenge_blessing_list.appendSlice(boss_buff.buff_list.items);
cur_challenge_info.stage_info = .{
.IEICDGGELNE = .{
.cur_boss_buffs = boss_buff,
},
};
ChallengeData.challenge_mode = 2;
}
ChallengeData.challenge_floorID = entrance.floor_id;
ChallengeData.challenge_worldID = maze.world_id;
ChallengeData.challenge_monsterID = challengeConf.npc_monster_id_list2.items[challengeConf.npc_monster_id_list2.items.len - 1];
ChallengeData.challenge_eventID = challengeConf.event_id_list2.items[challengeConf.event_id_list2.items.len - 1];
ChallengeData.challenge_groupID = id;
ChallengeData.challenge_maze_groupID = id;
ChallengeData.challenge_planeID = maze.challenge_plane_id;
ChallengeData.challenge_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", .{challenge_id});
}
}
}
}
}
}
}
}
ChallengeData.challenge_blessing = challenge_blessing_list.items[0..challenge_blessing_list.items.len];
ChallengeData.challenge_stageID = ChallengeData.challenge_eventID;
return cur_challenge_info;
}
};

View file

@ -4,12 +4,18 @@ const Session = @import("../Session.zig");
const Packet = @import("../Packet.zig");
const Config = @import("../services/config.zig");
const Data = @import("../data.zig");
const ChallengeData = @import("../services/challenge.zig");
const NodeCheck = @import("../commands/value.zig");
const BattleManager = @import("../manager/battle_mgr.zig");
const UidGenerator = @import("../services/item.zig").UidGenerator;
const ArrayList = std.ArrayList;
const Allocator = std.mem.Allocator;
const CmdID = protocol.CmdID;
pub var mc_id: u32 = 8008;
pub var m7_id: u32 = 1001;
pub const LineupManager = struct {
allocator: std.mem.Allocator,
pub fn init(allocator: std.mem.Allocator) LineupManager {
@ -21,9 +27,12 @@ pub const LineupManager = struct {
var lineup = protocol.LineupInfo.init(self.allocator);
lineup.mp = 5;
lineup.max_mp = 5;
lineup.name = .{ .Const = "CastoriceSR" };
lineup.name = .{ .Const = "CipherSR" };
for (config.avatar_config.items, 0..) |avatarConf, idx| {
if (idx >= 4) {
break;
}
var avatar = protocol.LineupAvatar.init(self.allocator);
avatar.id = avatarConf.id;
avatar.slot = @intCast(idx);
@ -33,7 +42,68 @@ pub const LineupManager = struct {
avatar.avatar_type = protocol.AvatarType.AVATAR_FORMAL_TYPE;
try lineup.avatar_list.append(avatar);
}
var id_list = try self.allocator.alloc(u32, config.avatar_config.items.len);
defer self.allocator.free(id_list);
for (config.avatar_config.items, 0..) |slot, idx| {
if (idx >= 4) {
break;
}
id_list[idx] = slot.id;
}
try getSelectedAvatarID(self.allocator, id_list);
return lineup;
}
};
pub const ChallengeLineupManager = struct {
allocator: std.mem.Allocator,
pub fn init(allocator: std.mem.Allocator) ChallengeLineupManager {
return ChallengeLineupManager{ .allocator = allocator };
}
pub fn createLineup(
self: *ChallengeLineupManager,
avatar_list: ArrayList(u32),
) !protocol.LineupInfo {
var lineup = protocol.LineupInfo.init(self.allocator);
lineup.mp = 5;
lineup.max_mp = 5;
lineup.extra_lineup_type = if (NodeCheck.challenge_node == 0) protocol.ExtraLineupType.LINEUP_CHALLENGE else protocol.ExtraLineupType.LINEUP_CHALLENGE_2;
for (avatar_list.items, 0..) |avatarlist, idx| {
var avatar = protocol.LineupAvatar.init(self.allocator);
avatar.id = avatarlist;
avatar.slot = @intCast(idx);
avatar.satiety = 0;
avatar.hp = 10000;
avatar.sp_bar = .{ .sp_cur = 10000, .sp_max = 10000 };
avatar.avatar_type = protocol.AvatarType.AVATAR_FORMAL_TYPE;
try lineup.avatar_list.append(avatar);
}
var id_list = try self.allocator.alloc(u32, avatar_list.items.len);
defer self.allocator.free(id_list);
for (avatar_list.items, 0..) |slot, idx| {
if (idx >= 4) {
break;
}
id_list[idx] = slot;
}
try getSelectedAvatarID(self.allocator, id_list);
return lineup;
}
};
pub fn getSelectedAvatarID(allocator: std.mem.Allocator, input: []const u32) !void {
var tempList = std.ArrayList(u32).init(allocator);
defer tempList.deinit();
try tempList.appendSlice(input);
var i: usize = 0;
while (i < BattleManager.selectedAvatarID.len and i < tempList.items.len) : (i += 1) {
const id = if (tempList.items[i] == 8001) mc_id else if (tempList.items[i] == 1001) m7_id else tempList.items[i];
BattleManager.selectedAvatarID[i] = id;
}
while (i < BattleManager.selectedAvatarID.len) : (i += 1) {
BattleManager.selectedAvatarID[i] = 0;
}
}

View file

@ -4,6 +4,7 @@ const Session = @import("../Session.zig");
const Packet = @import("../Packet.zig");
const Config = @import("../services/config.zig");
const Data = @import("../data.zig");
const LineupManager = @import("../manager/lineup_mgr.zig");
const ArrayList = std.ArrayList;
const Allocator = std.mem.Allocator;
@ -46,6 +47,11 @@ pub const MultiPathManager = struct {
counts[i] += 1;
for (avatar_ids[i]) |id| {
if (avatar.id == id) {
if (avatar.id >= 8001 and avatar.id <= 8008) {
LineupManager.mc_id = avatar.id;
} else {
LineupManager.m7_id = avatar.id;
}
multis[i].rank = avatar.rank;
indexes[i] = counts[i] - 1;
}
@ -88,7 +94,7 @@ pub const MultiPathManager = struct {
try rsp.multi_path_avatar_info_list.appendSlice(&multis);
try rsp.basic_type_id_list.appendSlice(&Data.MultiAvatar);
try rsp.cur_multi_path_avatar_type_map.append(.{ .key = 1001, .value = .Mar_7thKnightType });
try rsp.cur_multi_path_avatar_type_map.append(.{ .key = 8001, .value = .GirlMemoryType });
try rsp.cur_multi_path_avatar_type_map.append(.{ .key = 8001, .value = .GirlWarriorType });
rsp.retcode = 0;
return rsp;

View file

@ -29,6 +29,7 @@ pub const SceneManager = struct {
const res_config = try Res_config.anchorLoader(self.allocator, "resources/res.json");
var generator = UidGenerator().init();
var scene_info = protocol.SceneInfo.init(self.allocator);
scene_info.game_mode_type = 1;
scene_info.plane_id = plane_id;
scene_info.floor_id = floor_id;
scene_info.entry_id = entry_id;
@ -37,6 +38,7 @@ pub const SceneManager = struct {
scene_info.client_pos_version = 1;
var group_map = std.AutoHashMap(u32, protocol.SceneEntityGroupInfo).init(self.allocator);
defer group_map.deinit();
for (res_config.scene_config.items) |sceneConf| {
for (sceneConf.teleports.items) |teleConf| {
if (teleConf.teleportId == teleport_id) {
@ -71,7 +73,7 @@ pub const SceneManager = struct {
.entityCase_ = .{ .Prop = prop_info },
.GroupId = scene_group.group_id,
.InstId = propConf.instId,
.EntityId = 0,
.EntityId = generator.nextId(),
.Motion = .{
.pos = .{ .x = propConf.pos.x, .y = propConf.pos.y, .z = propConf.pos.z },
.rot = .{ .x = propConf.rot.x, .y = propConf.rot.y, .z = propConf.rot.z },
@ -100,6 +102,27 @@ pub const SceneManager = struct {
var iter = group_map.iterator();
while (iter.next()) |entry| {
try scene_info.entity_group_list.append(entry.value_ptr.*);
try scene_info.entity_list.appendSlice(entry.value_ptr.entity_list.items);
try scene_info.DJBIBIJMEBH.append(entry.value_ptr.group_id);
try scene_info.custom_data_list.append(protocol.CustomSaveData{
.group_id = entry.value_ptr.group_id,
});
try scene_info.group_state_list.append(protocol.SceneGroupState{
.group_id = entry.value_ptr.group_id,
.state = 0,
.is_default = true,
});
}
const ranges = [_][2]usize{
.{ 0, 101 },
.{ 10000, 10051 },
.{ 20000, 20001 },
.{ 30000, 30020 },
};
for (ranges) |range| {
for (range[0]..range[1]) |i| {
try scene_info.lighten_section_list.append(@intCast(i));
}
}
return scene_info;
}
@ -127,6 +150,7 @@ pub const ChallengeSceneManager = struct {
entry_id: u32,
world_id: u32,
monster_id: u32,
event_id: u32,
group_id: u32,
maze_group_id: u32,
) !protocol.SceneInfo {
@ -176,7 +200,7 @@ pub const ChallengeSceneManager = struct {
var monster_info = protocol.SceneNpcMonsterInfo.init(self.allocator);
monster_info.monster_id = monster_id;
monster_info.event_id = monsConf.eventId;
monster_info.event_id = event_id;
monster_info.world_level = 6;
try scene_group.entity_list.append(.{

View file

@ -4,6 +4,7 @@ const Session = @import("../Session.zig");
const Packet = @import("../Packet.zig");
const Config = @import("config.zig");
const Data = @import("../data.zig");
const LineupManager = @import("../manager/lineup_mgr.zig");
const UidGenerator = @import("item.zig").UidGenerator;
const ArrayList = std.ArrayList;
@ -113,8 +114,10 @@ pub fn onSetAvatarPath(session: *Session, packet: *const Packet, allocator: Allo
rsp.avatar_id = req.avatar_id;
if (rsp.avatar_id == protocol.MultiPathAvatarType.Mar_7thKnightType) {
m7th = false;
LineupManager.m7_id = 1001;
} else if (rsp.avatar_id == protocol.MultiPathAvatarType.Mar_7thRogueType) {
m7th = true;
LineupManager.m7_id = 1224;
} else if (rsp.avatar_id == protocol.MultiPathAvatarType.BoyWarriorType) {
mac = 1;
mg = false;
@ -130,15 +133,19 @@ pub fn onSetAvatarPath(session: *Session, packet: *const Packet, allocator: Allo
} else if (rsp.avatar_id == protocol.MultiPathAvatarType.GirlWarriorType) {
mac = 1;
mg = true;
LineupManager.mc_id = 8002;
} else if (rsp.avatar_id == protocol.MultiPathAvatarType.GirlKnightType) {
mac = 2;
mg = true;
LineupManager.mc_id = 8004;
} else if (rsp.avatar_id == protocol.MultiPathAvatarType.GirlShamanType) {
mac = 3;
mg = true;
LineupManager.mc_id = 8006;
} else if (rsp.avatar_id == protocol.MultiPathAvatarType.GirlMemoryType) {
mac = 4;
mg = true;
LineupManager.mc_id = 8008;
}
var sync = protocol.AvatarPathChangedNotify.init(allocator);
@ -172,7 +179,6 @@ pub fn onGetBigDataAll(session: *Session, packet: *const Packet, allocator: Allo
var rsp = protocol.GetBigDataAllRecommendScRsp.init(allocator);
rsp.retcode = 0;
rsp.IANNEEIJAKH = req.IANNEEIJAKH;
std.debug.print("PRINT BIG DATA ALL REQ {}\n", .{req});
try session.send(CmdID.CmdGetBigDataAllRecommendScRsp, rsp);
}
pub fn onGetBigData(session: *Session, packet: *const Packet, allocator: Allocator) !void {
@ -181,6 +187,12 @@ pub fn onGetBigData(session: *Session, packet: *const Packet, allocator: Allocat
rsp.retcode = 0;
rsp.IANNEEIJAKH = req.IANNEEIJAKH;
rsp.EIGPMIBCIKG = req.EIGPMIBCIKG;
std.debug.print("PRINT BIG DATA REQ {}\n", .{req});
try session.send(CmdID.CmdGetBigDataRecommendScRsp, rsp);
}
pub fn onGetPreAvatarGrowthInfo(session: *Session, packet: *const Packet, allocator: Allocator) !void {
const req = try packet.getProto(protocol.GetPreAvatarGrowthInfoCsReq, allocator);
var rsp = protocol.GetPreAvatarGrowthInfoScRsp.init(allocator);
rsp.retcode = 0;
rsp.KJAEOJBJOJD = req.KJAEOJBJOJD;
try session.send(CmdID.CmdGetPreAvatarGrowthInfoScRsp, rsp);
}

View file

@ -4,16 +4,22 @@ const Session = @import("../Session.zig");
const Packet = @import("../Packet.zig");
const Config = @import("config.zig");
const Data = @import("../data.zig");
const ChallengeData = @import("challenge.zig");
const BattleManager = @import("../manager/battle_mgr.zig").BattleManager;
const ChallegeStageManager = @import("../manager/battle_mgr.zig").ChallegeStageManager;
const NodeCheck = @import("../commands/value.zig");
const ArrayList = std.ArrayList;
const Allocator = std.mem.Allocator;
const CmdID = protocol.CmdID;
pub var on_battle: bool = false;
pub fn onStartCocoonStage(session: *Session, packet: *const Packet, allocator: Allocator) !void {
const req = try packet.getProto(protocol.StartCocoonStageCsReq, allocator);
var battle_mgr = BattleManager.init(allocator);
const battle = try battle_mgr.createBattle();
on_battle = true;
try session.send(CmdID.CmdStartCocoonStageScRsp, protocol.StartCocoonStageScRsp{
.retcode = 0,
.cocoon_id = req.cocoon_id,
@ -26,6 +32,7 @@ pub fn onQuickStartCocoonStage(session: *Session, packet: *const Packet, allocat
const req = try packet.getProto(protocol.QuickStartCocoonStageCsReq, allocator);
var battle_mgr = BattleManager.init(allocator);
const battle = try battle_mgr.createBattle();
on_battle = true;
try session.send(CmdID.CmdQuickStartCocoonStageScRsp, protocol.QuickStartCocoonStageScRsp{
.retcode = 0,
.cocoon_id = req.cocoon_id,
@ -37,6 +44,7 @@ pub fn onQuickStartFarmElement(session: *Session, packet: *const Packet, allocat
const req = try packet.getProto(protocol.QuickStartFarmElementCsReq, allocator);
var battle_mgr = BattleManager.init(allocator);
const battle = try battle_mgr.createBattle();
on_battle = true;
try session.send(CmdID.CmdQuickStartFarmElementScRsp, protocol.QuickStartFarmElementScRsp{
.retcode = 0,
.world_level = req.world_level,
@ -48,6 +56,7 @@ pub fn onStartBattleCollege(session: *Session, packet: *const Packet, allocator:
const req = try packet.getProto(protocol.StartBattleCollegeCsReq, allocator);
var battle_mgr = BattleManager.init(allocator);
const battle = try battle_mgr.createBattle();
on_battle = true;
try session.send(CmdID.CmdStartBattleCollegeScRsp, protocol.StartBattleCollegeScRsp{
.retcode = 0,
.id = req.id,
@ -57,7 +66,8 @@ pub fn onStartBattleCollege(session: *Session, packet: *const Packet, allocator:
pub fn onSceneCastSkill(session: *Session, packet: *const Packet, allocator: Allocator) !void {
var battle_mgr = BattleManager.init(allocator);
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);
var monster_battle_info_list = ArrayList(protocol.HitMonsterBattleInfo).init(allocator);
try monster_battle_info_list.appendSlice(&[_]protocol.HitMonsterBattleInfo{
@ -66,19 +76,47 @@ pub fn onSceneCastSkill(session: *Session, packet: *const Packet, allocator: All
.monster_battle_type = protocol.MonsterBattleType.MONSTER_BATTLE_TYPE_TRIGGER_BATTLE,
},
});
var battle_info: ?protocol.SceneBattleInfo = null;
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) {
battle_info = challenge;
} else {
battle_info = battle;
on_battle = true;
}
}
try session.send(CmdID.CmdSceneCastSkillScRsp, protocol.SceneCastSkillScRsp{
.retcode = 0,
.cast_entity_id = req.cast_entity_id,
.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 = battle_info,
});
}
pub fn onGetCurBattleInfo(session: *Session, _: *const Packet, allocator: Allocator) !void {
var battle_mgr = BattleManager.init(allocator);
const battle = try battle_mgr.createBattle();
var challege_mgr = ChallegeStageManager.init(allocator);
const challenge = try challege_mgr.createChallegeStage();
var rsp = protocol.GetCurBattleInfoScRsp.init(allocator);
rsp.battle_info = if (ChallengeData.on_challenge == true) challenge else if (on_battle == true) battle else null;
rsp.retcode = 0;
try session.send(CmdID.CmdGetCurBattleInfoScRsp, rsp);
}
pub fn onPVEBattleResult(session: *Session, packet: *const Packet, allocator: Allocator) !void {
const req = try packet.getProto(protocol.PVEBattleResultCsReq, allocator);
var rsp = protocol.PVEBattleResultScRsp.init(allocator);
rsp.battle_id = req.battle_id;
rsp.end_status = req.end_status;
rsp.stage_id = req.stage_id;
on_battle = false;
try session.send(CmdID.CmdPVEBattleResultScRsp, rsp);
}
@ -89,3 +127,12 @@ pub fn onSceneCastSkillCostMp(session: *Session, packet: *const Packet, allocato
.cast_entity_id = req.cast_entity_id,
});
}
pub fn onSyncClientResVersion(session: *Session, packet: *const Packet, allocator: Allocator) !void {
const req = try packet.getProto(protocol.SyncClientResVersionCsReq, allocator);
std.debug.print("CLIENT RES VERSION: {}\n", .{req.client_res_version});
try session.send(CmdID.CmdSyncClientResVersionScRsp, protocol.SyncClientResVersionScRsp{
.retcode = 0,
.client_res_version = req.client_res_version,
});
}

View file

@ -5,9 +5,12 @@ const Packet = @import("../Packet.zig");
const Config = @import("config.zig");
const Res_config = @import("res_config.zig");
const Data = @import("../data.zig");
const ChallegeStageManager = @import("../manager/battle_mgr.zig").ChallegeStageManager;
const ChallengeManager = @import("../manager/challenge_mgr.zig").ChallengeManager;
const SceneManager = @import("../manager/scene_mgr.zig").SceneManager;
const ChallengeSceneManager = @import("../manager/scene_mgr.zig").ChallengeSceneManager;
const LineupManager = @import("../manager/lineup_mgr.zig").LineupManager;
const ChallengeLineupManager = @import("../manager/lineup_mgr.zig").ChallengeLineupManager;
const NodeCheck = @import("../commands/value.zig");
const ArrayList = std.ArrayList;
@ -39,6 +42,45 @@ fn contains(list: *const std.ArrayListAligned(u32, null), value: u32) bool {
}
return false;
}
pub var on_challenge: bool = false;
pub const ChallengeBlessing = ArrayList(u32);
pub var challenge_blessing: []const u32 = &.{};
pub var challenge_mode: u32 = 0;
pub var challenge_planeID: u32 = 0;
pub var challenge_floorID: u32 = 0;
pub var challenge_entryID: u32 = 0;
pub var challenge_worldID: u32 = 0;
pub var challenge_monsterID: u32 = 0;
pub var challenge_eventID: u32 = 0;
pub var challenge_groupID: u32 = 0;
pub var challenge_maze_groupID: u32 = 0;
pub var challenge_stageID: u32 = 0;
pub var challengeID: u32 = 0;
pub var challenge_buffID: u32 = 0;
pub const ChallengeAvatarList = ArrayList(u32);
pub var avatar_list: ChallengeAvatarList = ChallengeAvatarList.init(std.heap.page_allocator);
pub fn resetChallengeState() void {
on_challenge = false;
challenge_mode = 0;
challenge_planeID = 0;
challenge_floorID = 0;
challenge_entryID = 0;
challenge_worldID = 0;
challenge_monsterID = 0;
challenge_eventID = 0;
challenge_groupID = 0;
challenge_maze_groupID = 0;
challenge_stageID = 0;
challengeID = 0;
challenge_buffID = 0;
challenge_blessing = &.{};
_ = avatar_list.clearRetainingCapacity();
}
pub fn onGetChallenge(session: *Session, _: *const Packet, allocator: Allocator) !void {
const challenge_config = try Config.loadChallengeConfig(allocator, "resources/ChallengeMazeConfig.json");
@ -63,7 +105,6 @@ pub fn onGetChallengeGroupStatistics(session: *Session, packet: *const Packet, a
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 {
@ -77,131 +118,99 @@ pub fn onLeaveChallenge(session: *Session, _: *const Packet, allocator: Allocato
.lineup = lineup,
.scene = scene_info,
});
resetChallengeState();
challenge_mode = 0;
try session.send(CmdID.CmdLeaveChallengeScRsp, protocol.LeaveChallengeScRsp{
.retcode = 0,
});
}
//TODO: IMPLEMENT CHALLENGE BUFF AND FIX MENU
pub fn onGetCurChallengeScRsp(session: *Session, _: *const Packet, allocator: Allocator) !void {
var rsp = protocol.GetCurChallengeScRsp.init(allocator);
var lineup_manager = ChallengeLineupManager.init(allocator);
const lineup_info = try lineup_manager.createLineup(avatar_list);
var challenge_manager = ChallengeManager.init(allocator);
const cur_challenge_info = try challenge_manager.createChallenge(
challengeID,
challenge_buffID,
);
rsp.retcode = 0;
if (on_challenge == true) {
rsp.cur_challenge = cur_challenge_info;
try rsp.lineup_list.append(lineup_info);
std.debug.print("CURRENT CHALLENGE STAGE ID:{}\n", .{challenge_stageID});
std.debug.print("CURRENT CHALLENGE LINEUP AVATAR ID:{}\n", .{avatar_list});
std.debug.print("CURRENT CHALLENGE MONSTER ID:{}\n", .{challenge_monsterID});
if (challenge_mode == 0) {
std.debug.print("CURRENT CHALLENGE: {} MOC\n", .{challenge_mode});
} else if (challenge_mode == 1) {
std.debug.print("CURRENT CHALLENGE: {} PF\n", .{challenge_mode});
std.debug.print("CURRENT CHALLENGE STAGE BLESSING ID:{}, SELECTED BLESSING ID:{}\n", .{ challenge_blessing[0], challenge_blessing[1] });
} else {
std.debug.print("CURRENT CHALLENGE: {} AS\n", .{challenge_mode});
std.debug.print("CURRENT CHALLENGE STAGE BLESSING ID:{}, SELECTED BLESSING ID:{}\n", .{ challenge_blessing[0], challenge_blessing[1] });
}
} else {
std.debug.print("CURRENT ON CHALLENGE STATE: {}\n", .{on_challenge});
}
try session.send(CmdID.CmdGetCurChallengeScRsp, rsp);
}
pub fn onStartChallenge(session: *Session, packet: *const Packet, allocator: Allocator) !void {
const req = try packet.getProto(protocol.StartChallengeCsReq, allocator);
var rsp = protocol.StartChallengeScRsp.init(allocator);
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);
challengeID = req.challenge_id;
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;
}
}
}
}
}
for (req.first_lineup.items) |id| {
try avatar_list.append(id);
}
if (challengeID > 20000 and challengeID < 30000)
challenge_buffID = req.stage_info.?.IEICDGGELNE.?.story_info.buff_one;
if (challengeID > 30000)
challenge_buffID = req.stage_info.?.IEICDGGELNE.?.boss_info.buff_one;
} 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;
}
}
}
}
}
for (req.second_lineup.items) |id| {
try avatar_list.append(id);
}
if (challengeID > 20000 and challengeID < 30000)
challenge_buffID = req.stage_info.?.IEICDGGELNE.?.story_info.buff_two;
if (challengeID > 30000)
challenge_buffID = req.stage_info.?.IEICDGGELNE.?.boss_info.buff_two;
}
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,
var lineup_manager = ChallengeLineupManager.init(allocator);
const lineup_info = try lineup_manager.createLineup(avatar_list);
var challenge_manager = ChallengeManager.init(allocator);
const cur_challenge_info = try challenge_manager.createChallenge(
challengeID,
challenge_buffID,
);
var scene_challenge_manager = ChallengeSceneManager.init(allocator);
const scene_info = try scene_challenge_manager.createScene(
avatar_list,
challenge_planeID,
challenge_floorID,
challenge_entryID,
challenge_worldID,
challenge_monsterID,
challenge_eventID,
challenge_groupID,
challenge_maze_groupID,
);
rsp.retcode = 0;
rsp.scene = scene_info;
rsp.cur_challenge = cur_challenge_info;
try rsp.lineup_list.append(lineup_info);
on_challenge = true;
try session.send(CmdID.CmdStartChallengeScRsp, rsp);
std.debug.print("SEND PLANE ID {} FLOOR ID {} ENTRY ID {} GROUP ID {} MAZE GROUP ID {}\n", .{ 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,
std.debug.print("SEND PLANE ID {} FLOOR ID {} ENTRY ID {} GROUP ID {} MAZE GROUP ID {}\n", .{
challenge_planeID,
challenge_floorID,
challenge_entryID,
challenge_groupID,
challenge_maze_groupID,
});
}

View file

@ -3,7 +3,7 @@ const ArrayList = std.ArrayList;
const std = @import("std");
const BattleConfig = struct {
pub const BattleConfig = struct {
battle_id: u32,
stage_id: u32,
cycle_count: u32,
@ -11,7 +11,11 @@ const BattleConfig = struct {
monster_level: u32,
blessings: ArrayList(u32),
};
pub const Stage = struct {
level: u32,
stage_id: u32,
monster_list: ArrayList(ArrayList(u32)),
};
const ExtraMazeBuff = struct {
enable: bool,
mazebuff: ArrayList(u32),
@ -43,7 +47,7 @@ pub const Relic = struct {
step4: u32,
};
const Avatar = struct {
pub const Avatar = struct {
id: u32,
hp: u32,
sp: u32,
@ -54,17 +58,33 @@ const Avatar = struct {
relics: ArrayList(Relic),
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 {
id: u32, //
npc_monster_id_list1: ArrayList(u32), //
npc_monster_id_list2: ArrayList(u32), //
event_id_list1: ArrayList(u32), //
event_id_list2: ArrayList(u32), //
map_entrance_id: u32, //
map_entrance_id2: u32, //
maze_group_id1: u32, //
maze_group_id2: u32, //
id: u32,
npc_monster_id_list1: ArrayList(u32),
npc_monster_id_list2: ArrayList(u32),
event_id_list1: ArrayList(u32),
event_id_list2: ArrayList(u32),
map_entrance_id: u32,
map_entrance_id2: u32,
maze_group_id1: u32,
maze_group_id2: ?u32, // to check if it missing MazeGroupID2 field
maze_buff_id: u32,
};
const MapEntrance = struct {
@ -85,6 +105,24 @@ pub const GameConfig = struct {
battle_config: BattleConfig,
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 {
challenge_config: ArrayList(ChallengeConfig),
};
@ -121,6 +159,30 @@ pub fn loadGameConfig(allocator: Allocator, filename: []const u8) ErrorSet!GameC
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 {
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),
};
std.debug.print("loading config stageID = {}\n", .{battle_config.stage_id});
for (battle_config_json.object.get("monster_wave").?.array.items) |wave| {
var wave_list = ArrayList(u32).init(allocator);
for (wave.array.items) |monster| {
@ -192,11 +252,100 @@ pub fn parseConfig(root: std.json.Value, allocator: Allocator) ErrorSet!GameConf
.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 {
var challenge_config = ArrayList(ChallengeConfig).init(allocator);
for (root.object.get("challenge_config").?.array.items) |challenge_json| {
var challenge = ChallengeConfig{
.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_list2 = ArrayList(u32).init(allocator),
.event_id_list1 = ArrayList(u32).init(allocator),
@ -204,7 +353,7 @@ fn parseChallengeConfig(root: std.json.Value, allocator: Allocator) ErrorSet!Cha
.map_entrance_id = @intCast(challenge_json.object.get("MapEntranceID").?.integer),
.map_entrance_id2 = @intCast(challenge_json.object.get("MapEntranceID2").?.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| {
try challenge.npc_monster_id_list1.append(@intCast(npc1.integer));
@ -283,15 +432,15 @@ fn parseRelic(relic_str: []const u8, allocator: Allocator) !Relic {
const tokens_slice = tokens.items;
if (tokens_slice.len < 8) {
std.debug.print("relic parsing error: {s}\n", .{relic_str});
if (tokens_slice.len < 5) {
std.debug.print("relic parsing critical error (too few fields): {s}\n", .{relic_str});
return error.InsufficientTokens;
}
const stat1 = try parseStatCount(tokens_slice[4]);
const stat2 = try parseStatCount(tokens_slice[5]);
const stat3 = try parseStatCount(tokens_slice[6]);
const stat4 = try parseStatCount(tokens_slice[7]);
const stat2 = if (tokens_slice.len > 5) try parseStatCount(tokens_slice[5]) else StatCount{ .stat = 0, .count = 0, .step = 0 };
const stat3 = if (tokens_slice.len > 6) try parseStatCount(tokens_slice[6]) else StatCount{ .stat = 0, .count = 0, .step = 0 };
const stat4 = if (tokens_slice.len > 7) try parseStatCount(tokens_slice[7]) else StatCount{ .stat = 0, .count = 0, .step = 0 };
const relic = Relic{
.id = try std.fmt.parseInt(u32, tokens_slice[0], 10),

View file

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

@ -5,6 +5,7 @@ const Packet = @import("../Packet.zig");
const Config = @import("config.zig");
const Data = @import("../data.zig");
const LineupManager = @import("../manager/lineup_mgr.zig").LineupManager;
const Sync = @import("../commands/sync.zig");
const ArrayList = std.ArrayList;
const Allocator = std.mem.Allocator;
const CmdID = protocol.CmdID;
@ -12,7 +13,6 @@ const CmdID = protocol.CmdID;
pub fn onGetBag(session: *Session, _: *const Packet, allocator: Allocator) !void {
const config = try Config.loadGameConfig(allocator, "config.json");
var generator = UidGenerator().init();
// fake item inventory
// TODO: make real one
var rsp = protocol.GetBagScRsp.init(allocator);
@ -81,7 +81,9 @@ pub fn UidGenerator() type {
pub fn init() Self {
return Self{ .current_id = 0 };
}
pub fn curId(self: *const Self) u32 {
return self.current_id;
}
pub fn nextId(self: *Self) u32 {
self.current_id +%= 1; // Using wrapping addition
return self.current_id;

View file

@ -3,13 +3,14 @@ const protocol = @import("protocol");
const Session = @import("../Session.zig");
const Packet = @import("../Packet.zig");
const Config = @import("config.zig");
const LineupManager = @import("../manager/lineup_mgr.zig").LineupManager;
const LineupManager = @import("../manager/lineup_mgr.zig");
const BattleManager = @import("../manager/battle_mgr.zig");
const Allocator = std.mem.Allocator;
const CmdID = protocol.CmdID;
pub fn onGetCurLineupData(session: *Session, _: *const Packet, allocator: Allocator) !void {
var lineup_mgr = LineupManager.init(allocator);
var lineup_mgr = LineupManager.LineupManager.init(allocator);
const lineup = try lineup_mgr.createLineup();
try session.send(CmdID.CmdGetCurLineupDataScRsp, protocol.GetCurLineupDataScRsp{
.retcode = 0,
@ -30,7 +31,7 @@ pub fn onReplaceLineup(session: *Session, packet: *const Packet, allocator: Allo
var lineup = protocol.LineupInfo.init(allocator);
lineup.mp = 5;
lineup.max_mp = 5;
lineup.name = .{ .Const = "CastoriceSR" };
lineup.name = .{ .Const = "CipherSR" };
for (req.lineup_slot_list.items) |ok| {
const avatar = protocol.LineupAvatar{
.id = ok.id,
@ -42,6 +43,17 @@ pub fn onReplaceLineup(session: *Session, packet: *const Packet, allocator: Allo
};
try lineup.avatar_list.append(avatar);
}
var id_list = try allocator.alloc(u32, req.lineup_slot_list.items.len);
defer allocator.free(id_list);
for (req.lineup_slot_list.items, 0..) |slot, idx| {
if (idx >= 4) {
break;
}
id_list[idx] = slot.id;
}
try LineupManager.getSelectedAvatarID(allocator, id_list);
var rsp = protocol.SyncLineupNotify.init(allocator);
rsp.Lineup = lineup;
try session.send(CmdID.CmdSyncLineupNotify, rsp);

View file

@ -12,8 +12,10 @@ pub fn onPlayerGetToken(session: *Session, _: *const Packet, allocator: Allocato
rsp.retcode = 0;
rsp.uid = 1;
try session.send(CmdID.CmdPlayerGetTokenScRsp, rsp);
}
pub fn onPlayerLogin(session: *Session, packet: *const Packet, allocator: Allocator) !void {
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.IsRead = false;
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.ExpireTime = 17186330890;
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 Packet = @import("../Packet.zig");
const Data = @import("../data.zig");
const Config = @import("config.zig");
const ArrayList = std.ArrayList;
const Allocator = std.mem.Allocator;
@ -11,45 +12,37 @@ const CmdID = protocol.CmdID;
pub fn onGetMissionStatus(session: *Session, packet: *const Packet, allocator: Allocator) !void {
const req = try packet.getProto(protocol.GetMissionStatusCsReq, allocator);
var rsp = protocol.GetMissionStatusScRsp.init(allocator);
const main_mission_config = try Config.loadMainMissionConfig(allocator, "resources/MainMission.json");
rsp.retcode = 0;
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.FinishedMainMissionIdList.appendSlice(&Data.FinishedMainMissionIdList);
try rsp.CurversionFinishedMainMissionIdList.appendSlice(&Data.FinishedMainMissionIdList);
for (main_mission_config.main_mission_config.items) |main_missionConf| {
try rsp.FinishedMainMissionIdList.append(main_missionConf.main_mission_id);
try rsp.CurversionFinishedMainMissionIdList.append(main_missionConf.main_mission_id);
}
try session.send(CmdID.CmdGetMissionStatusScRsp, rsp);
}
pub fn onGetTutorialGuideStatus(session: *Session, _: *const Packet, allocator: Allocator) !void {
var rsp = protocol.GetTutorialGuideScRsp.init(allocator);
const tutorial_guide_config = try Config.loadTutorialGuideConfig(allocator, "resources/TutorialGuideGroup.json");
rsp.retcode = 0;
for (Data.TutorialGuideIdList) |id| {
try rsp.TutorialGuideList.append(protocol.TutorialGuide{ .id = id, .Status = protocol.TutorialStatus.TUTORIAL_FINISH });
for (tutorial_guide_config.tutorial_guide_config.items) |guideConf| {
try rsp.TutorialGuideList.append(protocol.TutorialGuide{ .id = guideConf.guide_group_id, .Status = protocol.TutorialStatus.TUTORIAL_FINISH });
}
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 {
var rsp = protocol.GetTutorialScRsp.init(allocator);
const tutorial_guide_config = try Config.loadTutorialConfig(allocator, "resources/TutorialData.json");
rsp.retcode = 0;
for (Data.FinishedTutorialIdList) |id| {
try rsp.TutorialList.append(protocol.Tutorial{ .id = id, .Status = protocol.TutorialStatus.TUTORIAL_FINISH });
for (tutorial_guide_config.tutorial_config.items) |tutorialConf| {
try rsp.TutorialList.append(protocol.Tutorial{ .id = tutorialConf.tutorial_id, .Status = protocol.TutorialStatus.TUTORIAL_FINISH });
}
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 {
const req = try packet.getProto(protocol.UnlockTutorialGuideCsReq, allocator);
var rsp = protocol.UnlockTutorialGuideScRsp.init(allocator);
rsp.retcode = 0;
std.debug.print("UNLOCK TUTORIAL GUIDE ID: {}\n", .{req.group_id});
try session.send(CmdID.CmdUnlockTutorialGuideScRsp, rsp);
}

View file

@ -3,6 +3,7 @@ const protocol = @import("protocol");
const Session = @import("../Session.zig");
const Packet = @import("../Packet.zig");
const Data = @import("../data.zig");
const Config = @import("config.zig");
const UidGenerator = @import("item.zig").UidGenerator;
const ArrayList = std.ArrayList;
@ -46,10 +47,11 @@ pub fn onGetPlayerBoardData(session: *Session, _: *const Packet, allocator: Allo
var rsp = protocol.GetPlayerBoardDataScRsp.init(allocator);
var generator = UidGenerator().init();
var display_list = protocol.DisplayAvatarVec.init(allocator);
const player_icon_config = try Config.loadPlayerIconConfig(allocator, "resources/AvatarPlayerIcon.json");
display_list.is_display = true;
rsp.retcode = 0;
rsp.OLDMJONBJOM = 253000;
rsp.signature = .{ .Const = "Visit discord.gg/reversedrooms for more info!" };
rsp.signature = .{ .Const = "" };
try rsp.assist_avatar_id_list.appendSlice(&SupportAvatar);
for (ListAvatar) |id| {
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);
}
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{
.id = head_id,
.id = head_id.id,
};
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);
rsp.retcode = 0;
rsp.current_head_icon_id = req.id;
std.debug.print("SET HEAD ICON ID: {}\n", .{req.id});
try session.send(CmdID.CmdSetHeadIconScRsp, rsp);
}

View file

@ -84,12 +84,12 @@ 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_PUZZLE },
};
std.debug.print("SCENE MAP FLOOR ID REQ: {}\n", .{req.floor_id_list});
for (req.floor_id_list.items) |floor_id| {
var rsp = protocol.GetSceneMapInfoScRsp.init(allocator);
rsp.retcode = 0;
rsp.content_id = req.content_id;
rsp.entry_story_line_id = req.entry_story_line_id;
rsp.IGFIKGHLLNO = true;
var map_info = protocol.SceneMapInfo.init(allocator);
try map_info.chest_list.appendSlice(chest_list);
map_info.entry_id = @intCast(floor_id);
@ -129,9 +129,7 @@ pub fn onGetSceneMapInfo(session: *Session, packet: *const Packet, allocator: Al
try session.send(CmdID.CmdGetSceneMapInfoScRsp, rsp);
}
}
pub fn onGetUnlockTeleport(session: *Session, packet: *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});
pub fn onGetUnlockTeleport(session: *Session, _: *const Packet, allocator: Allocator) !void {
var rsp = protocol.GetUnlockTeleportScRsp.init(allocator);
const res_config = try Res_config.anchorLoader(allocator, "resources/res.json");
for (res_config.scene_config.items) |sceneCof| {
@ -149,6 +147,27 @@ pub fn onEnterSection(session: *Session, packet: *const Packet, allocator: Alloc
std.debug.print("ENTER SECTION Id: {}\n", .{req.section_id});
try session.send(CmdID.CmdEnterSectionScRsp, rsp);
}
pub fn onGetEnteredScene(session: *Session, _: *const Packet, allocator: Allocator) !void {
var rsp = protocol.GetEnteredSceneScRsp.init(allocator);
var noti = protocol.EnteredSceneChangeScNotify.init(allocator);
const entrance_config = try Config.loadMapEntranceConfig(allocator, "resources/MapEntrance.json");
for (entrance_config.map_entrance_config.items) |entrance| {
try rsp.entered_scene_info_list.append(protocol.EnteredSceneInfo{
.floor_id = entrance.floor_id,
.plane_id = entrance.plane_id,
});
try noti.entered_scene_info_list.append(protocol.EnteredSceneInfo{
.floor_id = entrance.floor_id,
.plane_id = entrance.plane_id,
});
}
rsp.retcode = 0;
try session.send(CmdID.CmdEnteredSceneChangeScNotify, noti);
try session.send(CmdID.CmdGetEnteredSceneScRsp, rsp);
}
pub fn onSceneEntityTeleport(session: *Session, packet: *const Packet, allocator: Allocator) !void {
const req = try packet.getProto(protocol.SceneEntityTeleportCsReq, allocator);
var rsp = protocol.SceneEntityTeleportScRsp.init(allocator);
@ -216,17 +235,17 @@ pub fn onDeactivateFarmElement(session: *Session, packet: *const Packet, allocat
}
pub fn onSetGroupCustomSaveData(session: *Session, packet: *const Packet, allocator: Allocator) !void {
const req = try packet.getProto(protocol.SetGroupCustomSaveDataCsReq, allocator);
switch (req.AAMHHECOCOI) {
.Owned => |val| {
std.debug.print("CUSTOM SAVE DATA REQ: {s}\n", .{val.str});
},
.Const => |val| {
std.debug.print("CUSTOM SAVE DATA REQ: {s}\n", .{val});
},
.Empty => {
std.debug.print("CUSTOM SAVE DATA REQ: <empty string>\n", .{});
},
}
//switch (req.AAMHHECOCOI) {
// .Owned => |val| {
// std.debug.print("CUSTOM SAVE DATA REQ: {s}\n", .{val.str});
// },
// .Const => |val| {
// std.debug.print("CUSTOM SAVE DATA REQ: {s}\n", .{val});
// },
// .Empty => {
// std.debug.print("CUSTOM SAVE DATA REQ: <empty string>\n", .{});
// },
//}
try session.send(CmdID.CmdSetGroupCustomSaveDataScRsp, protocol.SetGroupCustomSaveDataScRsp{
.retcode = 0,
.group_id = req.group_id,

View file

@ -14,5 +14,21 @@
"ifix_version": "0",
"lua_url": "https://autopatchos.starrails.com/lua/BetaLive/output_10025298_1dc728a6c8ee_1128f068b506d4",
"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_10128229_1abd7f8c3047_3cb3e1bffdb636",
"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": ""
},
"OSBETAWin3.2.54": {
"asset_bundle_url": "https://autopatchos.starrails.com/asb/BetaLive/output_10182178_c0cbb41bb650_9e7401ee501684",
"ex_resource_url": "https://autopatchos.starrails.com/design_data/BetaLive/output_10190349_65c2a054220b_3d06b35cecd7a9",
"ifix_url": "https://autopatchos.starrails.com/ifix/BetaLive/output_10208090_dc0587466a83_7fc79b628127d3",
"ifix_version": "0",
"lua_url": "https://autopatchos.starrails.com/lua/BetaLive/output_10182439_b0ec3d3bcfc2_d9d2a226df4dd2",
"lua_version": ""
}
}

View file

@ -3,9 +3,7 @@
.version = "0.0.0",
.dependencies = .{
.protobuf = .{
//.url = "https://github.com/Arwalk/zig-protobuf/archive/7c49ed66e029c9c7e6253b3d6d256118745550a4.tar.gz",
.url = "git+https://github.com/Arwalk/zig-protobuf?ref=v2.0.0#42ccf142e5d6b7de886b766af7d287021c561dfd",
.url = "https://github.com/Arwalk/zig-protobuf/archive/7c49ed66e029c9c7e6253b3d6d256118745550a4.tar.gz",
.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,
"hash64": 7610618346915917303
},
"MazeGroupID1": 2,
"MazeGroupID2": 0
"MazeGroupID1": 2
},
{
"NpcMonsterIDList2": [],
@ -86,8 +85,7 @@
"Hash": 2143337843,
"hash64": 17271419042682156335
},
"MazeGroupID1": 2,
"MazeGroupID2": 0
"MazeGroupID1": 2
},
{
"NpcMonsterIDList2": [],
@ -131,8 +129,7 @@
"Hash": 577253902,
"hash64": 5150775987177055706
},
"MazeGroupID1": 2,
"MazeGroupID2": 0
"MazeGroupID1": 2
},
{
"NpcMonsterIDList2": [],
@ -176,8 +173,7 @@
"Hash": -1345060399,
"hash64": 7564248973955320288
},
"MazeGroupID1": 2,
"MazeGroupID2": 0
"MazeGroupID1": 2
},
{
"NpcMonsterIDList2": [],
@ -221,8 +217,7 @@
"Hash": 1383822956,
"hash64": 5242189358921793964
},
"MazeGroupID1": 2,
"MazeGroupID2": 0
"MazeGroupID1": 2
},
{
"NpcMonsterIDList2": [],
@ -267,8 +262,7 @@
"Hash": -182260985,
"hash64": 15269943691528539554
},
"MazeGroupID1": 4,
"MazeGroupID2": 0
"MazeGroupID1": 4
},
{
"NpcMonsterIDList2": [],
@ -314,8 +308,7 @@
"Hash": -1748344926,
"hash64": 8853592441228331582
},
"MazeGroupID1": 4,
"MazeGroupID2": 0
"MazeGroupID1": 4
},
{
"NpcMonsterIDList2": [],
@ -361,8 +354,7 @@
"Hash": 1336768789,
"hash64": 11639544939584837964
},
"MazeGroupID1": 4,
"MazeGroupID2": 0
"MazeGroupID1": 4
},
{
"NpcMonsterIDList2": [],
@ -407,8 +399,7 @@
"Hash": -229315152,
"hash64": 13127512314370178244
},
"MazeGroupID1": 4,
"MazeGroupID2": 0
"MazeGroupID1": 4
},
{
"NpcMonsterIDList2": [],
@ -454,8 +445,7 @@
"Hash": 1577274280,
"hash64": 3433035089102959956
},
"MazeGroupID1": 4,
"MazeGroupID2": 0
"MazeGroupID1": 4
},
{
"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,
"eventId": 99999011,
"pos": {
"x": -714570,
"y": 6270,
"z": 67130
"x": 580,
"y": 8551,
"z": 54030
},
"rot": {
"x": 0,