Commit 06e55585 authored by 神楽坂玲奈's avatar 神楽坂玲奈

server

parent 11abbb30
{
"ip": "112.124.4.110",
"port": 7911,
"http_port": 7922,
"version": 4896
}
\ No newline at end of file
......@@ -69,6 +69,124 @@
"0": "SINGLE",
"1": "MATCH",
"2": "TAG"
},
"MSG": {
"1": "RETRY",
"2": "HINT",
"3": "WAITING",
"4": "START",
"5": "WIN",
"6": "UPDATE_DATA",
"7": "UPDATE_CARD",
"8": "REQUEST_DECK",
"10": "SELECT_BATTLECMD",
"11": "SELECT_IDLECMD",
"12": "SELECT_EFFECTYN",
"13": "SELECT_YESNO",
"14": "SELECT_OPTION",
"15": "SELECT_CARD",
"16": "SELECT_CHAIN",
"18": "SELECT_PLACE",
"19": "SELECT_POSITION",
"20": "SELECT_TRIBUTE",
"21": "SORT_CHAIN",
"22": "SELECT_COUNTER",
"23": "SELECT_SUM",
"24": "SELECT_DISFIELD",
"25": "SORT_CARD",
"30": "CONFIRM_DECKTOP",
"31": "CONFIRM_CARDS",
"32": "SHUFFLE_DECK",
"33": "SHUFFLE_HAND",
"34": "REFRESH_DECK",
"35": "SWAP_GRAVE_DECK",
"36": "SHUFFLE_SET_CARD",
"37": "REVERSE_DECK",
"38": "DECK_TOP",
"40": "NEW_TURN",
"41": "NEW_PHASE",
"50": "MOVE",
"53": "POS_CHANGE",
"54": "SET",
"55": "SWAP",
"56": "FIELD_DISABLED",
"60": "SUMMONING",
"61": "SUMMONED",
"62": "SPSUMMONING",
"63": "SPSUMMONED",
"64": "FLIPSUMMONING",
"65": "FLIPSUMMONED",
"70": "CHAINING",
"71": "CHAINED",
"72": "CHAIN_SOLVING",
"73": "CHAIN_SOLVED",
"74": "CHAIN_END",
"75": "CHAIN_NEGATED",
"76": "CHAIN_DISABLED",
"80": "CARD_SELECTED",
"81": "RANDOM_SELECTED",
"83": "BECOME_TARGET",
"90": "DRAW",
"91": "DAMAGE",
"92": "RECOVER",
"93": "EQUIP",
"94": "LPUPDATE",
"95": "UNEQUIP",
"96": "CARD_TARGET",
"97": "CANCEL_TARGET",
"100": "PAY_LPCOST",
"101": "ADD_COUNTER",
"102": "REMOVE_COUNTER",
"110": "ATTACK",
"111": "BATTLE",
"112": "ATTACK_DISABLED",
"113": "DAMAGE_STEP_START",
"114": "DAMAGE_STEP_END",
"120": "MISSED_EFFECT",
"121": "BE_CHAIN_TARGET",
"122": "CREATE_RELATION",
"123": "RELEASE_RELATION",
"130": "TOSS_COIN",
"131": "TOSS_DICE",
"140": "ANNOUNCE_RACE",
"141": "ANNOUNCE_ATTRIB",
"142": "ANNOUNCE_CARD",
"143": "ANNOUNCE_NUMBER",
"160": "CARD_HINT",
"161": "TAG_SWAP",
"162": "RELOAD_FIELD",
"163": "AI_NAME",
"164": "SHOW_HINT",
"170": "MATCH_KILL",
"180": "CUSTOM_MSG"
},
"TIMING":{
"1": "DRAW_PHASE",
"2": "STANDBY_PHASE",
"4": "MAIN_END",
"8": "BATTLE_START",
"16": "BATTLE_END",
"32": "END_PHASE",
"64": "SUMMON",
"128": "SPSUMMON",
"256": "FLIPSUMMON",
"512": "MSET",
"1024": "SSET",
"2048": "POS_CHANGE",
"4096": "ATTACK",
"8192": "DAMAGE_STEP",
"16384": "DAMAGE_CAL",
"32768": "CHAIN_END",
"65536": "DRAW",
"131072": "DAMAGE",
"262144": "RECOVER",
"524288": "DESTROY",
"1048576": "REMOVE",
"2097152": "TOHAND",
"4194304": "TODECK",
"8388608": "TOGRAVE",
"16777216": "BATTLE_PHASE",
"33554432": "EQUIP"
}
}
......
This source diff could not be displayed because it is too large. You can view the blob instead.
{
"44508094": ["聚集的祈愿将成为新生的闪耀之星,化作光芒闪耀的道路吧!同调召唤,飞翔吧,星尘龙!",
"看看那被伟大之风引导的翅膀吧!同调召唤,星尘龙"],
"60800381": ["集中的星会唤起新的力量,化为闪耀之道吧!同调召唤,出现吧,废品战士!"],
"18013090": ["聚集的思念在此成为新生的力量,成为光芒闪耀的道路吧!同调召唤,燃烧吧,硝基战士!"],
"46195773": ["聚集的羁绊将编织出更强的力量,成为光芒闪耀的道路吧!同调召唤,出现吧,涡轮战士!"],
"2322421": ["聚集的希望引向新的地平线,成为光芒闪耀的道路吧!同调召唤,穿越吧,王道战士!"],
"7841112": ["聚集的星之光辉将照亮新的奇迹,成为光芒闪耀的道路吧!同调召唤,来临吧,救世星龙!"],
"42810973": ["聚集的呐喊将成为回音之箭划破天空,成为光芒闪耀的道路吧!同调召唤,出现吧,废品弓箭手!"],
"3429238": ["聚集的力量将化为贯穿大地长枪,成为光芒闪耀的道路吧!同调召唤!粉碎吧,钻头战士!"],
"74860293": ["聚集的斗志将唤醒怒吼的魔神,成为光芒闪耀的道路吧!同调召唤,粉碎吧,废品破坏王!"],
"59771339": ["聚集的愤怒将给忘我的战士寄宿鬼神之魂,成为光芒闪耀的道路吧!同调召唤,吼叫吧,废品狂战士!"],
"37993923": ["聚集的钢之祈愿将疾风的意志化为不摧的盾牌,成为光芒闪耀的道路吧!同调召唤!出现吧。废品守卫者"],
"50091196": ["聚集的祈愿将引向全新速度的地平线,成为光芒闪耀的道路吧!\n同调召唤,希望的力量,同调协调者,方程式同调士!"],
"24696097": ["聚集的梦之结晶将开启全新的进化之门,成为光芒闪耀的道路吧!加速同调,诞生吧,流星龙!"],
"35952884": ["聚集的群星化为一体时,新的羁绊将照亮未来,成为光芒照射的道路吧,三角加速同调,进化之光,流天类星龙"],
"70902743": ["王者的震撼,今就此展现强势!看好这撼天动地的力量吧!同调召唤,吾之魂,真红魔龙!"],
"40529384": ["王者的呐喊发出回响,胜利的铁锤,打破大地吧!同调召唤,振翅高飞吧,爆翼龙!"],
"67030233": ["被磨砺的孤高之光,成为真正的霸者照耀大地,绽放光辉!同调召唤,巨大的灵魂,救世魔龙!"],
"97489701": ["王者与恶魔现在就在此交汇,汹涌狂暴的灵魂发出创造天地的呐喊吧!双重同调,出现吧,红莲新星龙!"],
"36407615": ["崭新的王者的脉动,在混沌之中出现吧!同调召唤!高傲的魔王、恶魔混沌王!"],
"75326861": ["闪耀在天顶的死之星,降临于人间制裁世俗,同调召唤!天刑王 黑天!"],
"80321197": ["王者的决断,现在成为寄宿有红红滚滚的火焰的深红利刃,超越炙热的波涛,出现吧!\n同调召唤!火焰的鬼神,深红剑士"],
"69031175": ["黑色旋风,成为天空翱翔的翅膀吧!同调召唤,黑羽-铠翼鸦!"],
"76913983": ["漆黑的力量,寄托伟大的翅膀,卷起神风吧!同调召唤,狂吹吧,黑羽-兵翼鸦!"],
"33236860": ["风暴狂吹吧,获得钢铁的意志和光的快速,进化姿态吧!同调召唤,黑羽-孤高之银风鸦!"],
"9012916": ["黑色的疾风,让隐藏的感情呈现在你的翅膀上吧,同调召唤!飞舞吧,黑羽龙!"],
"95453143": ["当漆黑的帷幕落下之时,冥府之眼将会睁开,黑暗降临吧!黑暗同调召唤,出现吧,百目龙!"],
"72896720": ["死者与生者交汇于虚无时,魔龙将从永久的牢笼中释放,同调召唤,出现吧,永火死亡龙!"],
"73580471": ["冰冷的火焰将吞噬世间的一切,漆黑的花朵,绽放吧!同调召唤,出来吧,黑蔷薇龙!"],
"4290468": ["隐藏在神圣森林中的华丽的荆棘猎人啊,拿上惩戒的鞭子,在此刻现身吧!同调召唤,出现吧,华丽蔷薇!"],
"2403771": ["为了保护世界的和平,结合勇气与力量,同调召唤,爱和正义的使者,电动工具龙!"],
"25165047": ["为了保护世界的未来,勇气与力量唤起革命!同调召唤,进化吧,生命激流龙!"],
"25862681": ["神圣的守护之光现在彼此成为永恒的生命!同调召唤,诞生吧,古代妖精龙!"],
"70780151": ["翻腾吧,我复仇的黑炎!同步召唤,来吧,精神界恶魔!"],
"43385557": ["在心中深渊燃起我的憎恶之火,化作黑色怒涛蹂躏这世界吧!同调召唤,出现吧,魔力人造人!"],
"24943456": ["同调飞行控制,打开限制器,LV5!注入助推器,120%!恢复网络,修正范围,全部通过!Go!\n同调召唤,Come on!科技属 强力角斗士!"],
"98558751": ["打开限制器,LV5!启动助推器,Ok!倾斜角度,Ok!地面支持,全部通过!Go!\n同调召唤,Come on!科技属 奇妙魔术师!"],
"90953320": ["解除限制器,LV5!打开调节器,推冲器暖机,Ok!,上行线路,全部通过!Go!\n同调召唤!Come on!科技属 超图书管理员!"],
"62560742": ["解除限制器,LV2!打开调节器,导航系统,全部通过!Go!同调召唤!Come on!科技属 互换蜻蜓!"],
"51447164": ["解除限制器,LV10!主要低音助推器控制,全部通过!无限的力量,现在在此解放,冲向次元的彼岸吧,Go!\n同调召唤!Come on!科技属 刃枪手!"],
"97836203": ["解除限制器,LVMAX!打开调节器,全部通过!无限的力量,穿破时空,开启未知的世界吧,Go!\n三角加速同调!Come on!科技属 戟炮手!"],
"94515289": ["当黑暗与黑暗重叠之时,冥府之门将会打开,去那无光的世界吧!黑暗同调召唤,出现吧,冻结之菲茨杰拉德!"],
"31919988": ["当黑暗与黑暗重叠之时,冥府之门将会打开,去那无光的世界吧!黑暗同调召唤,出现吧,漆黑之朱姆沃尔特!"],
"63465535": ["当黑暗与黑暗重叠之时,冥府之门将会打开,去那无光的世界吧!黑暗同调召唤,出现吧,地底的蛛女!"],
"22858242": ["诞生于黑暗者,成为将万物引向负之世界的霸者吧!黑暗同调召唤,出现吧,猿魔王 塞曼!"],
"67904682": ["从黑暗深处传来的恸哭,穿上死神的铠甲现身吧!黑暗同调召唤,出现吧,暗黑航空母舰!"],
"39823987": ["太阳升起之时,照亮一切黑暗,投射的阳光啊,同调召唤,出现吧,太阳龙 因蒂!"],
"66818682": ["当月亮溢出黑暗之时,便将听闻暗魔的低语,诱向死亡!黑暗同调召唤,出现吧,月影龙 基利亚!"],
"45037489": ["在高速中降临的肉体,革命之时到来了,胜利就在我手中!同调召唤,闪耀吧,鲜花骑士!"],
"93353691": ["两刃相交之时,忠义之刃在此显现!服从我吧!同调召唤!出现吧!不退的荒武者!"],
"30757396": ["从心中的黑暗诞生之物,现在以灵魂作为代价降临吧!同调召唤!越动吧!血魔 墨非斯特!"],
"16527176": ["野性的血流交融时,劈开大地的力量将要觉醒,咆哮吧!同调召唤,大自然的力量,自然狮面草!"],
"77506119": ["飞天的雷电,交融于猛烈的烈风,从幻想的世界现身吧!同调召唤,嘶鸣吧,雷电独角兽!"],
"13995824": ["飞天的雷电,切开云海,让你的蹄子贯穿地面吧!同调召唤,轰鸣吧,流电双角兽!"],
"49389523": ["飞天的雷电,贯穿漆黑的大气,用你的雷击燃烧大地吧!同调召唤,照亮吧,闪电三角兽!"],
"30604579": ["星界之门开启之时,身披紫袍的雷神挥舞巨锤,与震撼大地的雷鸣一同降临吧!同调召唤,降临吧,极神皇 托尔!"],
"67098114": ["出生自星界的任性之神啊,向我们展示你那绝对的力量,嘲笑这个世界吧!同调召唤,降临吧,极神皇 洛基!"],
"93483212": ["君临与北辰之空,全知全能的王者啊,此刻统领星界众神,将那份威光展现在众人面前吧!\n同调召唤,统帅天地万物吧,最高神,极神圣帝 奥丁!"],
"8310162": ["诞生在次元尽头的黑暗,为超越时空的舞台拉开帷幕,罪同调!罪·矛盾龙!"],
"52687916": ["寄宿于苍白色冰结界之中的神圣处刑者,如今黑暗降临,用苍冰之焰将邪恶烧毁殆尽吧!\n同调召唤!三位一体!冰结界之龙 三叉龙!!"],
"50321796": ["隐藏于苍白色冰结界之中的冰之勇者,化身为雷光之枪,将邪恶之心贯穿吧!同调召唤!\n冰结界之龙 光枪龙!"],
"570583986": ["沉睡与苍白色冰结界之中的冰之霸者,最终时刻即将来临,现在在此觉醒吧!同调召唤!\n冰结界的虎王 雪虎!"],
"65749035": ["守护着苍白色冰结界的冰之守护者,把邪恶的咒文破除驱散,引导真正的正义吧!同调召唤!\n冰结界之龙 天枪龙!"],
"48009503": ["妖精の哲学,以「戒めの心」为信,XYZ召唤!哲♂学的三王之壹,英♂豪冠军 英♂弓♂王!"],
"60645181": ["妖精の哲学,以「賛美の心」为信,XYZ召唤!哲♂学的三王之贰,英♂豪冠军 断♂肛♂剑♂王!"],
"74593218": ["妖精の哲学,以「许容の心」为信,XYZ召唤!哲♂学的三王之叁,英♂豪冠军 草♂薙♂剑♂王!"],
"39272762": ["汹涌的银河啊!现化作怒涛之光 显现身姿吧!降临吧 吾之魂!超银河眼光子龙!"],
"6021033": ["坠入地狱的王者,把死亡的烈焰带到大地,斩杀邪恶之人!同调召唤!死神的咆哮!死亡帝王龙"]
}
{
"version": 3,
"file": "tunnel.js",
"sourceRoot": "",
"sources": [
"tunnel.coffee"
],
"names": [],
"mappings": "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"
}
\ No newline at end of file
util = require "util"
net = require "net"
spawn = require('child_process').spawn
freeport = require 'freeport'
Struct = require('struct').Struct
structs_declaration = require './structs.json' #结构体声明
typedefs = require './typedefs.json' #类型声明
proto_structs = require './proto_structs.json' #消息与结构体的对应,未完成,对着duelclient.cpp加
constants = require './constants.json' #network.h里定义的常量
settings = require './config.json' #本机IP端口设置
#结构体定义
structs = {}
for name, declaration of structs_declaration
result = Struct()
for field in declaration
if field.encoding
switch field.encoding
when "UTF-16LE" then result.chars field.name, field.length*2, field.encoding
else throw "unsupported encoding: #{file.encoding}"
else
type = field.type
type = typedefs[type] if typedefs[type]
if field.length
result.array field.name, field.length, type #不支持结构体
else
if structs[type]
result.struct field.name, structs[type]
else
result[type] field.name
structs[name] = result
stoc_follows = {}
ctos_follows = {}
stoc_follow = (proto, synchronous, callback)->
if typeof proto == 'string'
for key, value of constants.STOC
if value == proto
proto = key
break
throw "unknown proto" if !constants.STOC[proto]
stoc_follows[proto] = {callback: callback, synchronous: synchronous}
ctos_follow = (proto, synchronous, callback)->
if typeof proto == 'string'
for key, value of constants.CTOS
if value == proto
proto = key
break
throw "unknown proto" if !constants.CTOS[proto]
ctos_follows[proto] = {callback: callback, synchronous: synchronous}
stoc_send = (socket, proto, info)->
#console.log proto, proto_structs.STOC[proto], structs[proto_structs.STOC[proto]]
if typeof info == 'undefined'
buffer = ""
else if Buffer.isBuffer(info)
buffer = info
else
struct = structs[proto_structs.STOC[proto]]
struct.allocate()
struct.set info
buffer = struct.buffer()
if typeof proto == 'string' #需要重构
for key, value of constants.STOC
if value == proto
proto = key
break
throw "unknown proto" if !constants.STOC[proto]
header = new Buffer(3)
header.writeUInt16LE buffer.length + 1, 0
header.writeUInt8 proto, 2
socket.write header
socket.write buffer if buffer.length
console.log 'stoc_sent:', buffer
ctos_send = (socket, proto, info)->
#console.log proto, proto_structs.CTOS[proto], structs[proto_structs.CTOS[proto]]
if typeof info == 'undefined'
buffer = ""
else if Buffer.isBuffer(info)
buffer = info
else
struct = structs[proto_structs.CTOS[proto]]
struct.allocate()
struct.set info
buffer = struct.buffer()
if typeof proto == 'string' #需要重构
for key, value of constants.CTOS
if value == proto
proto = key
break
throw "unknown proto" if !constants.CTOS[proto]
header = new Buffer(3)
header.writeUInt16LE buffer.length + 1, 0
header.writeUInt8 proto, 2
socket.write header
socket.write buffer if buffer.length
console.log 'ctos_sent:', buffer
server_listener = (pass, port, client, server)->
client.connected = true
rooms[pass] = port
console.log "connected #{port}"
stoc_buffer = new Buffer(0)
stoc_message_length = 0
stoc_proto = 0
for buffer in client.pre_connecion_buffers
server.write buffer
server.on "data", (data) ->
console.log 'server: ', data
stoc_buffer = Buffer.concat([stoc_buffer, data], stoc_buffer.length + data.length)
#buffer的错误使用方式,好孩子不要学
while true
if stoc_message_length == 0
if stoc_buffer.length >= 2
stoc_message_length = stoc_buffer.readUInt16LE(0)
else
break
else if stoc_proto == 0
if stoc_buffer.length >= 3
stoc_proto = stoc_buffer.readUInt8(2)
else
break
else
if stoc_buffer.length >= 2 + stoc_message_length
console.log constants.STOC[stoc_proto]
if stoc_follows[stoc_proto]
b = stoc_buffer.slice(3, stoc_message_length - 1 + 3)
if struct = structs[proto_structs.STOC[constants.STOC[stoc_proto]]]
struct._setBuff(b)
setTimeout stoc_follows[stoc_proto].callback, 0, b, struct.fields, client, server
else
setTimeout stoc_follows[stoc_proto].callback, 0, b, null, client, server
stoc_buffer = stoc_buffer.slice(2 + stoc_message_length)
stoc_message_length = 0
stoc_proto = 0
else
break
unless stoc_follows[stoc_proto] and stoc_follows[stoc_proto].synchronous
client.write data
server.on "error", (e) ->
console.log "server error #{e}"
client.end()
server.on "close", (had_error) ->
console.log "server closed #{had_error}"
client.end()
#main
rooms = {}
rooms_players = {}
net.createServer (client) ->
client.connected = false
ctos_buffer = new Buffer(0)
ctos_message_length = 0
ctos_proto = 0
client.pre_connecion_buffers = new Array()
server = new net.Socket()
client.on "data", (data) ->
console.log 'client: ', data
ctos_buffer = Buffer.concat([ctos_buffer, data], ctos_buffer.length + data.length) #buffer的错误使用方式,好孩子不要学
while true
if ctos_message_length == 0
if ctos_buffer.length >= 2
ctos_message_length = ctos_buffer.readUInt16LE(0)
else
break
else if ctos_proto == 0
if ctos_buffer.length >= 3
ctos_proto = ctos_buffer.readUInt8(2)
else
break
else
if ctos_buffer.length >= 2 + ctos_message_length
console.log constants.CTOS[ctos_proto]
if ctos_follows[ctos_proto]
b = ctos_buffer.slice(3, ctos_message_length-1+3)
if struct = structs[proto_structs.CTOS[constants.CTOS[ctos_proto]]]
struct._setBuff(b)
setTimeout ctos_follows[ctos_proto].callback, 0, b, struct.fields, client, server
else
setTimeout ctos_follows[ctos_proto].callback, 0, b, null, client, server
ctos_buffer = ctos_buffer.slice(2 + ctos_message_length)
ctos_message_length = 0
ctos_proto = 0
else
break
unless ctos_follows[ctos_proto] and ctos_follows[ctos_proto].synchronous
if client.connected
server.write data
else
client.pre_connecion_buffers.push data
client.on "error", (e) ->
console.log "client error #{e}"
server.end()
client.on "close", (had_error) ->
console.log "client closed #{had_error}"
server.end()
.listen settings.port
ctos_follow 'PLAYER_INFO', true, (buffer, info, client, server)->
client.player = info.name
console.log 'PLAYER_INFO', info
ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
console.log 'JOIN_GAME', info
if info.version != settings.version
stoc_send client, 'ERROR_MSG',{
msg: 4
code: settings.version
}
client.end()
else if !info.pass.length
stoc_send client, 'JOIN_GAME', {}
stoc_send client, 'HS_PLAYER_ENTER', {
name: '提示: 房间为空,请修改房间名'
pos: 0
}
else if info.pass == '[INCORRECT]' #房间密码验证
stoc_send client, 'ERROR_MSG',{
msg: 1
code: 1 #这返错有问题,直接双ygopro直连怎么都正常,在服务器上就经常弹不出提示
}
client.end()
else
if client.player != '[INCORRECT]' #用户验证
if rooms[info.pass]
if typeof rooms[info.pass] == 'number' #already connected
server.connect rooms[info.pass], '127.0.0.1', ->
server_listener(info.pass, rooms[info.pass], client, server)
else
rooms[info.pass].push client
else
freeport (err, port)->
if(err)
stoc_send client, 'ERROR_MSG',{
msg: 1
code: 2
}
client.end()
else
room = spawn './ygopro', [port, 0, 0, 0, 'F', 'T', 'F', 8000, 5, 1], cwd: 'ygocore'
rooms[info.pass] = [client]
room.on 'exit', (code)->
delete rooms[info.pass]
room.stdout.once 'data', (data)->
rooms[info.pass].forEach (client)->
server.connect port, '127.0.0.1', ->
server_listener(info.pass, port, client, server)
else
stoc_send client, 'ERROR_MSG',{
msg: 1
code: 2
}
client.end()
stoc_follow 'JOIN_GAME', false, (buffer, info, client, server)->
console.log 'JOIN_GAME', info
stoc_follow 'HS_PLAYER_CHANGE', false, (buffer, info, client, server)->
console.log 'HS_PLAYER_CHANGE', info
stoc_follow 'HS_PLAYER_ENTER', false, (buffer, info, client, server)->
stoc_send client, 'CHAT', {
player: 8
msg: "这里是测试用的新直连服\n ˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉ\0"
}
stoc_send client, 'CHAT', {
player: 8
msg: "现在这个还不稳定,随时可能崩溃或者关闭服务哦\0"
}
stoc_send client, 'CHAT', {
player: 8
msg: "喵喵喵喵\0"
}
stoc_follow 'CHAT', false, (buffer, info, client, server)->
console.log info, buffer
###
# 开包大战
packs_weighted_cards = {}
for pack, cards of require './packs.json'
packs_weighted_cards[pack] = []
for card in cards
for i in [0..card.count]
packs_weighted_cards[pack].push card.card
console.log packs_weighted_cards
ctos_follow 'UPDATE_DECK', false, (buffer, info, client, server)->
ctos_send server, 'HS_NOTREADY'
deck = []
for pack in client.player
for i in [0...5]
deck.push packs_weighted_cards[pack][Math.floor(Math.random()*packs_weighted_cards[pack].length)]
ctos_send server, 'UPDATE_DECK', {
mainc: deck.length,
sidec: 0,
deckbuf: deck
}
ctos_send server, 'HS_READY'
###
\ No newline at end of file
net = require 'net'
http = require 'http'
url = require 'url'
spawn = require('child_process').spawn
freeport = require 'freeport'
Struct = require('struct').Struct
_ = require 'underscore'
structs_declaration = require './structs.json' #结构体声明
typedefs = require './typedefs.json' #类型声明
proto_structs = require './proto_structs.json' #消息与结构体的对应,未完成,对着duelclient.cpp加
constants = require './constants.json' #network.h里定义的常量
settings = require './config.json' #本机IP端口设置
if process.argv[2] == '--debug'
settings.port++
settings.http_port++
#结构体定义
structs = {}
for name, declaration of structs_declaration
result = Struct()
for field in declaration
if field.encoding
switch field.encoding
when "UTF-16LE" then result.chars field.name, field.length*2, field.encoding
else throw "unsupported encoding: #{file.encoding}"
else
type = field.type
type = typedefs[type] if typedefs[type]
if field.length
result.array field.name, field.length, type #不支持结构体
else
if structs[type]
result.struct field.name, structs[type]
else
result[type] field.name
structs[name] = result
stoc_follows = {}
ctos_follows = {}
stoc_follow = (proto, synchronous, callback)->
if typeof proto == 'string'
for key, value of constants.STOC
if value == proto
proto = key
break
throw "unknown proto" if !constants.STOC[proto]
stoc_follows[proto] = {callback: callback, synchronous: synchronous}
ctos_follow = (proto, synchronous, callback)->
if typeof proto == 'string'
for key, value of constants.CTOS
if value == proto
proto = key
break
throw "unknown proto" if !constants.CTOS[proto]
ctos_follows[proto] = {callback: callback, synchronous: synchronous}
stoc_send = (socket, proto, info)->
#console.log proto, proto_structs.STOC[proto], structs[proto_structs.STOC[proto]]
if typeof info == 'undefined'
buffer = ""
else if Buffer.isBuffer(info)
buffer = info
else
struct = structs[proto_structs.STOC[proto]]
struct.allocate()
struct.set info
buffer = struct.buffer()
if typeof proto == 'string' #需要重构
for key, value of constants.STOC
if value == proto
proto = key
break
throw "unknown proto" if !constants.STOC[proto]
header = new Buffer(3)
header.writeUInt16LE buffer.length + 1, 0
header.writeUInt8 proto, 2
socket.write header
socket.write buffer if buffer.length
console.log 'stoc_sent:', buffer
ctos_send = (socket, proto, info)->
#console.log proto, proto_structs.CTOS[proto], structs[proto_structs.CTOS[proto]]
if typeof info == 'undefined'
buffer = ""
else if Buffer.isBuffer(info)
buffer = info
else
struct = structs[proto_structs.CTOS[proto]]
struct.allocate()
struct.set info
buffer = struct.buffer()
if typeof proto == 'string' #需要重构
for key, value of constants.CTOS
if value == proto
proto = key
break
throw "unknown proto" if !constants.CTOS[proto]
header = new Buffer(3)
header.writeUInt16LE buffer.length + 1, 0
header.writeUInt8 proto, 2
socket.write header
socket.write buffer if buffer.length
console.log 'ctos_sent:', buffer
server_listener = (port, client, server)->
client.connected = true
console.log "connected #{port}"
stoc_buffer = new Buffer(0)
stoc_message_length = 0
stoc_proto = 0
for buffer in client.pre_connecion_buffers
server.write buffer
server.on "data", (data) ->
console.log 'server: ', data
stoc_buffer = Buffer.concat([stoc_buffer, data], stoc_buffer.length + data.length)
#buffer的错误使用方式,好孩子不要学
while true
if stoc_message_length == 0
if stoc_buffer.length >= 2
stoc_message_length = stoc_buffer.readUInt16LE(0)
else
break
else if stoc_proto == 0
if stoc_buffer.length >= 3
stoc_proto = stoc_buffer.readUInt8(2)
else
break
else
if stoc_buffer.length >= 2 + stoc_message_length
console.log constants.STOC[stoc_proto]
if stoc_follows[stoc_proto]
b = stoc_buffer.slice(3, stoc_message_length - 1 + 3)
if struct = structs[proto_structs.STOC[constants.STOC[stoc_proto]]]
struct._setBuff(b)
setTimeout stoc_follows[stoc_proto].callback, 0, b, struct.fields, client, server
else
setTimeout stoc_follows[stoc_proto].callback, 0, b, null, client, server
stoc_buffer = stoc_buffer.slice(2 + stoc_message_length)
stoc_message_length = 0
stoc_proto = 0
else
break
unless stoc_follows[stoc_proto] and stoc_follows[stoc_proto].synchronous
client.write data
server.on "error", (e) ->
console.log "server error #{e}"
client.end()
server.on "close", (had_error) ->
console.log "server closed #{had_error}"
client.end()
#main
rooms = {}
rooms_port_process = {}
#rooms_clients = {}
listener = net.createServer (client) ->
client.connected = false
ctos_buffer = new Buffer(0)
ctos_message_length = 0
ctos_proto = 0
client.pre_connecion_buffers = new Array()
server = new net.Socket()
server.on "error", (e) ->
console.log "server error #{e}"
client.on "data", (data) ->
console.log 'client: ', data
ctos_buffer = Buffer.concat([ctos_buffer, data], ctos_buffer.length + data.length) #buffer的错误使用方式,好孩子不要学
while true
if ctos_message_length == 0
if ctos_buffer.length >= 2
ctos_message_length = ctos_buffer.readUInt16LE(0)
else
break
else if ctos_proto == 0
if ctos_buffer.length >= 3
ctos_proto = ctos_buffer.readUInt8(2)
else
break
else
if ctos_buffer.length >= 2 + ctos_message_length
console.log constants.CTOS[ctos_proto]
if ctos_follows[ctos_proto]
b = ctos_buffer.slice(3, ctos_message_length-1+3)
if struct = structs[proto_structs.CTOS[constants.CTOS[ctos_proto]]]
struct._setBuff(b)
setTimeout ctos_follows[ctos_proto].callback, 0, b, struct.fields, client, server
else
setTimeout ctos_follows[ctos_proto].callback, 0, b, null, client, server
ctos_buffer = ctos_buffer.slice(2 + ctos_message_length)
ctos_message_length = 0
ctos_proto = 0
else
break
unless ctos_follows[ctos_proto] and ctos_follows[ctos_proto].synchronous
if client.connected
server.write data
else
client.pre_connecion_buffers.push data
client.on "error", (e) ->
console.log "client error #{e}"
server.end()
client.on "close", (had_error) ->
console.log "client closed #{had_error}"
server.end()
.listen settings.port, null, null, ->
console.log "server started on #{settings.ip}:#{settings.port}"
ctos_follow 'PLAYER_INFO', true, (buffer, info, client, server)->
client.player = info.name
ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
room_name = info.pass
if info.version != settings.version
stoc_send client, 'ERROR_MSG',{
msg: 4
code: settings.version
}
client.end()
else if !room_name.length
stoc_send client, 'JOIN_GAME', {}
stoc_send client, 'HS_PLAYER_ENTER', {
name: '提示: 房间为空,请修改房间名'
pos: 0
}
else if room_name == '[INCORRECT]' #房间密码验证
stoc_send client, 'ERROR_MSG',{
msg: 1
code: 1 #这返错有问题,直接双ygopro直连怎么都正常,在服务器上就经常弹不出提示
}
client.end()
else
if client.player != '[INCORRECT]' #用户验证
if rooms[room_name]
if typeof rooms[room_name] == 'number' #already connected
#rooms_clients[room_name].push client
server.connect rooms[room_name], '127.0.0.1', ->
server_listener(rooms[room_name], client, server)
else
#rooms_clients[room_name].push client
rooms[room_name].push client
else
freeport (err, port)->
if rooms[room_name] #如果等freeport的时间差又来了个.....
if typeof rooms[room_name] == 'number' #already connected
#rooms_clients[room_name].push client
server.connect rooms[room_name], '127.0.0.1', ->
server_listener(rooms[room_name], client, server)
else
rooms[room_name].push client
else
if(err)
stoc_send client, 'ERROR_MSG',{
msg: 1
code: 2
}
client.end()
else
rooms[room_name] = [client]
if room_name[0...2] == 'M#'
param = [0, 0, 1, 'F', 'F', 'F', 8000, 5, 1]
else if room_name[0...2] == 'T#'
param = [0, 0, 2, 'F', 'F', 'F', 8000, 5, 1]
else if (param = room_name.match /^(\d)?(\d)(\d)(T|F)(T|F)(T|F)(\d+),(\d+),(\d+)/i)
param.shift()
param[0] == parseInt(param[0])
else
param = [0, 0, 0, 'F', 'F', 'F', 8000, 5, 1]
param.unshift port
room = spawn './ygopro', param, cwd: 'ygocore'
room.alive = true
rooms_port_process[port] = room
room.on 'exit', (code)->
delete rooms[room_name]
delete rooms_port_process[port]
room.stdout.once 'data', (data)->
if(rooms[room_name])
rooms[room_name].forEach (c)->
server.connect port, '127.0.0.1', ->
server_listener(port, c, server)
rooms[room_name] = port
else
room.kill()
else
stoc_send client, 'ERROR_MSG',{
msg: 1
code: 2
}
client.end()
######################################################################################################################
#欢迎信息
stoc_follow 'JOIN_GAME', false, (buffer, info, client, server)->
stoc_send client, 'CHAT', {
player: 8
msg: "Mycard Debugging Server"
}
stoc_send client, 'CHAT', {
player: 8
msg: "这里是测试中的新服务器, 还不稳定, 随时可能崩溃, 遇到意外请淡定\n ˉˉˉˉˉ"
}
#登场台词
taici = require './taici.json'
stoc_follow 'GAME_MSG', false, (buffer, info, client, server)->
msg = buffer.readInt8(0)
if constants.MSG[msg] == 'SUMMONING' or constants.MSG[msg] == 'SPSUMMONING'
card = buffer.readUInt32LE(1)
if taici[card]
for line in taici[card][Math.floor(Math.random() * taici[card].length)].split("\n")
stoc_send client, 'CHAT', {
player: 8
msg: line
}
#stoc_follow 'HS_PLAYER_CHANGE', false, (buffer, info, client, server)->
# console.log 'HS_PLAYER_CHANGE', info
#stoc_follow 'CHAT', false, (buffer, info, client, server)->
# console.log info, buffer
#房间数量
http.createServer (request, response)->
if url.parse(request.url).pathname == '/count.json'
response.writeHead(200);
response.end(Object.keys(rooms).length.toString())
else
response.writeHead(404);
response.end();
.listen settings.http_port
#清理90s没活动的房间
path = require 'path'
fs = require 'fs'
Inotify = require('inotify').Inotify
inotify = new Inotify()
inotify.addWatch
path: 'ygocore/replay',
watch_for: Inotify.IN_CLOSE_WRITE | Inotify.IN_CREATE | Inotify.IN_MODIFY,
callback: (event)->
mask = event.mask
if event.name
port = parseInt path.basename(event.name, '.yrp')
room = rooms_port_process[port]
if room
if mask & Inotify.IN_CREATE
else if mask & Inotify.IN_CLOSE_WRITE
fs.unlink path.join('ygocore/replay'), (err)->
else if mask & Inotify.IN_MODIFY
room.alive = true
else
console.log '[warn] event without filename'
setInterval ()->
for port, room of rooms_port_process
if room.alive
room.alive = false
else
console.log "killed #{port} #{room}"
room.kill()
, 900000
#tip
###
request = require 'request'
request
url: 'https://forum.my-card.in/admin/site_contents/faq'
json: true
, (error, response, body)->
console.log body
stoc_follow 'DUEL_START', false, (buffer, info, client, server)->
stoc_send client, 'CHAT', {
player: 8
msg: "FAQ: 喵喵喵"
}
###
###
# 开包大战
packs_weighted_cards = {}
for pack, cards of require './packs.json'
packs_weighted_cards[pack] = []
for card in cards
for i in [0..card.count]
packs_weighted_cards[pack].push card.card
console.log packs_weighted_cards
ctos_follow 'UPDATE_DECK', false, (buffer, info, client, server)->
ctos_send server, 'HS_NOTREADY'
deck = []
for pack in client.player
for i in [0...5]
deck.push packs_weighted_cards[pack][Math.floor(Math.random()*packs_weighted_cards[pack].length)]
ctos_send server, 'UPDATE_DECK', {
mainc: deck.length,
sidec: 0,
deckbuf: deck
}
ctos_send server, 'HS_READY'
###
// Generated by CoffeeScript 1.6.3
(function() {
var Struct, constants, ctos_follow, ctos_follows, ctos_send, declaration, field, freeport, name, net, proto_structs, result, rooms, rooms_players, server_listener, settings, spawn, stoc_follow, stoc_follows, stoc_send, structs, structs_declaration, type, typedefs, util, _i, _len;
var Inotify, Struct, constants, ctos_follow, ctos_follows, ctos_send, declaration, field, freeport, fs, http, inotify, listener, name, net, path, proto_structs, result, rooms, rooms_port_process, server_listener, settings, spawn, stoc_follow, stoc_follows, stoc_send, structs, structs_declaration, taici, type, typedefs, url, _, _i, _len;
util = require("util");
net = require('net');
net = require("net");
http = require('http');
url = require('url');
spawn = require('child_process').spawn;
......@@ -12,6 +14,8 @@
Struct = require('struct').Struct;
_ = require('underscore');
structs_declaration = require('./structs.json');
typedefs = require('./typedefs.json');
......@@ -22,6 +26,11 @@
settings = require('./config.json');
if (process.argv[2] === '--debug') {
settings.port++;
settings.http_port++;
}
structs = {};
for (name in structs_declaration) {
......@@ -172,10 +181,9 @@
return console.log('ctos_sent:', buffer);
};
server_listener = function(pass, port, client, server) {
server_listener = function(port, client, server) {
var buffer, stoc_buffer, stoc_message_length, stoc_proto, _j, _len1, _ref;
client.connected = true;
rooms[pass] = port;
console.log("connected " + port);
stoc_buffer = new Buffer(0);
stoc_message_length = 0;
......@@ -238,9 +246,9 @@
rooms = {};
rooms_players = {};
rooms_port_process = {};
net.createServer(function(client) {
listener = net.createServer(function(client) {
var ctos_buffer, ctos_message_length, ctos_proto, server;
client.connected = false;
ctos_buffer = new Buffer(0);
......@@ -248,6 +256,9 @@
ctos_proto = 0;
client.pre_connecion_buffers = new Array();
server = new net.Socket();
server.on("error", function(e) {
return console.log("server error " + e);
});
client.on("data", function(data) {
var b, struct;
console.log('client: ', data);
......@@ -301,28 +312,30 @@
console.log("client closed " + had_error);
return server.end();
});
}).listen(settings.port);
}).listen(settings.port, null, null, function() {
return console.log("server started on " + settings.ip + ":" + settings.port);
});
ctos_follow('PLAYER_INFO', true, function(buffer, info, client, server) {
client.player = info.name;
return console.log('PLAYER_INFO', info);
return client.player = info.name;
});
ctos_follow('JOIN_GAME', false, function(buffer, info, client, server) {
console.log('JOIN_GAME', info);
var room_name;
room_name = info.pass;
if (info.version !== settings.version) {
stoc_send(client, 'ERROR_MSG', {
msg: 4,
code: settings.version
});
return client.end();
} else if (!info.pass.length) {
} else if (!room_name.length) {
stoc_send(client, 'JOIN_GAME', {});
return stoc_send(client, 'HS_PLAYER_ENTER', {
name: '提示: 房间为空,请修改房间名',
pos: 0
});
} else if (info.pass === '[INCORRECT]') {
} else if (room_name === '[INCORRECT]') {
stoc_send(client, 'ERROR_MSG', {
msg: 1,
code: 1
......@@ -330,38 +343,67 @@
return client.end();
} else {
if (client.player !== '[INCORRECT]') {
if (rooms[info.pass]) {
if (typeof rooms[info.pass] === 'number') {
return server.connect(rooms[info.pass], '127.0.0.1', function() {
return server_listener(info.pass, rooms[info.pass], client, server);
if (rooms[room_name]) {
if (typeof rooms[room_name] === 'number') {
return server.connect(rooms[room_name], '127.0.0.1', function() {
return server_listener(rooms[room_name], client, server);
});
} else {
return rooms[info.pass].push(client);
return rooms[room_name].push(client);
}
} else {
return freeport(function(err, port) {
var room;
if (err) {
stoc_send(client, 'ERROR_MSG', {
msg: 1,
code: 2
});
return client.end();
var param, room;
if (rooms[room_name]) {
if (typeof rooms[room_name] === 'number') {
return server.connect(rooms[room_name], '127.0.0.1', function() {
return server_listener(rooms[room_name], client, server);
});
} else {
return rooms[room_name].push(client);
}
} else {
room = spawn('./ygopro', [port, 0, 0, 0, 'F', 'T', 'F', 8000, 5, 1], {
cwd: 'ygocore'
});
rooms[info.pass] = [client];
room.on('exit', function(code) {
return delete rooms[info.pass];
});
return room.stdout.once('data', function(data) {
return rooms[info.pass].forEach(function(client) {
return server.connect(port, '127.0.0.1', function() {
return server_listener(info.pass, port, client, server);
});
if (err) {
stoc_send(client, 'ERROR_MSG', {
msg: 1,
code: 2
});
return client.end();
} else {
rooms[room_name] = [client];
if (room_name.slice(0, 2) === 'M#') {
param = [0, 0, 1, 'F', 'F', 'F', 8000, 5, 1];
} else if (room_name.slice(0, 2) === 'T#') {
param = [0, 0, 2, 'F', 'F', 'F', 8000, 5, 1];
} else if ((param = room_name.match(/^(\d)?(\d)(\d)(T|F)(T|F)(T|F)(\d+),(\d+),(\d+)/i))) {
param.shift();
param[0] === parseInt(param[0]);
} else {
param = [0, 0, 0, 'F', 'F', 'F', 8000, 5, 1];
}
param.unshift(port);
room = spawn('./ygopro', param, {
cwd: 'ygocore'
});
room.alive = true;
rooms_port_process[port] = room;
room.on('exit', function(code) {
delete rooms[room_name];
return delete rooms_port_process[port];
});
});
return room.stdout.once('data', function(data) {
if (rooms[room_name]) {
rooms[room_name].forEach(function(c) {
return server.connect(port, '127.0.0.1', function() {
return server_listener(port, c, server);
});
});
return rooms[room_name] = port;
} else {
return room.kill();
}
});
}
}
});
}
......@@ -376,32 +418,111 @@
});
stoc_follow('JOIN_GAME', false, function(buffer, info, client, server) {
return console.log('JOIN_GAME', info);
});
stoc_follow('HS_PLAYER_CHANGE', false, function(buffer, info, client, server) {
return console.log('HS_PLAYER_CHANGE', info);
});
stoc_follow('HS_PLAYER_ENTER', false, function(buffer, info, client, server) {
stoc_send(client, 'CHAT', {
player: 8,
msg: "这里是测试用的新直连服\n ˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉ\0"
});
stoc_send(client, 'CHAT', {
player: 8,
msg: "现在这个还不稳定,随时可能崩溃或者关闭服务哦\0"
msg: "Mycard Debugging Server"
});
return stoc_send(client, 'CHAT', {
player: 8,
msg: "喵喵喵喵\0"
msg: "这里是测试中的新服务器, 还不稳定, 随时可能崩溃, 遇到意外请淡定\n ˉˉˉˉˉ"
});
});
stoc_follow('CHAT', false, function(buffer, info, client, server) {
return console.log(info, buffer);
taici = require('./taici.json');
stoc_follow('GAME_MSG', false, function(buffer, info, client, server) {
var card, line, msg, _j, _len1, _ref, _results;
msg = buffer.readInt8(0);
if (constants.MSG[msg] === 'SUMMONING' || constants.MSG[msg] === 'SPSUMMONING') {
card = buffer.readUInt32LE(1);
if (taici[card]) {
_ref = taici[card][Math.floor(Math.random() * taici[card].length)].split("\n");
_results = [];
for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) {
line = _ref[_j];
_results.push(stoc_send(client, 'CHAT', {
player: 8,
msg: line
}));
}
return _results;
}
}
});
http.createServer(function(request, response) {
if (url.parse(request.url).pathname === '/count.json') {
response.writeHead(200);
return response.end(Object.keys(rooms).length.toString());
} else {
response.writeHead(404);
return response.end();
}
}).listen(settings.http_port);
path = require('path');
fs = require('fs');
Inotify = require('inotify').Inotify;
inotify = new Inotify();
inotify.addWatch({
path: 'ygocore/replay',
watch_for: Inotify.IN_CLOSE_WRITE | Inotify.IN_CREATE | Inotify.IN_MODIFY,
callback: function(event) {
var mask, port, room;
mask = event.mask;
if (event.name) {
port = parseInt(path.basename(event.name, '.yrp'));
room = rooms_port_process[port];
if (room) {
if (mask & Inotify.IN_CREATE) {
} else if (mask & Inotify.IN_CLOSE_WRITE) {
return fs.unlink(path.join('ygocore/replay'), function(err) {});
} else if (mask & Inotify.IN_MODIFY) {
return room.alive = true;
}
}
} else {
return console.log('[warn] event without filename');
}
}
});
setInterval(function() {
var port, room, _results;
_results = [];
for (port in rooms_port_process) {
room = rooms_port_process[port];
if (room.alive) {
_results.push(room.alive = false);
} else {
console.log("killed " + port + " " + room);
_results.push(room.kill());
}
}
return _results;
}, 900000);
/*
request = require 'request'
request
url: 'https://forum.my-card.in/admin/site_contents/faq'
json: true
, (error, response, body)->
console.log body
stoc_follow 'DUEL_START', false, (buffer, info, client, server)->
stoc_send client, 'CHAT', {
player: 8
msg: "FAQ: 喵喵喵"
}
*/
/*
# 开包大战
......@@ -435,5 +556,5 @@
}).call(this);
/*
//@ sourceMappingURL=tunnel.map
//@ sourceMappingURL=ygopro-server.map
*/
{
"version": 3,
"file": "ygopro-server.js",
"sourceRoot": "",
"sources": [
"ygopro-server.coffee"
],
"names": [],
"mappings": ";AAAA;CAAA,KAAA,uUAAA;;CAAA,CAAA,CAAA,EAAM,EAAA;;CAAN,CACA,CAAO,CAAP,EAAO,CAAA;;CADP,CAEA,CAAA,EAAM,EAAA;;CAFN,CAGA,CAAQ,EAAR,EAAQ,QAAA;;CAHR,CAMA,CAAW,IAAA,CAAX,EAAW;;CANX,CAOA,CAAS,GAAT,CAAS,CAAA;;CAPT,CAQA,CAAI,IAAA,KAAA;;CARJ,CAaA,CAAsB,IAAA,SAAA,GAAtB;;CAbA,CAcA,CAAW,IAAA,CAAX,SAAW;;CAdX,CAeA,CAAgB,IAAA,MAAhB,SAAgB;;CAfhB,CAgBA,CAAY,IAAA,EAAZ,SAAY;;CAhBZ,CAkBA,CAAW,IAAA,CAAX,OAAW;;CAEX,CAAA,EAAG,CAAmB,EAAZ,EAAV;AACE,CAAA,CAAA,EAAA,IAAQ;AACR,CADA,CAAA,EACA,IAAQ,CAAR;IAtBF;;CAAA,CAyBA,CAAU,IAAV;;AACA,CAAA,MAAA,oBAAA;6CAAA;CACE,EAAS,CAAT,EAAA;AACA,CAAA,QAAA,yCAAA;+BAAA;CACE,GAAG,CAAK,CAAR,EAAA;CACE,IAAY,GAAZ,QAAO;CAAP,SAAA,KACO;CAAgB,CAAyB,CAAa,CAAtC,CAAA,CAAM,EAAN,IAAA;CAAhB;CADP;CAEO,EAA8B,CAAI,IAAlC,UAAO,MAAA;CAFd,QADF;MAAA,EAAA;CAKE,EAAO,CAAP,CAAY,GAAZ;CACA,GAAyB,IAAzB;CAAA,EAAO,CAAP,IAAgB,EAAhB;UADA;CAEA,GAAG,CAAK,CAAR,EAAA;CACE,CAAyB,EAAzB,CAAA,CAAM,IAAN;MADF,IAAA;CAGE,GAAG,GAAQ,GAAX;CACE,CAA0B,EAA1B,CAAmB,CAAb,CAA4B,KAAlC;MADF,MAAA;CAGE,GAAO,CAAW,CAAX,MAAP;YANJ;UAPF;QADF;CAAA,IADA;CAAA,EAgBgB,CAAhB,EAhBA,CAgBQ;CAjBV,EA1BA;;CAAA,CA6CA,CAAe,SAAf;;CA7CA,CA8CA,CAAe,SAAf;;CA9CA,CA+CA,CAAc,EAAA,GAAA,CAAC,EAAf;CACE,OAAA,QAAA;AAAG,CAAH,GAAA,CAAG,CAAA,EAAH;CACE;CAAA,UAAA;2BAAA;CACE,GAAG,CAAA,GAAH;CACE,EAAQ,EAAR,KAAA;CACA,eAFF;UADF;CAAA,MAAA;AAI0B,CAA1B,GAAyB,CAAgB,CAAzC,GAAmC;CAAnC,aAAM,CAAN;QALF;MAAA;CAMa,EAAS,EAAT,MAAb,CAAa;CAAS,CAAW,IAAV,EAAA;CAAD,CAAkC,IAAb,KAAA;CAP/B;CA/Cd,EA+Cc;;CA/Cd,CAuDA,CAAc,EAAA,GAAA,CAAC,EAAf;CACE,OAAA,QAAA;AAAG,CAAH,GAAA,CAAG,CAAA,EAAH;CACE;CAAA,UAAA;2BAAA;CACE,GAAG,CAAA,GAAH;CACE,EAAQ,EAAR,KAAA;CACA,eAFF;UADF;CAAA,MAAA;AAI0B,CAA1B,GAAyB,CAAgB,CAAzC,GAAmC;CAAnC,aAAM,CAAN;QALF;MAAA;CAMa,EAAS,EAAT,MAAb,CAAa;CAAS,CAAW,IAAV,EAAA;CAAD,CAAkC,IAAb,KAAA;CAP/B;CAvDd,EAuDc;;CAvDd,CAgEA,CAAY,CAAA,CAAA,CAAA,GAAZ;CAGE,OAAA,gCAAA;AAAG,CAAH,GAAA,CAAkB,CAAf,KAAH;CACE,CAAA,CAAS,GAAT;CACa,GAAP,EAFR,EAEQ;CACN,EAAS,CAAT,EAAA;MAHF;CAKE,EAAS,CAA2B,CAAA,CAApC,CAAiB,MAAa;CAA9B,KACA,EAAA;CADA,EAEA,CAAA,EAAA;CAFA,EAGS,GAAT;MARF;AAUG,CAAH,GAAA,CAAG,CAAA,EAAH;CACE;CAAA,UAAA;2BAAA;CACE,GAAG,CAAA,GAAH;CACE,EAAQ,EAAR,KAAA;CACA,eAFF;UADF;CAAA,MAAA;AAI0B,CAA1B,GAAyB,CAAgB,CAAzC,GAAmC;CAAnC,aAAM,CAAN;QALF;MAVA;CAAA,EAiBa,CAAb,EAAA;CAjBA,CAkBwC,CAAH,CAArC,EAAM,OAAN;CAlBA,CAmByB,EAAzB,CAAA,CAAM,IAAN;CAnBA,GAoBA,CAAA,CAAM;CACN,GAAA,EAA6B;CAA7B,IAAA,CAAA;MArBA;CAsBQ,CAAkB,CAA1B,GAAA,CAAO,IAAP,CAAA;CAzFF,EAgEY;;CAhEZ,CA2FA,CAAY,CAAA,CAAA,CAAA,GAAZ;CAGE,OAAA,gCAAA;AAAG,CAAH,GAAA,CAAkB,CAAf,KAAH;CACE,CAAA,CAAS,GAAT;CACa,GAAP,EAFR,EAEQ;CACN,EAAS,CAAT,EAAA;MAHF;CAKE,EAAS,CAA2B,CAAA,CAApC,CAAiB,MAAa;CAA9B,KACA,EAAA;CADA,EAEA,CAAA,EAAA;CAFA,EAGS,GAAT;MARF;AAUG,CAAH,GAAA,CAAG,CAAA,EAAH;CACE;CAAA,UAAA;2BAAA;CACE,GAAG,CAAA,GAAH;CACE,EAAQ,EAAR,KAAA;CACA,eAFF;UADF;CAAA,MAAA;AAI0B,CAA1B,GAAyB,CAAgB,CAAzC,GAAmC;CAAnC,aAAM,CAAN;QALF;MAVA;CAAA,EAiBa,CAAb,EAAA;CAjBA,CAkBwC,CAAH,CAArC,EAAM,OAAN;CAlBA,CAmByB,EAAzB,CAAA,CAAM,IAAN;CAnBA,GAoBA,CAAA,CAAM;CACN,GAAA,EAA6B;CAA7B,IAAA,CAAA;MArBA;CAsBQ,CAAkB,CAA1B,GAAA,CAAO,IAAP,CAAA;CApHF,EA2FY;;CA3FZ,CAsHA,CAAkB,CAAA,EAAA,GAAC,MAAnB;CACE,OAAA,6DAAA;CAAA,EAAmB,CAAnB,EAAM,GAAN;CAAA,EACA,CAAA,GAAO,KAAM;CADb,EAGkB,CAAlB,EAAkB,KAAlB;CAHA,EAIsB,CAAtB,eAAA;CAJA,EAKa,CAAb,MAAA;CAEA;CAAA,QAAA,oCAAA;yBAAA;CACE,IAAA,CAAA;CADF,IAPA;CAAA,CAUA,CAAkB,CAAlB,EAAM,GAAa;CACjB,QAAA,CAAA;CAAA,CAAwB,CAAxB,CAAA,EAAA,CAAO,GAAP;CAAA,CAC0C,CAA5B,CAAc,EAA5B,KAAA;CAGA,EAAA,CAAA,SAAM;CACJ,GAAG,CAAuB,GAA1B,WAAG;CACD,GAAG,EAAA,IAAH,CAAc;CACZ,EAAsB,QAAW,CAAjC,OAAA;MADF,MAAA;CAGE,iBAHF;YADF;CAAA,GAKQ,CAAc,CALtB,IAAA;CAME,GAAG,EAAA,IAAH,CAAc;CACZ,EAAa,MAAA,CAAb,CAAwB,CAAxB;MADF,MAAA;CAGE,iBAHF;YANF;MAAA,IAAA;CAWE,EAA6B,CAA1B,EAAA,IAAH,CAAc,QAAd;CACE,EAAA,CAA2B,GAApB,EAAc,CAAM,EAA3B;CACA,GAAG,MAAa,EAAhB;CACE,CAAyB,CAArB,EAAA,MAAW,GAAf,KAAyB;CACzB,EAAY,CAAT,EAAA,CAAiB,EAA4B,CAAM,GAArB,CAAjC;CACE,KAAM,EAAN,QAAA;CAAA,CAC8C,IAAY,EAA1D,EAAA,EAAwB,IAAxB;MAFF,UAAA;CAIE,CAA8C,EAA9C,EAAA,EAAA,EAAA,EAAwB,IAAxB;gBANJ;cADA;CAAA,EASc,EAAA,MAAd,CAAA,OAAc;CATd,EAUsB,SAAtB,OAAA;CAVA,EAWa,OAAb,EAAA;MAZF,MAAA;CAcE,iBAdF;YAXF;UADF;CAJA,MAIA;AA4BA,CAAA,GAAA,EAAA,IAAoB,CAApB,CAAoB;CACX,GAAP,CAAA,CAAM,SAAN;QAlCc;CAAlB,IAAkB;CAVlB,CA8CA,CAAmB,CAAnB,EAAM,CAAN,EAAoB;CAClB,EAAA,GAAA,CAAO,QAAM;CACN,EAAP,GAAM,OAAN;CAFF,IAAmB;CAIZ,CAAP,CAAmB,GAAb,CAAN,EAAoB,EAApB;CACE,EAAA,GAAA,CAAO,EAAP,OAAa;CACN,EAAP,GAAM,OAAN;CAFF,IAAmB;CAzKrB,EAsHkB;;CAtHlB,CA+KA,CAAQ,EAAR;;CA/KA,CAgLA,CAAqB,eAArB;;CAhLA,CAmLA,CAAW,GAAiB,EAA5B,CAA6B,GAAlB;CACT,OAAA,4CAAA;CAAA,EAAmB,CAAnB,CAAA,CAAM,GAAN;CAAA,EAEkB,CAAlB,EAAkB,KAAlB;CAFA,EAGsB,CAAtB,eAAA;CAHA,EAIa,CAAb,MAAA;CAJA,EAMmC,CAAnC,CAAmC,CAA7B,eAAN;CANA,EAQa,CAAb,EAAA;CARA,CASA,CAAmB,CAAnB,EAAM,CAAN,EAAoB;CACV,EAAR,IAAO,MAAP,EAAa;CADf,IAAmB;CATnB,CAYA,CAAkB,CAAlB,EAAM,GAAa;CACjB,QAAA,CAAA;CAAA,CAAwB,CAAxB,CAAA,EAAA,CAAO,GAAP;CAAA,CAC0C,CAA5B,CAAc,EAA5B,KAAA;CAEA,EAAA,CAAA,SAAM;CACJ,GAAG,CAAuB,GAA1B,WAAG;CACD,GAAG,EAAA,IAAH,CAAc;CACZ,EAAsB,QAAW,CAAjC,OAAA;MADF,MAAA;CAGE,iBAHF;YADF;CAAA,GAKQ,CAAc,CALtB,IAAA;CAME,GAAG,EAAA,IAAH,CAAc;CACZ,EAAa,MAAA,CAAb,CAAwB,CAAxB;MADF,MAAA;CAGE,iBAHF;YANF;MAAA,IAAA;CAWE,EAA6B,CAA1B,EAAA,IAAH,CAAc,QAAd;CACE,EAAA,CAA2B,GAApB,EAAc,CAAM,EAA3B;CACA,GAAG,MAAa,EAAhB;CACE,CAAyB,CAArB,EAAA,MAAW,GAAf,KAAyB;CACzB,EAAY,CAAT,EAAA,CAAiB,EAA4B,CAAM,GAArB,CAAjC;CACE,KAAM,EAAN,QAAA;CAAA,CAC8C,IAAY,EAA1D,EAAA,EAAwB,IAAxB;MAFF,UAAA;CAIE,CAA8C,EAA9C,EAAA,EAAA,EAAA,EAAwB,IAAxB;gBANJ;cADA;CAAA,EASc,EAAA,MAAd,CAAA,OAAc;CATd,EAUsB,SAAtB,OAAA;CAVA,EAWa,OAAb,EAAA;MAZF,MAAA;CAcE,iBAdF;YAXF;UADF;CAHA,MAGA;AA4BA,CAAA,GAAA,EAAA,IAAoB,CAApB,CAAoB;CAClB,GAAG,EAAM,EAAT,CAAA;CACS,GAAP,CAAA,CAAM,WAAN;MADF,IAAA;CAGS,GAAP,EAAM,WAAN,IAA4B;UAJhC;QAhCgB;CAAlB,IAAkB;CAZlB,CAkDA,CAAmB,CAAnB,EAAM,CAAN,EAAoB;CAClB,EAAA,GAAA,CAAO,QAAM;CACN,EAAP,GAAM,OAAN;CAFF,IAAmB;CAIZ,CAAP,CAAmB,GAAb,CAAN,EAAoB,EAApB;CACE,EAAA,GAAA,CAAO,EAAP,OAAa;CACN,EAAP,GAAM,OAAN;CAFF,IAAmB;CAvDV,CA0DY,CA1DK,CAAjB,EAAA,EA0DK,CAAmB;CACzB,CAAK,CAAb,CAAA,GAAO,CAAiC,GAAxC,SAAa;CA3DJ,EA0DwB;;CA7OnC,CAgPA,CAAiC,CAAjC,EAAiC,GAAC,EAAlC,EAAA;CACS,EAAS,CAAI,EAAd,KAAN;CADF,EAAiC;;CAhPjC,CAmPA,CAAgC,CAAA,CAAhC,CAAgC,GAAC,EAAjC;CACE,OAAA,CAAA;CAAA,EAAY,CAAZ,KAAA;CACA,GAAA,CAAmB,EAAhB,CAAwB;CACzB,CAAkB,IAAlB,GAAA,EAAA;CAA8B,CACvB,CAAL,KAAA;CAD4B,CAEtB,EAAN,GAF4B,CAE5B;CAFF,OAAA;CAIO,EAAP,GAAM,OAAN;AACO,CAAD,GAAA,EANR,GAMkB;CAChB,CAAkB,IAAlB,GAAA,EAAA;CACU,CAAQ,IAAlB,GAAA,IAAA,IAAA;CAAqC,CAC7B,EAAN,IAAA,SADmC;CAAA,CAE9B,CAAL,KAAA;CAVJ,OAQE;IAIM,CAAa,CAZrB,GAYQ,IAZR;CAaE,CAAkB,IAAlB,GAAA,EAAA;CAA8B,CACvB,CAAL,KAAA;CAD4B,CAEtB,EAAN,IAAA;CAFF,OAAA;CAIO,EAAP,GAAM,OAAN;MAjBF;CAmBE,GAAG,CAAiB,CAApB,OAAA;CACE,GAAG,CAAM,GAAT,CAAS;AACJ,CAAH,GAAG,CAAa,CAAb,EAAH,CAAgB,CAAhB;CAES,CAA0B,CAAa,EAAzB,CAAf,CAAN,EAAqB,EAArB,QAAA;CACkB,CAAkB,GAAZ,CAAtB,GAAsB,MAAtB,MAAA;CADF,YAA8C;MAFhD,MAAA;CAMQ,GAAN,CAAM,CAAN,GAAM,UAAN;YAPJ;MAAA,IAAA;CASW,CAAM,CAAN,CAAA,IAAT,CAAU,QAAV;CACE,UAAA,KAAA;CAAA,GAAG,CAAM,IAAA,GAAT;AACK,CAAH,GAAG,CAAa,CAAb,EAAH,CAAgB,KAAhB;CAES,CAA0B,CAAa,EAAzB,CAAf,CAAN,EAAqB,EAArB,YAAA;CACkB,CAAkB,GAAZ,CAAtB,GAAsB,MAAtB,UAAA;CADF,gBAA8C;MAFhD,UAAA;CAKQ,GAAN,CAAM,CAAN,GAAM,cAAN;gBANJ;MAAA,QAAA;CAQE,EAAA,CAAG,UAAH;CACE,CAAkB,IAAlB,GAAA,EAAA,KAAA;CAA8B,CACvB,CAAL,eAAA;CAD4B,CAEtB,EAAN,cAAA;CAFF,iBAAA;CAIO,EAAP,GAAM,iBAAN;MALF,UAAA;CAOE,EAAmB,EAAb,CAAa,GAAb,OAAN;CACA,GAAG,CAAoB,IAAV,GAAV,IAAH;CACE,CAAY,CAAJ,CAAA,CAAR,aAAA;IACM,CAAoB,CAF5B,GAEkB,GAAV,MAFR;CAGE,CAAY,CAAJ,CAAA,CAAR,aAAA;CACO,EAAQ,CAAT,CAAC,CAJT,GAI0B,SAJ1B,+BAIiB;CACf,IAAK,aAAL;CAAA,IACM,GAAM,UAAZ;MANF,YAAA;CAQE,CAAY,CAAJ,CAAA,CAAR,aAAA;kBATF;CAAA,GAWA,CAAK,EAAL,SAAA;CAXA,CAYyB,CAAlB,CAAP,CAAO,KAAA,MAAP;CAAgC,CAAK,CAAL,MAAA,SAAA;CAZhC,iBAYO;CAZP,EAaa,CAAT,CAAJ,WAAA;CAbA,EAc2B,CAAR,YAAnB,EAAmB;CAdnB,CAeA,CAAgB,CAAZ,EAAJ,GAAiB,OAAjB;AACE,CAAA,IAAa,CAAb,GAAa,SAAb;AACA,CAAA,GAA0B,EAA1B,YAA0B,OAA1B;CAFF,gBAAgB;CAGX,CAAoB,CAAA,CAArB,EAAO,GAAe,cAA1B;CACE,GAAG,CAAM,IAAA,SAAT;CACE,EAAyB,EAAnB,EAAN,EAAM,WAAN;CACS,CAAc,CAAa,CAAlC,EAAM,CAAN,EAAkC,EAAlC,kBAAA;CACkB,CAAM,EAAtB,EAAA,SAAA,gBAAA;CADF,sBAAkC;CADpC,oBAAyB;CAGnB,EAAa,EAAb,IAAA,kBAAN;MAJF,cAAA;CAMO,GAAD,uBAAJ;oBAPqB;CAAzB,gBAAyB;gBAjC7B;cADO;CAAT,UAAS;UAVb;MAAA,EAAA;CAqDE,CAAkB,IAAlB,EAAA,CAAA,EAAA;CAA8B,CACvB,CAAL,OAAA;CAD4B,CAEtB,EAAN,MAAA;CAFF,SAAA;CAIO,EAAP,GAAM,SAAN;QA5EJ;MAF8B;CAAhC,EAAgC;;CAnPhC,CAsUA,CAAgC,CAAA,CAAhC,CAAgC,GAAC,EAAjC;CACE,CAAkB,EAAlB,EAAA,GAAA;CAA0B,CAChB,IAAR;CADwB,CAEnB,CAAL,GAAA,mBAFwB;CAA1B,KAAA;CAIU,CAAQ,IAAlB,GAAA,EAAA;CAA0B,CAChB,IAAR;CADwB,CAEnB,CAAL,GAAA,gEAFwB;CALI,KAK9B;CALF,EAAgC;;CAtUhC,CAiVA,CAAQ,EAAR,EAAQ,OAAA;;CAjVR,CAkVA,CAA+B,CAAA,CAA/B,CAA+B,GAAC,CAAhC,CAAA;CACE,OAAA,kCAAA;CAAA,EAAA,CAAA,EAAY,EAAN;CACN,EAAiB,CAAjB,CAAyB,IAAb,EAAT,EAAH;CACE,EAAO,CAAP,EAAA,MAAO;CACP,GAAG,CAAM,CAAT;CACE;CAAA;cAAA,+BAAA;2BAAA;CACE,CAAkB,IAAlB,GAAA;CAA0B,CAChB,IAAR,MAAA;CADwB,CAElB,CAAN,CAFwB,QAExB;CAFF,WAAA;CADF;yBADF;QAFF;MAF6B;CAA/B,EAA+B;;CAlV/B,CAoWA,CAAkB,CAAd,GAAc,CAAA,CAAC,GAAnB;CACE,EAAM,CAAN,CAAG,EAAiB,CAAjB,KAAH;CACE,EAAA,GAAA,EAAQ,CAAR;CACS,EAAT,CAAa,CAAA,CAAM,EAAX,KAAR;MAFF;CAIE,EAAA,GAAA,EAAQ,CAAR;CACS,EAAT,KAAQ,KAAR;MANc;CAAlB,EAAkB,GAAlB,EAOgB,CAPhB;;CApWA,CA8WA,CAAO,CAAP,EAAO,CAAA;;CA9WP,CA+WA,CAAK,CAAA,GAAA;;CA/WL,CAgXA,CAAU,IAAV,EAAU;;CAhXV,CAkXA,CAAc,CAAA,GAAd;;CAlXA,CAmXA,KAAO,CAAP;CACE,CAAM,EAAN,YAAA;CAAA,CACW,CAAyB,CAApC,GAAkB,EAAlB,KAAW;CADX,CAEU,CAAA,CAAV,CAAU,GAAV,CAAW;CACT,SAAA,MAAA;CAAA,EAAO,CAAP,CAAY,CAAZ;CACA,GAAG,CAAK,CAAR;CACE,CAA0C,CAAnC,CAAP,CAAmC,CAAnB,EAAhB;CAAA,EACO,CAAP,IAAA,UAA0B;CAC1B,GAAG,IAAH;CACE,EAAU,CAAP,GAAc,EAAjB,CAAA;CAAA;CACuB,EAAR,CAAP,EADR,CACsB,KADtB,EAAA;CAEK,CAAD,CAAqC,CAAzB,EAAd,GAAwC,OAA9B,GAAV;CACqB,EAAR,CAAP,EAHR,CAGsB,EAHtB,GAAA;CAIO,EAAQ,CAAT,CAAJ,cAAA;YALJ;UAHF;MAAA,EAAA;CAUU,EAAR,IAAO,QAAP,gBAAA;QAZM;CAFV,IAEU;CAtXZ,GAmXA;;CAnXA,CAoYA,CAAY,MAAA,EAAZ;CACE,OAAA,YAAA;AAAA,CAAA;UAAA,gBAAA;uCAAA;CACE,GAAG,CAAH,CAAA;CACE,EAAa,CAAT,CAAJ;MADF,EAAA;CAGE,EAAA,CAAa,GAAN,CAAP,CAAa;CAAb,GACI;QALR;CAAA;qBADU;CAAZ,CAOE,CAPU,GAAZ;;CAYA;;;;;;;;;;;;;;CAhZA;;CA+ZA;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA/ZA;CAAA"
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment