2022-08-15 10:47:34 +07:00
import { Application } from "express" ;
import { Module } from "module" ;
import { prisma } from ".." ;
2022-08-24 16:46:52 +07:00
import { CarPathandTuning } from "@prisma/client" ;
2022-08-15 10:47:34 +07:00
import Long from "long" ;
2022-08-25 14:39:01 +07:00
import { Config } from "../config" ;
2022-12-25 16:22:58 +07:00
let MersenneTwister = require ( 'chancer' ) ;
2022-08-15 10:47:34 +07:00
// Import Proto
import * as wm from "../wmmt/wm.proto" ;
import * as wmsrv from "../wmmt/service.proto" ;
// Import Util
import * as common from "../util/common" ;
2022-08-24 16:46:52 +07:00
import * as ghost_save_trail from "../util/ghost/ghost_save_trail" ;
import * as ghost_trail from "../util/ghost/ghost_trail" ;
2022-08-31 19:13:58 +07:00
import * as ghost_area from "../util/ghost/ghost_area" ;
2022-08-15 10:47:34 +07:00
export default class GhostModule extends Module {
register ( app : Application ) : void {
// Load Ghost Battle Info
app . post ( '/method/load_ghost_battle_info' , async ( req , res ) = > {
2022-08-24 16:46:52 +07:00
// Get the request body for the load stamp target request
let body = wm . wm . protobuf . LoadGhostBattleInfoRequest . decode ( req . body ) ;
let car = await prisma . car . findFirst ( {
where : {
carId : body.carId
2022-08-24 17:14:06 +07:00
} ,
include : {
gtWing : true ,
lastPlayedPlace : true
2022-08-24 16:46:52 +07:00
}
} )
2022-08-25 11:16:44 +07:00
// Car History
let findChallenger = await prisma . carChallenger . findMany ( {
2022-08-15 10:47:34 +07:00
where : {
2022-08-25 11:16:44 +07:00
challengerCarId : body.carId
2022-08-25 11:24:43 +07:00
} ,
orderBy : {
lastPlayedAt : 'desc'
} ,
take : 10
2022-08-25 11:16:44 +07:00
} )
let carsHistory : wm.wm.protobuf.Car [ ] = [ ] ;
if ( findChallenger . length > 0 )
{
for ( let i = 0 ; i < findChallenger.length ; i + + )
{
let car = await prisma . car . findFirst ( {
where : {
carId : findChallenger [ i ] . carId
2022-08-15 10:47:34 +07:00
} ,
2022-08-25 11:16:44 +07:00
include : {
gtWing : true ,
lastPlayedPlace : true
2022-08-15 10:47:34 +07:00
} ,
2022-08-25 11:16:44 +07:00
orderBy : {
carId : 'asc'
} ,
take : 10
} ) ;
carsHistory . push ( wm . wm . protobuf . Car . create ( {
. . . car !
} ) )
}
}
2022-08-15 10:47:34 +07:00
2022-08-24 16:46:52 +07:00
let carsStamp : wm.wm.protobuf.StampTargetCar [ ] = [ ] ;
let carsChallenger : wm.wm.protobuf.ChallengerCar [ ] = [ ] ;
// Get all of the friend cars for the carId provided
let stampTargets = await prisma . carStampTarget . findMany ( {
where : {
2022-08-30 18:29:15 +07:00
stampTargetCarId : body.carId ,
2022-08-31 23:31:16 +07:00
recommended : true
} ,
orderBy : {
locked : 'desc'
}
2022-08-24 16:46:52 +07:00
} ) ;
if ( stampTargets )
2022-08-15 10:47:34 +07:00
{
2022-08-24 16:46:52 +07:00
for ( let i = 0 ; i < stampTargets.length ; i + + )
{
let carTarget = await prisma . car . findFirst ( {
where : {
carId : stampTargets [ i ] . carId
2022-08-24 17:14:06 +07:00
} ,
include : {
gtWing : true ,
lastPlayedPlace : true
2022-08-24 16:46:52 +07:00
}
} )
carsStamp . push (
wm . wm . protobuf . StampTargetCar . create ( {
car : carTarget ! ,
returnCount : stampTargets [ i ] . returnCount ,
locked : stampTargets [ i ] . locked ,
recommended : stampTargets [ i ] . recommended
} )
) ;
}
}
2022-09-10 10:47:53 +07:00
// Get all of the challenger car for the carId provided except beated car
let checkBeatedCar = await prisma . carStampTarget . findMany ( {
where : {
stampTargetCarId : body.carId ,
recommended : false
} ,
orderBy : {
carId : 'asc'
}
} ) ;
let arrChallengerCarId = [ ] ;
for ( let i = 0 ; i < checkBeatedCar.length ; i + + )
{
arrChallengerCarId . push ( checkBeatedCar [ i ] . carId ) ;
}
2022-08-24 16:46:52 +07:00
let challengers = await prisma . carChallenger . findMany ( {
where : {
2022-09-10 10:47:53 +07:00
carId : body.carId ,
NOT : {
challengerCarId : { in : arrChallengerCarId } , // Except beated challenger id
} ,
2022-08-24 16:46:52 +07:00
}
} ) ;
if ( challengers )
{
for ( let i = 0 ; i < challengers.length ; i + + )
{
let carTarget = await prisma . car . findFirst ( {
where : {
2022-08-24 23:41:46 +07:00
carId : challengers [ i ] . challengerCarId
2022-08-24 17:14:06 +07:00
} ,
include : {
gtWing : true ,
lastPlayedPlace : true
2022-08-24 16:46:52 +07:00
}
} )
2022-08-26 14:01:23 +07:00
let result = 0 ;
if ( challengers [ i ] . result > 0 )
{
result = - Math . abs ( challengers [ i ] . result ) ;
}
else {
result = Math . abs ( challengers [ i ] . result ) ;
}
2022-08-24 16:46:52 +07:00
carsChallenger . push (
wm . wm . protobuf . ChallengerCar . create ( {
car : carTarget ! ,
stamp : challengers [ i ] . stamp ,
2022-08-26 14:01:23 +07:00
result : result ,
2022-08-24 16:46:52 +07:00
area : challengers [ i ] . area
} )
) ;
2022-08-15 10:47:34 +07:00
}
}
// Response data
let msg = {
error : wm.wm.protobuf.ErrorCode.ERR_SUCCESS ,
2022-08-24 23:41:46 +07:00
stampTargetCars : carsStamp || null ,
challengers : carsChallenger || null ,
2022-08-24 16:46:52 +07:00
stampSheetCount : car ! . stampSheetCount ,
stampSheet : car?.stampSheet || null ,
stampReturnStats : car?.stampSheet || null ,
2022-08-25 11:27:36 +07:00
history : carsHistory || null ,
2022-08-15 10:47:34 +07:00
} ;
// Encode the response
let message = wm . wm . protobuf . LoadGhostBattleInfoResponse . encode ( msg ) ;
// Send the response to the client
common . sendResponse ( message , res ) ;
} )
2022-08-25 14:39:01 +07:00
// Load Stamp Target
2022-08-15 10:47:34 +07:00
app . post ( '/method/load_stamp_target' , async ( req , res ) = > {
// Get the request body for the load stamp target request
2022-08-24 16:46:52 +07:00
let body = wm . wm . protobuf . LoadStampTargetRequest . decode ( req . body ) ;
let carsStamp : wm.wm.protobuf.StampTargetCar [ ] = [ ] ;
let carsChallenger : wm.wm.protobuf.ChallengerCar [ ] = [ ] ;
// Get all of the friend cars for the carId provided
let stampTargets = await prisma . carStampTarget . findMany ( {
where : {
2022-08-30 18:29:15 +07:00
stampTargetCarId : body.carId ,
2022-08-31 23:31:16 +07:00
recommended : true
} ,
orderBy : {
locked : 'asc'
}
2022-08-24 16:46:52 +07:00
} ) ;
if ( stampTargets )
{
for ( let i = 0 ; i < stampTargets.length ; i + + )
{
let carTarget = await prisma . car . findFirst ( {
where : {
2022-08-30 18:29:15 +07:00
carId : stampTargets [ i ] . carId
2022-08-24 17:14:06 +07:00
} ,
include : {
gtWing : true ,
lastPlayedPlace : true
2022-08-24 16:46:52 +07:00
}
} )
carsStamp . push (
wm . wm . protobuf . StampTargetCar . create ( {
car : carTarget ! ,
returnCount : stampTargets [ i ] . returnCount ,
locked : stampTargets [ i ] . locked ,
recommended : stampTargets [ i ] . recommended
} )
) ;
}
}
2022-08-15 10:47:34 +07:00
2022-08-24 16:46:52 +07:00
// Get all of the friend cars for the carId provided
let challengers = await prisma . carChallenger . findMany ( {
where : {
carId : body.carId
}
} ) ;
if ( stampTargets )
{
for ( let i = 0 ; i < challengers.length ; i + + )
{
let carTarget = await prisma . car . findFirst ( {
where : {
carId : challengers [ i ] . challengerCarId
2022-08-24 17:14:06 +07:00
} ,
include : {
gtWing : true ,
lastPlayedPlace : true
2022-08-24 16:46:52 +07:00
}
} )
2022-08-26 14:01:23 +07:00
let result = 0 ;
if ( challengers [ i ] . result > 0 )
{
result = - Math . abs ( challengers [ i ] . result ) ;
}
else {
result = Math . abs ( challengers [ i ] . result ) ;
}
2022-08-24 16:46:52 +07:00
carsChallenger . push (
wm . wm . protobuf . ChallengerCar . create ( {
car : carTarget ! ,
stamp : challengers [ i ] . stamp ,
2022-08-26 14:01:23 +07:00
result : result ,
2022-08-24 16:46:52 +07:00
area : challengers [ i ] . area
} )
) ;
}
}
2022-08-15 10:47:34 +07:00
// Response data
let msg = {
error : wm.wm.protobuf.ErrorCode.ERR_SUCCESS ,
2022-08-24 16:46:52 +07:00
cars : carsStamp ,
challengers : carsChallenger
2022-08-15 10:47:34 +07:00
} ;
// Encode the response
let message = wm . wm . protobuf . LoadStampTargetResponse . encode ( msg ) ;
// Send the response to the client
common . sendResponse ( message , res ) ;
} )
2022-08-25 14:39:01 +07:00
// Ghost Mode
2022-08-15 10:47:34 +07:00
app . post ( '/method/search_cars_by_level' , async ( req , res ) = > {
// Get the request body for the search cars by level request
let body = wm . wm . protobuf . SearchCarsByLevelRequest . decode ( req . body ) ;
2022-08-25 11:02:43 +07:00
let car ;
2022-08-25 14:39:01 +07:00
2022-08-25 11:02:43 +07:00
if ( body . regionId !== null && body . regionId !== undefined && body . regionId !== 0 )
{
// Find ghost car by selected level and region ID
car = await prisma . car . findMany ( {
where : {
ghostLevel : body.ghostLevel ,
regionId : body.regionId
} ,
include : {
gtWing : true ,
lastPlayedPlace : true ,
}
} ) ;
}
else
{
// Find ghost car by selected level
car = await prisma . car . findMany ( {
where : {
ghostLevel : body.ghostLevel ,
} ,
include : {
gtWing : true ,
lastPlayedPlace : true ,
}
} ) ;
}
2022-08-15 10:47:34 +07:00
// Randomizing the starting ramp and path based on selected area
let rampVal = 0 ;
let pathVal = 0 ;
2022-08-31 19:13:58 +07:00
// Get the ramp and path id
let ghost_areas = await ghost_area . GhostArea ( body . area ) ;
// Set the value
rampVal = ghost_areas . rampVal ;
pathVal = ghost_areas . pathVal ;
2022-08-15 10:47:34 +07:00
// Empty list of ghost car records
let lists_ghostcar : wm.wm.protobuf.GhostCar [ ] = [ ] ;
let arr = [ ] ;
let maxNumber = 0 ;
// If all user car data available is more than 10 for certain level
2022-08-25 14:39:01 +07:00
if ( car . length > 10 )
{
2022-08-15 10:47:34 +07:00
maxNumber = 10 // Limit to 10 (game default)
}
// If no more than 10
2022-08-25 14:39:01 +07:00
else
{
2022-08-15 10:47:34 +07:00
maxNumber = car . length ;
}
// Choose the user's car data randomly to appear
2022-08-24 16:46:52 +07:00
while ( arr . length < maxNumber )
{
2022-08-15 10:47:34 +07:00
// Pick random car Id
2023-01-03 21:22:12 +07:00
let randomNumber = MersenneTwister . int ( 0 , car . length - 1 ) ;
2022-09-04 19:03:11 +07:00
if ( arr . indexOf ( randomNumber ) === - 1 )
{
2022-08-15 10:47:34 +07:00
// Push current number to array
arr . push ( randomNumber ) ;
// Check if ghost trail for certain car is available
let ghost_trails = await prisma . ghostTrail . findFirst ( {
where : {
carId : car [ randomNumber ] . carId ,
area : body.area ,
crownBattle : false
} ,
orderBy : {
playedAt : 'desc'
}
} ) ;
// If regionId is 0 or not set, game will crash after defeating the ghost
if ( car [ randomNumber ] ! . regionId === 0 )
2022-12-25 16:22:58 +07:00
{
car [ randomNumber ] . regionId = MersenneTwister . int ( 1 , 47 ) ;
2022-08-15 10:47:34 +07:00
}
// Push user's car data without ghost trail
2022-08-25 14:39:01 +07:00
if ( ! ( ghost_trails ) )
{
2022-08-15 10:47:34 +07:00
lists_ghostcar . push ( wm . wm . protobuf . GhostCar . create ( {
car : car [ randomNumber ]
} ) ) ;
}
// Push user's car data with ghost trail
2022-08-25 14:39:01 +07:00
else
{
2022-08-15 10:47:34 +07:00
// Set the tunePower used when playing certain area
car [ randomNumber ] . tunePower = ghost_trails ! . tunePower ;
// Set the tuneHandling used when playing certain area
car [ randomNumber ] . tuneHandling = ghost_trails ! . tuneHandling ;
// Push data to Ghost car proto
lists_ghostcar . push ( wm . wm . protobuf . GhostCar . create ( {
car : car [ randomNumber ] ,
nonhuman : false ,
type : wm . wm . protobuf . GhostType . GHOST_NORMAL ,
trailId : ghost_trails ! . dbId !
} ) ) ;
}
}
}
2022-08-25 14:39:01 +07:00
// Check again if car list for that selected region is available of not
if ( body . regionId !== null && body . regionId !== undefined && body . regionId !== 0 )
{
if ( car . length < 1 )
{
// Get current date
let date = Math . floor ( new Date ( ) . getTime ( ) / 1000 ) ;
let playedPlace = wm . wm . protobuf . Place . create ( {
placeId : Config.getConfig ( ) . placeId ,
regionId : Config.getConfig ( ) . regionId ,
shopName : Config.getConfig ( ) . shopName ,
country : Config.getConfig ( ) . country
} ) ;
let tunePowerDefault = 0
let tuneHandlingDefault = 0 ;
if ( body . ghostLevel === 1 )
{
tunePowerDefault = 1 ;
tuneHandlingDefault = 4 ;
}
else if ( body . ghostLevel === 2 )
{
tunePowerDefault = 5 ;
tuneHandlingDefault = 5 ;
}
else if ( body . ghostLevel === 3 )
{
tunePowerDefault = 8 ;
tuneHandlingDefault = 7 ;
}
else if ( body . ghostLevel === 4 )
{
tunePowerDefault = 10 ;
tuneHandlingDefault = 10 ;
}
else if ( body . ghostLevel === 5 )
{
tunePowerDefault = 15 ;
tuneHandlingDefault = 10 ;
}
else if ( body . ghostLevel === 6 )
{
tunePowerDefault = 18 ;
tuneHandlingDefault = 10 ;
}
else if ( body . ghostLevel === 7 )
{
tunePowerDefault = 20 ;
tuneHandlingDefault = 10 ;
}
else if ( body . ghostLevel === 8 )
{
tunePowerDefault = 21 ;
tuneHandlingDefault = 10 ;
}
else if ( body . ghostLevel === 9 )
{
tunePowerDefault = 22 ;
tuneHandlingDefault = 10 ;
}
else if ( body . ghostLevel === 10 )
{
2022-08-25 14:56:04 +07:00
tunePowerDefault = 24 ;
2022-08-25 14:39:01 +07:00
tuneHandlingDefault = 10 ;
}
else if ( body . ghostLevel === 11 )
{
tunePowerDefault = 24 ;
tuneHandlingDefault = 24 ;
}
// Generate default S660 car data
car = wm . wm . protobuf . Car . create ( {
carId : 999999999 , // Don't change this
name : 'S 6 6 0 ' ,
regionId : body.regionId , // IDN (福井)
manufacturer : 12 , // HONDA
model : 105 , // S660 [JW5]
visualModel : 130 , // S660 [JW5]
defaultColor : 0 ,
customColor : 0 ,
wheel : 20 ,
wheelColor : 0 ,
aero : 0 ,
bonnet : 0 ,
wing : 0 ,
mirror : 0 ,
neon : 0 ,
trunk : 0 ,
plate : 0 ,
plateColor : 0 ,
plateNumber : 0 ,
tunePower : tunePowerDefault ,
tuneHandling : tuneHandlingDefault ,
rivalMarker : 32 ,
aura : 551 ,
windowSticker : true ,
windowStickerString : 'B A Y S H O R E ' ,
windowStickerFont : 0 ,
title : 'No Ghost for this Region' ,
level : 65 , // SSSSS
lastPlayedAt : date ,
country : 'JPN' ,
lastPlayedPlace : playedPlace
} ) ;
// Push data to Ghost car proto
lists_ghostcar . push ( wm . wm . protobuf . GhostCar . create ( {
car : car ,
nonhuman : true ,
type : wm . wm . protobuf . GhostType . GHOST_DEFAULT ,
} ) ) ;
}
// else{} have car list
}
2022-08-15 10:47:34 +07:00
// Response data
let msg = {
error : wm.wm.protobuf.ErrorCode.ERR_SUCCESS ,
ramp : rampVal ,
path : pathVal ,
ghosts : lists_ghostcar ,
selectionMethod : Number ( wm . wm . protobuf . GhostSelectionMethod . GHOST_SELECT_BY_LEVEL )
} ;
// Encode the response
let message = wm . wm . protobuf . SearchCarsByLevelResponse . encode ( msg ) ;
// Send the response to the client
common . sendResponse ( message , res ) ;
} )
// Load Normal Ghost Trail data
app . post ( '/method/load_ghost_drive_data' , async ( req , res ) = > {
// Get the request body for the load ghost drive data request
let body = wm . wm . protobuf . LoadGhostDriveDataRequest . decode ( req . body ) ;
// Get the path value from request body
let path = body . path ;
// Empty list of ghost drive data records
let lists_ghostcar : wm.wm.protobuf.LoadGhostDriveDataResponse.GhostDriveData [ ] = [ ] ;
// Check how many opponent ghost data available (including user data)
2022-08-24 16:46:52 +07:00
for ( let i = 0 ; i < body.carTunings.length ; i + + )
{
2022-08-15 10:47:34 +07:00
// Check if opponent ghost have trail
let ghost_trails = await prisma . ghostTrail . findFirst ( {
where : {
carId : body.carTunings [ i ] . carId ! ,
path : body.path ,
} ,
orderBy : {
playedAt : 'desc'
}
} ) ;
// ---Get the user and opponent ghost trail data---
let ghostType : number = wm . wm . protobuf . GhostType . GHOST_NORMAL ;
let lists_binarydriveData ;
if ( ghost_trails ? . driveData !== null && ghost_trails ? . driveData !== undefined ) {
lists_binarydriveData = wm . wm . protobuf . BinaryData . create ( {
data : ghost_trails ! . driveData ! ,
mergeSerial : ghost_trails ! . driveDMergeSerial !
} ) ;
}
let lists_binaryByArea
if ( ghost_trails ? . trendBinaryByArea !== null && ghost_trails ? . trendBinaryByArea !== undefined ) {
lists_binaryByArea = wm . wm . protobuf . BinaryData . create ( {
data : ghost_trails ! . trendBinaryByArea ! ,
mergeSerial : ghost_trails ! . byAreaMergeSerial !
} ) ;
}
let lists_binaryByCar
if ( ghost_trails ? . trendBinaryByCar !== null && ghost_trails ? . trendBinaryByCar !== undefined ) {
lists_binaryByCar = wm . wm . protobuf . BinaryData . create ( {
data : ghost_trails ! . trendBinaryByCar ! ,
mergeSerial : ghost_trails ! . byCarMergeSerial !
} ) ;
}
let lists_binaryByUser
if ( ghost_trails ? . trendBinaryByUser !== null && ghost_trails ? . trendBinaryByUser !== undefined ) {
lists_binaryByUser = wm . wm . protobuf . BinaryData . create ( {
data : ghost_trails ! . trendBinaryByUser ! ,
mergeSerial : ghost_trails ! . byUserMergeSerial !
} ) ;
}
// ------------------------------------------------
// Push the data
lists_ghostcar . push ( wm . wm . protobuf . LoadGhostDriveDataResponse . GhostDriveData . create ( { // Push the data
carId : Number ( body . carTunings [ i ] . carId ! ) ,
type : ghostType ,
driveData : lists_binarydriveData || null ,
trendBinaryByArea : lists_binaryByArea || null ,
trendBinaryByCar : lists_binaryByCar || null ,
trendBinaryByUser : lists_binaryByUser || null ,
} ) ) ;
}
// Response data
let msg = {
error : wm.wm.protobuf.ErrorCode.ERR_SUCCESS ,
path : path ,
data : lists_ghostcar
} ;
// Encode the response
let message = wm . wm . protobuf . LoadGhostDriveDataResponse . encode ( msg ) ;
// Send the response to the client
common . sendResponse ( message , res ) ;
} )
// Saving the ghost trail on mileage screen
app . post ( '/method/register_ghost_trail' , async ( req , res ) = > {
// Get the request body for the register ghost trail request
let body = wm . wm . protobuf . RegisterGhostTrailRequest . decode ( req . body ) ;
// Get the session id
let actualSessionId : number = 0 ;
// If the session are set, and are long data
if ( Long . isLong ( body . ghostSessionId ) )
{
// Convert them to BigInt and add to the data
actualSessionId = common . getBigIntFromLong ( body . ghostSessionId ) ;
}
// OCM game mode session id
if ( actualSessionId > 100 && actualSessionId < 201 )
{
console . log ( 'OCM Ghost Battle Game found' ) ;
// User playing ocm battle game mode
await ghost_save_trail . saveOCMGhostTrail ( body ) ;
}
// Ghost Battle or Crown Ghost Battle game Mode session id
else if ( actualSessionId > 0 && actualSessionId < 101 )
{
// Check if it is crown ghost battle or not (crown ghost battle don't have time, driveData, trendBinaryByArea, trendBinaryByCar, trendBinaryByUser value from request body)
2022-08-16 15:38:05 +07:00
if ( ! ( body . trendBinaryByArea ) && ! ( body . trendBinaryByCar ) && ! ( body . trendBinaryByUser ) )
2022-08-15 10:47:34 +07:00
{
console . log ( 'Crown Ghost Battle Game found' ) ;
// User is playing crown ghost battle game mode
await ghost_save_trail . saveCrownGhostTrail ( body ) ;
}
else
{
console . log ( 'Normal Ghost Battle Game found' ) ;
// User is playing normal ghost battle game mode
await ghost_save_trail . saveNormalGhostTrail ( body ) ;
// Saving Ghost Path and Tuning
await ghost_save_trail . savePathAndTuning ( body ) ;
}
}
// Response data
let msg = {
error : wm.wm.protobuf.ErrorCode.ERR_SUCCESS
}
// Encode the response
let message = wm . wm . protobuf . RegisterGhostTrailResponse . encode ( msg ) ;
// Send the response to the client
common . sendResponse ( message , res ) ;
} )
// Load Crown Ghost Trail or Top 1 OCM Ghost Trail
app . get ( '/resource/ghost_trail' , async ( req , res ) = > {
// Get url query parameter [For Crown Ghost Battle]
let pCarId = Number ( req . query . car_id ) ;
let pArea = Number ( req . query . area ) ;
// Get url query parameter [For OCM Ghost Battle]
let pTrailId = Number ( req . query . trail_id ) || undefined ;
// Declare variable
let rampVal : number = 0 ;
let pathVal : number = 0 ;
let playedAt : number = 0 ;
let ghostTrail ;
// Query parameter from OCM Battle available
if ( pTrailId )
{
2022-09-17 20:07:26 +07:00
console . log ( 'Requesting OCM Ghost Trail' ) ;
2022-08-15 10:47:34 +07:00
// Get the trail data
let ghost_trails = await ghost_trail . getOCMGhostTrail ( pCarId , pTrailId ) ;
2023-01-03 14:33:48 +07:00
pArea = ghost_trails . areaVal ;
rampVal = ghost_trails . rampVal ;
pathVal = ghost_trails . pathVal ;
playedAt = ghost_trails . playedAt ;
ghostTrail = ghost_trails . ghostTrail ;
2022-08-15 10:47:34 +07:00
}
// Query parameter from Crown Ghost Battle available
else
{
2022-09-17 20:07:26 +07:00
console . log ( 'Requesting Crown Ghost Trail' ) ;
2022-08-15 10:47:34 +07:00
// Get the crown trail data
let ghost_trails = await ghost_trail . getCrownGhostTrail ( pCarId , pArea ) ;
rampVal = ghost_trails . rampVal ;
pathVal = ghost_trails . pathVal ;
playedAt = ghost_trails . playedAt ;
ghostTrail = ghost_trails . ghostTrail ;
}
// Response data
let msg = {
carId : pCarId ,
area : pArea ,
ramp : rampVal ,
path : pathVal ,
playedAt : playedAt ,
trail : ghostTrail
} ;
// Encode the response
let message = wm . wm . protobuf . GhostTrail . encode ( msg ) ;
// Send the response to the client
common . sendResponse ( message , res ) ;
} )
// Load ghost path and tunings per area
app . post ( '/method/load_paths_and_tunings' , async ( req , res ) = > {
// Get the request body for the load path and tunings request
let body = wm . wm . protobuf . LoadPathsAndTuningsRequest . decode ( req . body ) ;
// Empty list of car path and tuning records
let carTbyP : wm.wm.protobuf.LoadPathsAndTuningsResponse.CarTuningsByPath [ ] = [ ] ;
// Loop GID_RUNAREA_*
for ( let j = 0 ; j < 19 ; j + + )
{
// 14 - 16 are dummy area, 17 is C1 Closed
if ( j >= 14 ) {
j = 18 ; // GID_RUNAREA_HIROSHIMA
}
let rampVal = 0 ;
let pathVal = 0 ;
2022-08-31 19:13:58 +07:00
// Get the ramp and path id
let ghost_areas = await ghost_area . GhostArea ( j ) ;
// Set the value
rampVal = ghost_areas . rampVal ;
pathVal = ghost_areas . pathVal ;
2022-08-15 10:47:34 +07:00
// Empty list of car tuning records
let carTuning : wm.wm.protobuf.CarTuning [ ] = [ ] ;
let pathAndTuning : CarPathandTuning | null ;
// Loop to how many opponent ghost selected by user
for ( let i = 0 ; i < body.selectedCars.length ; i + + )
{
// Get path and tuning per area
pathAndTuning = await prisma . carPathandTuning . findFirst ( {
where : {
carId : body.selectedCars [ i ] ,
area : j
} ,
orderBy : {
area : 'asc'
}
} ) ;
// Opponent ghost have path and tuning record for certain area
if ( pathAndTuning )
{
// Push the data
carTuning . push ( wm . wm . protobuf . CarTuning . create ( {
carId : body.selectedCars [ i ] ,
tunePower : pathAndTuning ! . tunePower ,
tuneHandling : pathAndTuning ! . tuneHandling ,
2022-08-24 16:46:52 +07:00
lastPlayedAt : pathAndTuning ! . lastPlayedAt ,
2022-08-15 10:47:34 +07:00
} ) ) ;
}
// Opponent ghost doesn't have path and tuning record for certain area
else
{
// Get user's car last used tunePower and tuneHandling
let car = await prisma . car . findFirst ( {
where : {
2022-08-24 16:46:52 +07:00
carId : body.selectedCars [ i ]
2022-08-15 10:47:34 +07:00
} ,
select : {
tunePower : true ,
tuneHandling : true
}
} ) ;
// Push the data
carTuning . push ( wm . wm . protobuf . CarTuning . create ( {
carId : body.selectedCars [ i ] ,
// Set the tunePower used when last played the game
tunePower : car ! . tunePower ,
// Set the tuneHandling used when last played the game
tuneHandling : car ! . tuneHandling
} ) ) ;
}
}
// Push the data
carTbyP . push ( wm . wm . protobuf . LoadPathsAndTuningsResponse . CarTuningsByPath . create ( {
area : j ,
ramp : rampVal ,
path : pathVal ,
carTunings : carTuning ,
selectionMethod : wm.wm.protobuf.PathSelectionMethod.PATH_NORMAL // idk what this is
} ) ) ;
}
// Response data
let msg = {
error : wm.wm.protobuf.ErrorCode.ERR_SUCCESS ,
data : carTbyP
} ;
// Encode the response
let message = wm . wm . protobuf . LoadPathsAndTuningsResponse . encode ( msg ) ;
// Send the response to the client
common . sendResponse ( message , res ) ;
} )
2022-08-26 13:10:13 +07:00
// Lock Crown
2022-08-15 10:47:34 +07:00
app . post ( '/method/lock_crown' , ( req , res ) = > {
2022-08-26 13:10:13 +07:00
// Get the information from the request
let body = wmsrv . wm . protobuf . LockCrownRequest . decode ( req . body ) ;
2022-08-15 10:47:34 +07:00
// Response data
let msg = {
error : wmsrv.wm.protobuf.ErrorCode.ERR_SUCCESS ,
} ;
// Encode the response
let message = wmsrv . wm . protobuf . LockCrownResponse . encode ( msg ) ;
// Send the response to the client
common . sendResponse ( message , res ) ;
} )
}
}