gacha: implementation #2 (#27)

Co-authored-by: labalityowo <56186498+labalityowo@users.noreply.github.com>
This commit is contained in:
timing1337 2022-08-03 12:52:47 +07:00 committed by GitHub
parent a5500cf32f
commit d643bedbbe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 113 additions and 13 deletions

3
.gitignore vendored
View File

@ -109,4 +109,5 @@ dist
# CrepeSR # CrepeSR
config.json config.json
src/data/* src/data/*
banners.json

View File

@ -6,11 +6,13 @@
import Interface from "./commands/Interface"; import Interface from "./commands/Interface";
import HttpServer from "./http/HttpServer"; import HttpServer from "./http/HttpServer";
import SRServer from "./server/kcp/SRServer"; import SRServer from "./server/kcp/SRServer";
import Banners from "./util/Banner";
import Logger from "./util/Logger"; import Logger from "./util/Logger";
import ProtoFactory from "./util/ProtoFactory" import ProtoFactory from "./util/ProtoFactory"
const c = new Logger("CrepeSR"); const c = new Logger("CrepeSR");
c.log(`Starting CrepeSR...`); c.log(`Starting CrepeSR...`);
Banners.init();
ProtoFactory.init(); ProtoFactory.init();
Interface.start(); Interface.start();
HttpServer.getInstance().start(); HttpServer.getInstance().start();

View File

@ -0,0 +1,35 @@
import { DoGachaCsReq, DoGachaScRsp, GachaItem, Item, ItemList } from "../../data/proto/StarRail";
import Banners from "../../util/Banner";
import Packet from "../kcp/Packet";
import Session from "../kcp/Session";
export default async function handle(session: Session, packet: Packet) {
const gachaItemList: GachaItem[] = [];
const body = packet.body as DoGachaCsReq;
const banner = Banners.config.find(banner => banner.gachaId === body.gachaId)!;
const combined = banner.rateUpItems4.concat(banner.rateUpItems5)
//bad gachaing but whatever....
//TODO: pity system, proper logic
for(let i = 0; i < body.gachaNum; i++){
const result = combined[Math.floor(Math.random() * combined.length)];
gachaItemList.push({
gachaItem: {
itemId: result,
num: 1
} as Item,
tokenItem: {},
transferItemList: {},
isNew: true //TODO: avatar checking
} as GachaItem);
}
session.send("DoGachaScRsp", {
retcode: 0,
gachaId: body.gachaId!,
gachaNum: body.gachaNum!,
newGachaRandom: body.gachaRandom!,
newbieGachaCnt: 0,
todayGachaCnt: 0,
todayTotalGachaCnt: 0, //todo find out what are THESE
gachaItemList: gachaItemList
} as DoGachaScRsp);
}

View File

@ -1,21 +1,22 @@
import { GetGachaInfoScRsp } from "../../data/proto/StarRail"; import { GachaInfo, GetGachaInfoCsReq, GetGachaInfoScRsp } from "../../data/proto/StarRail";
import Packet from "../kcp/Packet"; import Packet from "../kcp/Packet";
import Session from "../kcp/Session"; import Session from "../kcp/Session";
import Banner from './../../util/Banner';
const unix = () => Math.floor(Date.now() / 1000);
export default async function handle(session: Session, packet: Packet) { export default async function handle(session: Session, packet: Packet) {
session.send("GetGachaInfoScRsp", { session.send("GetGachaInfoScRsp", {
gachaRandom: 2503, gachaRandom: 0,
retcode: 0, retcode: 0,
gachaInfoList: [{ gachaInfoList: Banner.config.map(banner => {
beginTime: unix(), return {
endTime: unix() * 2, beginTime: 0,
newbieGachaCnt: 10, endTime: 1924992000,
todayGachaCnt: 10, gachaId: banner.gachaId,
gachaId: 1001, // TODO: Figure out gachaIDs detailWebview: banner.detailWebview,
detailWebview: "https://omfgdogs.com/" newbieGachaCnt: 0,
}], todayGachaCnt: 0
} as GachaInfo
}),
todaySingleGachaMaxCnt: 10, todaySingleGachaMaxCnt: 10,
todayTotalGachaCnt: 10, todayTotalGachaCnt: 10,
} as GetGachaInfoScRsp); } as GetGachaInfoScRsp);

61
src/util/Banner.ts Normal file
View File

@ -0,0 +1,61 @@
import fs from 'fs';
import { resolve } from 'path';
import { VerboseLevel } from './Logger';
type Banner = {
gachaId: number,
detailWebview: string,
rateUpItems4: number[],
rateUpItems5: number[],
costItemId: number
}
function r(...args: string[]) {
return fs.readFileSync(resolve(__dirname, ...args)).toString();
}
export default class Banners {
public static config: Banner[];
public static init(){
Banners.readConfig();
}
private static readConfig(){
let config: Banner[];
const defaultConfig: Banner[] = [
{
gachaId: 1001,
detailWebview: "",
rateUpItems4: [
1001, 1103
],
rateUpItems5: [
1102
],
costItemId: -1 //unused for now
} as Banner
];
try {
config = JSON.parse(r('../../banners.json'));
for(const [index, gachaBanner] of Object.entries(config)){
const missing = Object.keys(defaultConfig[0]).filter(key => !gachaBanner.hasOwnProperty(key));
if (missing.length > 0) {
console.log(`Missing ${missing.join(', ')}, using default values. Backup of your older config: ${JSON.stringify(gachaBanner, null, 2)}`);
config[parseInt(index)] = defaultConfig[0];
}
}
Banners.updateConfig(config);
} catch {
console.error("Could not read banners file. Creating one for you...");
Banners.updateConfig(defaultConfig);
}
}
private static updateConfig(config: Banner[]) {
this.config = config;
fs.writeFileSync('./banners.json', JSON.stringify(config, null, 2));
}
}