Compare commits
7 commits
Author | SHA1 | Date | |
---|---|---|---|
6bf275c682 | |||
0828923c2d | |||
923be22ad5 | |||
3075e30f2f | |||
724e13fa38 | |||
56085b79df | |||
681207e2cb |
33 changed files with 377886 additions and 819 deletions
341
config.json
341
config.json
|
@ -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,
|
||||
|
|
|
@ -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 "";
|
||||
}
|
||||
|
|
|
@ -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
|
@ -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};
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
};
|
||||
|
|
158
gameserver/src/manager/challenge_mgr.zig
Normal file
158
gameserver/src/manager/challenge_mgr.zig
Normal 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;
|
||||
}
|
||||
};
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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(.{
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
});
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
});
|
||||
}
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
16
hotfix.json
16
hotfix.json
|
@ -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": ""
|
||||
}
|
||||
}
|
|
@ -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",
|
||||
},
|
||||
},
|
||||
|
|
2065
resources/ActivityConfig.json
Normal file
2065
resources/ActivityConfig.json
Normal file
File diff suppressed because it is too large
Load diff
753
resources/AvatarPlayerIcon.json
Normal file
753
resources/AvatarPlayerIcon.json
Normal 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
|
||||
}
|
||||
]
|
||||
}
|
|
@ -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
48200
resources/MainMission.json
Normal file
File diff suppressed because it is too large
Load diff
299010
resources/StageConfig.json
Normal file
299010
resources/StageConfig.json
Normal file
File diff suppressed because it is too large
Load diff
13462
resources/TutorialData.json
Normal file
13462
resources/TutorialData.json
Normal file
File diff suppressed because it is too large
Load diff
13008
resources/TutorialGuideGroup.json
Normal file
13008
resources/TutorialGuideGroup.json
Normal file
File diff suppressed because it is too large
Load diff
|
@ -199568,9 +199568,9 @@
|
|||
"instId": 200001,
|
||||
"eventId": 99999011,
|
||||
"pos": {
|
||||
"x": -714570,
|
||||
"y": 6270,
|
||||
"z": 67130
|
||||
"x": 580,
|
||||
"y": 8551,
|
||||
"z": 54030
|
||||
},
|
||||
"rot": {
|
||||
"x": 0,
|
||||
|
|
Loading…
Reference in a new issue