Commit b66e5403 authored by MobiusMei's avatar MobiusMei

Merge remote-tracking branch 'moecube/master' into R2-D2

parents e157b7b0 e89f63fd
# data files # data files
/beta
/expansions /expansions
/specials /specials
...@@ -24,16 +25,27 @@ ...@@ -24,16 +25,27 @@
/gframe/dirent.h /gframe/dirent.h
# git repos # git repos
/CustomTools
/DataEditorX
/Magic*
/pics /pics
/Printer
/script /script
/WindBot /ygopro-*
/*-Cards
# ygopro main program # libs
/ygopro /*.dll
/ygopro.exe /*.so
/ygopro_*.exe /*.dylib
/premake5
/premake5.exe # windbot related files
/[Bb]ot.conf
/[Bb]ot.exe
/[Ww]ind[Bb]ot
# ygopro config file
/system_user.conf
# ygopro folders # ygopro folders
/deck /deck
...@@ -43,9 +55,24 @@ ...@@ -43,9 +55,24 @@
/sound /sound
/update /update
# ygopro main program
/ygopro
/ygopro_*
/ygopro.exe
/ygopro_*.exe
/ygopro.app
/ygopro_*.app
/premake5
/premake5.exe
# 2pick related temp files
/card_list.txt
/card_list_*.txt
# others # others
*.log
/.vscode /.vscode
/bak/ /bak/
/card_list.txt /temp
/PrinterData.txt
/ygopro_*.bat /ygopro_*.bat
os=require("os") os=require("os")
io=require("io") io=require("io")
--globals --globals
local main={} local main={[0]={},[1]={}}
local extra={} local extra={[0]={},[1]={}}
local main_monster={} local main_monster={[0]={},[1]={}}
local main_spell={} local main_spell={[0]={},[1]={}}
local main_trap={} local main_trap={[0]={},[1]={}}
local forbidden_check={} local main_plain={[0]={},[1]={}}
local limited_check={} local main_adv={[0]={},[1]={}}
local semi_limited_check={}
local forbidden={} local extra_sp={
local limited={} [TYPE_FUSION]={[0]={},[1]={}},
local semi_limited={} [TYPE_SYNCHRO]={[0]={},[1]={}},
[TYPE_XYZ]={[0]={},[1]={}},
[TYPE_LINK]={[0]={},[1]={}},
}
function Auxiliary.LoadLFList() function Auxiliary.SplitData(inputstr)
local started=false local t={}
for line in io.lines("lflist.conf") do for str in string.gmatch(inputstr,"([^|]+)") do
if line:find("!") then table.insert(t,tonumber(str))
if started then
break
else
started=true
end
elseif started then
local fstart=line:find(" 0")
local lstart=line:find(" 1")
local sstart=line:find(" 2")
if fstart then
local code=tonumber(line:sub(1,fstart-1))
if code then forbidden_check[code]=true end
elseif lstart then
local code=tonumber(line:sub(1,lstart-1))
if code then limited_check[code]=true end
elseif sstart then
local code=tonumber(line:sub(1,sstart-1))
if code then semi_limited_check[code]=true end
end
end
end end
return t
end end
function Auxiliary.LoadDB() function Auxiliary.LoadDB(p,pool)
os.execute("sqlite3 2pick/2pick.cdb < 2pick/sqlite_cmd.txt") local file=io.popen("echo \"select * from datas;\" | sqlite3 "..pool)
for line in io.lines("card_list.txt") do for line in file:lines() do
local col=line:find("|") local data=Auxiliary.SplitData(line)
local code=tonumber(line:sub(1,col-1)) local code=data[1]
local cat=tonumber(line:sub(col+1,#line)) local cat=data[5]
local lv=data[8] & 0xff
if (cat & TYPE_FUSION+TYPE_SYNCHRO+TYPE_XYZ+TYPE_LINK)>0 then if (cat & TYPE_FUSION+TYPE_SYNCHRO+TYPE_XYZ+TYPE_LINK)>0 then
table.insert(extra,code) table.insert(extra[p],code)
for tp,list in pairs(extra_sp) do
if (cat & tp)>0 then
table.insert(list[p],code)
end
end
elseif (cat & TYPE_TOKEN)==0 then elseif (cat & TYPE_TOKEN)==0 then
if (cat & TYPE_MONSTER)>0 then if (cat & TYPE_MONSTER)>0 then
table.insert(main_monster,code) table.insert(main_monster[p],code)
if lv>4 then
table.insert(main_adv[p],code)
else
table.insert(main_plain[p],code)
end
elseif (cat & TYPE_SPELL)>0 then elseif (cat & TYPE_SPELL)>0 then
table.insert(main_spell,code) table.insert(main_spell[p],code)
elseif (cat & TYPE_TRAP)>0 then elseif (cat & TYPE_TRAP)>0 then
table.insert(main_trap,code) table.insert(main_trap[p],code)
end
table.insert(main,code)
if forbidden_check[code] then
table.insert(forbidden,code)
elseif limited_check[code] then
table.insert(limited,code)
elseif semi_limited_check[code] then
table.insert(semi_limited,code)
end end
table.insert(main[p],code)
end end
end end
file:close()
end end
function Auxiliary.SinglePick(p,list,count) --to do: multi card pools
local g1=Group.CreateGroup() function Auxiliary.LoadCardPools()
local g2=Group.CreateGroup() local pool_list={}
for _,g in ipairs({g1,g2}) do local file=io.popen("ls 2pick/*.cdb")
for i=1,count do for pool in file:lines() do
local code=list[math.random(#list)] table.insert(pool_list,pool)
g:AddCard(Duel.CreateToken(p,code)) end
end file:close()
Duel.SendtoDeck(g,nil,0,REASON_RULE) for p=0,1 do
Auxiliary.LoadDB(p,pool_list[math.random(#pool_list)])
end end
local sg=g1:Clone()
sg:Merge(g2)
--Duel.ConfirmCards(p,sg)
Duel.Hint(HINT_SELECTMSG,p,HINTMSG_TODECK)
local sc=sg:Select(p,1,1,nil):GetFirst()
--local tg=g1:IsContains(sc) and g1 or g2
local rg=g1:IsContains(sc) and g2 or g1
--Duel.SendtoDeck(tg,p,0,REASON_RULE)
Duel.Exile(rg,REASON_RULE)
end end
function Auxiliary.SinglePickForMain(p,list,count) function Auxiliary.SaveDeck()
for p=0,1 do
local g=Duel.GetFieldGroup(p,0xff,0)
Duel.SavePickDeck(p,g)
end
end
function Auxiliary.SinglePick(p,list,count,ex_list,ex_count,copy)
if not Duel.IsPlayerNeedToPickDeck(p) then return end
local g1=Group.CreateGroup() local g1=Group.CreateGroup()
local g2=Group.CreateGroup() local g2=Group.CreateGroup()
local plist=list[p]
for _,g in ipairs({g1,g2}) do for _,g in ipairs({g1,g2}) do
for i=1,count do for i=1,count do
local code=list[math.random(#list)] local code=plist[math.random(#plist)]
g:AddCard(Duel.CreateToken(p,code)) g:AddCard(Duel.CreateToken(p,code))
end end
if ex_list and ex_count then
local ex_plist=ex_list[p]
for i=1,ex_count do
local code=ex_plist[math.random(#ex_plist)]
g:AddCard(Duel.CreateToken(p,code))
end
end
Duel.SendtoDeck(g,nil,0,REASON_RULE) Duel.SendtoDeck(g,nil,0,REASON_RULE)
end end
local sg=g1:Clone() local sg=g1:Clone()
sg:Merge(g2) sg:Merge(g2)
--Duel.ConfirmCards(p,sg) Duel.ResetTimeLimit(p,60)
Duel.Hint(HINT_SELECTMSG,p,HINTMSG_TODECK) Duel.Hint(HINT_SELECTMSG,p,HINTMSG_TODECK)
local sc=sg:Select(p,1,1,nil):GetFirst() local sc=sg:Select(p,1,1,nil):GetFirst()
local tg=g1:IsContains(sc) and g1 or g2 local tg=g1:IsContains(sc) and g1 or g2
local rg=g1:IsContains(sc) and g2 or g1 local rg=g1:IsContains(sc) and g2 or g1
--Duel.SendtoDeck(tg,p,0,REASON_RULE)
Duel.Exile(rg,REASON_RULE) Duel.Exile(rg,REASON_RULE)
if copy then
local g3=Group.CreateGroup() local g3=Group.CreateGroup()
for nc in aux.Next(tg) do for nc in aux.Next(tg) do
local copy_code=nc:GetOriginalCode() local copy_code=nc:GetOriginalCode()
g3:AddCard(Duel.CreateToken(p,copy_code)) g3:AddCard(Duel.CreateToken(p,copy_code))
end end
Duel.SendtoDeck(g3,nil,0,REASON_RULE) Duel.SendtoDeck(g3,nil,0,REASON_RULE)
end
end end
function Auxiliary.StartPick(e) function Auxiliary.StartPick(e)
math.randomseed(os.time()) for p=0,1 do
local g=Duel.GetFieldGroup(0,LOCATION_HAND | LOCATION_DECK | LOCATION_EXTRA, LOCATION_HAND | LOCATION_DECK | LOCATION_EXTRA) if Duel.IsPlayerNeedToPickDeck(p) then
local g=Duel.GetFieldGroup(p,0xff,0)
Duel.Exile(g,REASON_RULE) Duel.Exile(g,REASON_RULE)
end
end
for i=1,5 do for i=1,5 do
--[[local list=main local list=main_plain
local count=4 local count=4
if i==9 then local ex_list=nil
list=semi_limited local ex_count=nil
elseif i==10 then if i<3 then
list=limited
count=3 count=3
elseif i==11 then ex_list=main_adv
list=forbidden ex_count=1
count=1 elseif i==4 then
end]]
local list=main_monster
if i==4 then
list=main_spell list=main_spell
elseif i==5 then elseif i==5 then
list=main_trap list=main_trap
end end
for p=0,1 do for p=0,1 do
Auxiliary.SinglePickForMain(p,list,4) Auxiliary.SinglePick(p,list,count,ex_list,ex_count,true)
--Auxiliary.SinglePick(p,main,4)
end end
end end
for i=1,5 do for tp,list in pairs(extra_sp) do
if tp~=TYPE_FUSION then
for p=0,1 do for p=0,1 do
Auxiliary.SinglePick(p,extra,4) Auxiliary.SinglePick(p,list,4,nil,nil,false)
end
end
end end
for i=1,2 do
for p=0,1 do
Auxiliary.SinglePick(p,extra,4,nil,nil,false)
end
end
Auxiliary.SaveDeck()
for p=0,1 do
if Duel.IsPlayerNeedToPickDeck(p) then
Duel.ShuffleDeck(p)
Duel.ResetTimeLimit(p)
end
end
for p=0,1 do
Duel.Draw(p,Duel.GetStartCount(p),REASON_RULE)
end end
Duel.ShuffleDeck(0)
Duel.ShuffleDeck(1)
Duel.Draw(0,5,REASON_RULE)
Duel.Draw(1,5,REASON_RULE)
e:Reset() e:Reset()
end end
function Auxiliary.Load2PickRule() function Auxiliary.Load2PickRule()
--[[Card.IsSetCard=Auxiliary.TRUE math.randomseed(os.time())
Card.IsOriginalSetCard=Auxiliary.TRUE Auxiliary.LoadCardPools()
Card.IsFusionSetCard=Auxiliary.TRUE
Card.IsLinkSetCard=Auxiliary.TRUE]]
Auxiliary.LoadLFList()
Auxiliary.LoadDB()
--[[local e2=Effect.GlobalEffect()
e2:SetDescription(1264319*16)
e2:SetType(EFFECT_TYPE_FIELD)
e2:SetCode(EFFECT_SPSUMMON_PROC)
e2:SetProperty(EFFECT_FLAG_UNCOPYABLE)
e2:SetRange(LOCATION_EXTRA)
e2:SetValue(SUMMON_TYPE_FUSION)
e2:SetCondition(Auxiliary.FusionSummonCondition)
e2:SetOperation(Auxiliary.FusionSummonOperation)
local e1=Effect.GlobalEffect()
e1:SetType(EFFECT_TYPE_FIELD+EFFECT_TYPE_GRANT)
e1:SetProperty(EFFECT_FLAG_IGNORE_IMMUNE | EFFECT_FLAG_SET_AVAILABLE)
e1:SetTargetRange(LOCATION_EXTRA,LOCATION_EXTRA)
e1:SetLabelObject(e2)
e1:SetTarget(function(e,c) return c:IsType(TYPE_FUSION) end)
Duel.RegisterEffect(e1,0)
local e1=Effect.GlobalEffect()
e1:SetType(EFFECT_TYPE_FIELD)
e1:SetCode(EFFECT_ADD_TYPE)
e1:SetProperty(EFFECT_FLAG_IGNORE_RANGE | EFFECT_FLAG_IGNORE_IMMUNE | EFFECT_FLAG_SET_AVAILABLE)
e1:SetTargetRange(0xff,0xff)
e1:SetValue(TYPE_TUNER)
e1:SetTarget(function(e,c) return c:IsType(TYPE_MONSTER) end)
Duel.RegisterEffect(e1,0)
local e1=Effect.GlobalEffect()
e1:SetType(EFFECT_TYPE_FIELD)
e1:SetCode(EFFECT_NONTUNER)
e1:SetProperty(EFFECT_FLAG_IGNORE_RANGE | EFFECT_FLAG_IGNORE_IMMUNE | EFFECT_FLAG_SET_AVAILABLE)
e1:SetTargetRange(0xff,0xff)
e1:SetValue(1)
Duel.RegisterEffect(e1,0)
local e1=Effect.GlobalEffect()
e1:SetType(EFFECT_TYPE_FIELD)
e1:SetCode(EFFECT_ADD_RACE)
e1:SetProperty(EFFECT_FLAG_IGNORE_RANGE | EFFECT_FLAG_IGNORE_IMMUNE | EFFECT_FLAG_SET_AVAILABLE)
e1:SetTargetRange(0xff,0xff)
e1:SetValue(RACE_ALL)
Duel.RegisterEffect(e1,0)
local e1=Effect.GlobalEffect()
e1:SetType(EFFECT_TYPE_FIELD)
e1:SetCode(EFFECT_ADD_ATTRIBUTE)
e1:SetProperty(EFFECT_FLAG_IGNORE_RANGE | EFFECT_FLAG_IGNORE_IMMUNE | EFFECT_FLAG_SET_AVAILABLE)
e1:SetTargetRange(0xff,0xff)
e1:SetValue(0x7f)
Duel.RegisterEffect(e1,0)]]
local e1=Effect.GlobalEffect() local e1=Effect.GlobalEffect()
e1:SetType(EFFECT_TYPE_FIELD | EFFECT_TYPE_CONTINUOUS) e1:SetType(EFFECT_TYPE_FIELD | EFFECT_TYPE_CONTINUOUS)
e1:SetCode(EVENT_ADJUST) e1:SetCode(EVENT_ADJUST)
...@@ -218,15 +173,3 @@ function Auxiliary.Load2PickRule() ...@@ -218,15 +173,3 @@ function Auxiliary.Load2PickRule()
e1:SetOperation(Auxiliary.StartPick) e1:SetOperation(Auxiliary.StartPick)
Duel.RegisterEffect(e1,0) Duel.RegisterEffect(e1,0)
end end
function Auxiliary.FusionSummonCondition(e,c)
if c==nil then return true end
local tp=c:GetControler()
local mg=Duel.GetFusionMaterial(tp):Filter(Card.IsOnField,nil)
return c:CheckFusionMaterial(mg,nil,tp)
end
function Auxiliary.FusionSummonOperation(e,tp,eg,ep,ev,re,r,rp,c)
local mg=Duel.GetFusionMaterial(tp):Filter(Card.IsOnField,nil)
local g=Duel.SelectFusionMaterial(tp,c,mg,nil,tp)
c:SetMaterial(g)
Duel.SendtoGrave(g,REASON_MATERIAL+REASON_FUSION)
end
.output card_list.txt
select id,type from datas;
.output stdout
...@@ -59,17 +59,13 @@ after_build: ...@@ -59,17 +59,13 @@ after_build:
- cd ygopro - cd ygopro
- bash -c "curl --retry 5 --connect-timeout 30 --location --remote-header-name --remote-name https://github.com/Smile-DK/ygopro-scripts/archive/master.zip ; exit 0" - bash -c "curl --retry 5 --connect-timeout 30 --location --remote-header-name --remote-name https://github.com/Smile-DK/ygopro-scripts/archive/master.zip ; exit 0"
- 7z x ygopro-scripts-master.zip - 7z x -y ygopro-scripts-master.zip
- mv -f ygopro-scripts-master script
- rm -rf ygopro-scripts-master.zip - rm -rf ygopro-scripts-master.zip
- bash -c "curl --retry 5 --connect-timeout 30 --location --remote-header-name --remote-name https://github.com/Fluorohydride/ygopro-scripts/archive/master.zip ; exit 0" - bash -c "curl --retry 5 --connect-timeout 30 --location --remote-header-name --remote-name https://github.com/Fluorohydride/ygopro-scripts/archive/master.zip ; exit 0"
- 7z x ygopro-scripts-master.zip - 7z x -y ygopro-scripts-master.zip
- cp -rf ygopro-scripts-master/* script - mv -f ygopro-scripts-master script
- rm -rf ygopro-scripts-master ygopro-scripts-master.zip
- mkdir replay - mkdir replay
- mv -f ../../expansions .
- mv -f ../../gframe . - mv -f ../../gframe .
- mv -f ../../ocgcore . - mv -f ../../ocgcore .
- mv -f ../../premake . - mv -f ../../premake .
...@@ -85,7 +81,6 @@ after_build: ...@@ -85,7 +81,6 @@ after_build:
- mv -f ../../system.conf . - mv -f ../../system.conf .
- cp -rf ../../ygopro.exe . - cp -rf ../../ygopro.exe .
- mv -f ../../premake5.exe . - mv -f ../../premake5.exe .
- mv -f ../../bats/build.bat .
- cd .. - cd ..
- mkdir redis - mkdir redis
...@@ -106,9 +101,9 @@ after_build: ...@@ -106,9 +101,9 @@ after_build:
- npm install pm2@latest -g - npm install pm2@latest -g
- npm install ws - npm install ws
- npm install redis - npm install redis
- 7z a -mx9 -xr!.git* ../ygopro-server.7z ./*
- cd .. - cd ..
- mv -f bats/start.bat .
- 7z a -mx9 -xr!.git* ygopro-server.7z ygopro-server start.bat
test: off test: off
......
@echo off
set irrklang_pro=1
premake5 vs2015
msbuild build\ygo.sln /m /property:Configuration=Release
del /f ygopro.exe
move bin\release\ygopro.exe .
pause
\ No newline at end of file
@echo off
cd ygopro-server/redis
start redis-server.exe
cd ../windbot
start windbot.exe servermode=true serverport=2399
cd ..
node.exe ygopro-server.js
pause
\ No newline at end of file
...@@ -110,11 +110,11 @@ int DeckManager::CheckDeck(Deck& deck, int lfhash, bool allow_ocg, bool allow_tc ...@@ -110,11 +110,11 @@ int DeckManager::CheckDeck(Deck& deck, int lfhash, bool allow_ocg, bool allow_tc
if(!list) if(!list)
return 0; return 0;
int dc = 0; int dc = 0;
if(deck.main.size() > 1) if(deck.main.size() < 40 || deck.main.size() > 60)
return (DECKERROR_MAINCOUNT << 28) + deck.main.size(); return (DECKERROR_MAINCOUNT << 28) + deck.main.size();
if(deck.extra.size() > 0) if(deck.extra.size() > 15)
return (DECKERROR_EXTRACOUNT << 28) + deck.extra.size(); return (DECKERROR_EXTRACOUNT << 28) + deck.extra.size();
if(deck.side.size() > 0) if(deck.side.size() > 15)
return (DECKERROR_SIDECOUNT << 28) + deck.side.size(); return (DECKERROR_SIDECOUNT << 28) + deck.side.size();
for(size_t i = 0; i < deck.main.size(); ++i) { for(size_t i = 0; i < deck.main.size(); ++i) {
...@@ -199,6 +199,7 @@ int DeckManager::LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec) { ...@@ -199,6 +199,7 @@ int DeckManager::LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec) {
return errorcode; return errorcode;
} }
bool DeckManager::LoadSide(Deck& deck, int* dbuf, int mainc, int sidec) { bool DeckManager::LoadSide(Deck& deck, int* dbuf, int mainc, int sidec) {
/*
std::unordered_map<int, int> pcount; std::unordered_map<int, int> pcount;
std::unordered_map<int, int> ncount; std::unordered_map<int, int> ncount;
for(size_t i = 0; i < deck.main.size(); ++i) for(size_t i = 0; i < deck.main.size(); ++i)
...@@ -221,6 +222,7 @@ bool DeckManager::LoadSide(Deck& deck, int* dbuf, int mainc, int sidec) { ...@@ -221,6 +222,7 @@ bool DeckManager::LoadSide(Deck& deck, int* dbuf, int mainc, int sidec) {
if(cdit->second != pcount[cdit->first]) if(cdit->second != pcount[cdit->first])
return false; return false;
deck = ndeck; deck = ndeck;
*/
return true; return true;
} }
FILE* DeckManager::OpenDeckFile(const wchar_t* file, const char* mode) { FILE* DeckManager::OpenDeckFile(const wchar_t* file, const char* mode) {
......
...@@ -19,6 +19,7 @@ SingleDuel::SingleDuel(bool is_match) { ...@@ -19,6 +19,7 @@ SingleDuel::SingleDuel(bool is_match) {
for(int i = 0; i < 2; ++i) { for(int i = 0; i < 2; ++i) {
players[i] = 0; players[i] = 0;
ready[i] = false; ready[i] = false;
pick_deck_saved[i] = false;
} }
duel_count = 0; duel_count = 0;
memset(match_result, 0, 3); memset(match_result, 0, 3);
...@@ -26,6 +27,10 @@ SingleDuel::SingleDuel(bool is_match) { ...@@ -26,6 +27,10 @@ SingleDuel::SingleDuel(bool is_match) {
cache_recorder = 0; cache_recorder = 0;
replay_recorder = 0; replay_recorder = 0;
#endif #endif
//2pick
int cardlist[128];
cardlist[0] = 89631139;
deckManager.LoadDeck(default_deck, cardlist, 1, 0);
} }
SingleDuel::~SingleDuel() { SingleDuel::~SingleDuel() {
} }
...@@ -364,7 +369,7 @@ void SingleDuel::PlayerReady(DuelPlayer* dp, bool is_ready) { ...@@ -364,7 +369,7 @@ void SingleDuel::PlayerReady(DuelPlayer* dp, bool is_ready) {
return; return;
if(is_ready) { if(is_ready) {
unsigned int deckerror = 0; unsigned int deckerror = 0;
if(!host_info.no_check_deck) { /*if(!host_info.no_check_deck) {
if(deck_error[dp->type]) { if(deck_error[dp->type]) {
deckerror = (DECKERROR_UNKNOWNCARD << 28) + deck_error[dp->type]; deckerror = (DECKERROR_UNKNOWNCARD << 28) + deck_error[dp->type];
} else { } else {
...@@ -372,7 +377,7 @@ void SingleDuel::PlayerReady(DuelPlayer* dp, bool is_ready) { ...@@ -372,7 +377,7 @@ void SingleDuel::PlayerReady(DuelPlayer* dp, bool is_ready) {
bool allow_tcg = host_info.rule == 1 || host_info.rule == 2; bool allow_tcg = host_info.rule == 1 || host_info.rule == 2;
deckerror = deckManager.CheckDeck(pdeck[dp->type], host_info.lflist, allow_ocg, allow_tcg); deckerror = deckManager.CheckDeck(pdeck[dp->type], host_info.lflist, allow_ocg, allow_tcg);
} }
} }*/
if(deckerror) { if(deckerror) {
STOC_HS_PlayerChange scpc; STOC_HS_PlayerChange scpc;
scpc.status = (dp->type << 4) | PLAYERCHANGE_NOTREADY; scpc.status = (dp->type << 4) | PLAYERCHANGE_NOTREADY;
...@@ -456,6 +461,9 @@ void SingleDuel::StartDuel(DuelPlayer* dp) { ...@@ -456,6 +461,9 @@ void SingleDuel::StartDuel(DuelPlayer* dp) {
hand_result[1] = 0; hand_result[1] = 0;
players[0]->state = CTOS_HAND_RESULT; players[0]->state = CTOS_HAND_RESULT;
players[1]->state = CTOS_HAND_RESULT; players[1]->state = CTOS_HAND_RESULT;
//reset 2pick deck
pick_deck_saved[0] = false;
pick_deck_saved[1] = false;
} }
void SingleDuel::HandResult(DuelPlayer* dp, unsigned char res) { void SingleDuel::HandResult(DuelPlayer* dp, unsigned char res) {
if(res > 3) if(res > 3)
...@@ -514,8 +522,16 @@ void SingleDuel::TPResult(DuelPlayer* dp, unsigned char tp) { ...@@ -514,8 +522,16 @@ void SingleDuel::TPResult(DuelPlayer* dp, unsigned char tp) {
Deck d = pdeck[0]; Deck d = pdeck[0];
pdeck[0] = pdeck[1]; pdeck[0] = pdeck[1];
pdeck[1] = d; pdeck[1] = d;
SwapPickDeck();
swapped = true; swapped = true;
} }
//2pick deck check
for(int i = 0; i < 2; i++) {
if(pick_deck_saved[i])
pdeck[i] = pick_deck[i];
else
pdeck[i] = default_deck;
}
dp->state = CTOS_RESPONSE; dp->state = CTOS_RESPONSE;
ReplayHeader rh; ReplayHeader rh;
rh.id = 0x31707279; rh.id = 0x31707279;
...@@ -545,8 +561,10 @@ void SingleDuel::TPResult(DuelPlayer* dp, unsigned char tp) { ...@@ -545,8 +561,10 @@ void SingleDuel::TPResult(DuelPlayer* dp, unsigned char tp) {
set_message_handler((message_handler)SingleDuel::MessageHandler); set_message_handler((message_handler)SingleDuel::MessageHandler);
rnd.reset(seed); rnd.reset(seed);
pduel = create_duel(rnd.rand()); pduel = create_duel(rnd.rand());
set_player_info(pduel, 0, host_info.start_lp, host_info.start_hand, host_info.draw_count); set_player_info(pduel, 0, host_info.start_lp, host_info.start_hand, host_info.draw_count, !pick_deck_saved[0]);
set_player_info(pduel, 1, host_info.start_lp, host_info.start_hand, host_info.draw_count); set_player_info(pduel, 1, host_info.start_lp, host_info.start_hand, host_info.draw_count, !pick_deck_saved[1]);
pick_deck_saved[0] = false;
pick_deck_saved[1] = false;
int opt = (int)host_info.duel_rule << 16; int opt = (int)host_info.duel_rule << 16;
if(host_info.no_shuffle_deck) if(host_info.no_shuffle_deck)
opt |= DUEL_PSEUDO_SHUFFLE; opt |= DUEL_PSEUDO_SHUFFLE;
...@@ -657,6 +675,7 @@ void SingleDuel::DuelEndProc() { ...@@ -657,6 +675,7 @@ void SingleDuel::DuelEndProc() {
Deck d = pdeck[0]; Deck d = pdeck[0];
pdeck[0] = pdeck[1]; pdeck[0] = pdeck[1];
pdeck[1] = d; pdeck[1] = d;
SwapPickDeck();
} }
ready[0] = false; ready[0] = false;
ready[1] = false; ready[1] = false;
...@@ -708,6 +727,33 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -708,6 +727,33 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
offset = pbuf; offset = pbuf;
unsigned char engType = BufferIO::ReadUInt8(pbuf); unsigned char engType = BufferIO::ReadUInt8(pbuf);
switch (engType) { switch (engType) {
//2pick
case MSG_SAVE_PICK_DECK: {
player = BufferIO::ReadInt8(pbuf);
count = BufferIO::ReadInt8(pbuf);
int cardlist[128];
int counter = 0;
Deck tdeck;
for(int i = 0; i < count; i++) {
int code = BufferIO::ReadInt32(pbuf);
cardlist[counter++] = code;
}
deckManager.LoadDeck(tdeck, cardlist, count, 0);
pick_deck[player] = tdeck;
pick_deck_saved[player] = true;
break;
}
case MSG_RESET_TIME: {
player = BufferIO::ReadInt8(pbuf);
int time = BufferIO::ReadInt8(pbuf);
if(host_info.time_limit) {
if(time)
time_limit[player] = time;
else
time_limit[player] = host_info.time_limit;
}
break;
}
case MSG_RETRY: { case MSG_RETRY: {
WaitforResponse(last_response); WaitforResponse(last_response);
NetServer::SendBufferToPlayer(players[last_response], STOC_GAME_MSG, offset, pbuf - offset); NetServer::SendBufferToPlayer(players[last_response], STOC_GAME_MSG, offset, pbuf - offset);
...@@ -1942,5 +1988,13 @@ void SingleDuel::SingleTimer(evutil_socket_t fd, short events, void* arg) { ...@@ -1942,5 +1988,13 @@ void SingleDuel::SingleTimer(evutil_socket_t fd, short events, void* arg) {
event_del(sd->etimer); event_del(sd->etimer);
} }
} }
void SingleDuel::SwapPickDeck() {
Deck d = pick_deck[0];
pick_deck[0] = pick_deck[1];
pick_deck[1] = d;
bool pick_deck_saved_temp = pick_deck_saved[0];
pick_deck_saved[0] = pick_deck_saved[1];
pick_deck_saved[1] = pick_deck_saved_temp;
}
} }
...@@ -40,8 +40,15 @@ public: ...@@ -40,8 +40,15 @@ public:
static int MessageHandler(long fduel, int type); static int MessageHandler(long fduel, int type);
static void SingleTimer(evutil_socket_t fd, short events, void* arg); static void SingleTimer(evutil_socket_t fd, short events, void* arg);
//2pick
void SwapPickDeck();
protected: protected:
//2pick
Deck default_deck;
Deck pick_deck[2];
bool pick_deck_saved[2];
DuelPlayer* players[2]; DuelPlayer* players[2];
DuelPlayer* pplayer[2]; DuelPlayer* pplayer[2];
bool ready[2]; bool ready[2];
......
...@@ -71,6 +71,7 @@ struct player_info { ...@@ -71,6 +71,7 @@ struct player_info {
int32 lp; int32 lp;
int32 start_count; int32 start_count;
int32 draw_count; int32 draw_count;
int32 pick_needed;
uint32 used_location; uint32 used_location;
uint32 disabled_location; uint32 disabled_location;
uint32 extra_p_count; uint32 extra_p_count;
...@@ -912,4 +913,7 @@ public: ...@@ -912,4 +913,7 @@ public:
#define MSG_CUSTOM_MSG 180 #define MSG_CUSTOM_MSG 180
#define MSG_SELECT_UNSELECT_CARD 190 #define MSG_SELECT_UNSELECT_CARD 190
//2pick
#define MSG_SAVE_PICK_DECK 220
#define MSG_RESET_TIME 221
#endif /* FIELD_H_ */ #endif /* FIELD_H_ */
...@@ -369,6 +369,11 @@ static const struct luaL_Reg grouplib[] = { ...@@ -369,6 +369,11 @@ static const struct luaL_Reg grouplib[] = {
}; };
static const struct luaL_Reg duellib[] = { static const struct luaL_Reg duellib[] = {
//2pick
{ "SavePickDeck", scriptlib::duel_save_pick_deck },
{ "IsPlayerNeedToPickDeck", scriptlib::duel_is_player_need_to_pick_deck },
{ "GetStartCount", scriptlib::duel_get_start_count },
{ "ResetTimeLimit", scriptlib::duel_reset_time_limit },
//modded //modded
{ "SelectField", scriptlib::duel_select_field }, { "SelectField", scriptlib::duel_select_field },
{ "GetMasterRule", scriptlib::duel_get_master_rule }, { "GetMasterRule", scriptlib::duel_get_master_rule },
......
...@@ -13,6 +13,57 @@ ...@@ -13,6 +13,57 @@
#include "group.h" #include "group.h"
#include "ocgapi.h" #include "ocgapi.h"
//2pick
int32 scriptlib::duel_save_pick_deck(lua_State * L) {
check_param_count(L, 2);
check_param(L, PARAM_TYPE_GROUP, 2);
int32 playerid = lua_tonumberint(L, 1);
if(playerid != 0 && playerid != 1)
luaL_error(L, "Parameter 1 should be 0 or 1.", 2);
group* pgroup = *(group**) lua_touserdata(L, 2);
duel* pduel = pgroup->pduel;
if(pgroup->container.size() == 0)
luaL_error(L, "Deck empty.", 2);
pduel->write_buffer8(MSG_SAVE_PICK_DECK);
pduel->write_buffer8(playerid);
pduel->write_buffer8(pgroup->container.size());
for(auto cit = pgroup->container.begin(); cit != pgroup->container.end(); ++cit) {
pduel->write_buffer32((*cit)->data.code);
}
return 0;
}
int32 scriptlib::duel_is_player_need_to_pick_deck(lua_State * L) {
check_param_count(L, 1);
int32 p = lua_tonumberint(L, 1);
if(p != 0 && p != 1)
luaL_error(L, "Parameter 1 should be 0 or 1.", 2);
duel* pduel = interpreter::get_duel_info(L);
lua_pushboolean(L, pduel->game_field->player[p].pick_needed);
return 1;
}
int32 scriptlib::duel_get_start_count(lua_State * L) {
check_param_count(L, 1);
int32 p = lua_tonumberint(L, 1);
if(p != 0 && p != 1)
luaL_error(L, "Parameter 1 should be 0 or 1.", 2);
duel* pduel = interpreter::get_duel_info(L);
lua_pushinteger(L, pduel->game_field->player[p].start_count);
return 1;
}
int32 scriptlib::duel_reset_time_limit(lua_State * L) {
check_param_count(L, 1);
int32 p = lua_tonumberint(L, 1);
int32 time = 0;
if(p != 0 && p != 1)
luaL_error(L, "Parameter 1 should be 0 or 1.", 2);
if(lua_gettop(L) >= 2)
time = lua_tonumberint(L, 2);
duel* pduel = interpreter::get_duel_info(L);
pduel->write_buffer8(MSG_RESET_TIME);
pduel->write_buffer8(p);
pduel->write_buffer8(time);
return 0;
}
//modded //modded
int32 scriptlib::duel_select_field(lua_State * L) { int32 scriptlib::duel_select_field(lua_State * L) {
check_action_permission(L); check_action_permission(L);
......
...@@ -78,10 +78,12 @@ extern "C" DECL_DLLEXPORT void start_duel(ptr pduel, int options) { ...@@ -78,10 +78,12 @@ extern "C" DECL_DLLEXPORT void start_duel(ptr pduel, int options) {
pd->game_field->core.shuffle_hand_check[1] = FALSE; pd->game_field->core.shuffle_hand_check[1] = FALSE;
pd->game_field->core.shuffle_deck_check[0] = FALSE; pd->game_field->core.shuffle_deck_check[0] = FALSE;
pd->game_field->core.shuffle_deck_check[1] = FALSE; pd->game_field->core.shuffle_deck_check[1] = FALSE;
/*
if(pd->game_field->player[0].start_count > 0) if(pd->game_field->player[0].start_count > 0)
pd->game_field->draw(0, REASON_RULE, PLAYER_NONE, 0, pd->game_field->player[0].start_count); pd->game_field->draw(0, REASON_RULE, PLAYER_NONE, 0, pd->game_field->player[0].start_count);
if(pd->game_field->player[1].start_count > 0) if(pd->game_field->player[1].start_count > 0)
pd->game_field->draw(0, REASON_RULE, PLAYER_NONE, 1, pd->game_field->player[1].start_count); pd->game_field->draw(0, REASON_RULE, PLAYER_NONE, 1, pd->game_field->player[1].start_count);
*/
if(options & DUEL_TAG_MODE) { if(options & DUEL_TAG_MODE) {
for(int i = 0; i < pd->game_field->player[0].start_count && pd->game_field->player[0].tag_list_main.size(); ++i) { for(int i = 0; i < pd->game_field->player[0].start_count && pd->game_field->player[0].tag_list_main.size(); ++i) {
card* pcard = pd->game_field->player[0].tag_list_main.back(); card* pcard = pd->game_field->player[0].tag_list_main.back();
...@@ -111,7 +113,7 @@ extern "C" DECL_DLLEXPORT void end_duel(ptr pduel) { ...@@ -111,7 +113,7 @@ extern "C" DECL_DLLEXPORT void end_duel(ptr pduel) {
delete pd; delete pd;
} }
} }
extern "C" DECL_DLLEXPORT void set_player_info(ptr pduel, int32 playerid, int32 lp, int32 startcount, int32 drawcount) { extern "C" DECL_DLLEXPORT void set_player_info(ptr pduel, int32 playerid, int32 lp, int32 startcount, int32 drawcount, bool pick_needed) {
duel* pd = (duel*)pduel; duel* pd = (duel*)pduel;
if(lp > 0) if(lp > 0)
pd->game_field->player[playerid].lp = lp; pd->game_field->player[playerid].lp = lp;
...@@ -119,6 +121,11 @@ extern "C" DECL_DLLEXPORT void set_player_info(ptr pduel, int32 playerid, int32 ...@@ -119,6 +121,11 @@ extern "C" DECL_DLLEXPORT void set_player_info(ptr pduel, int32 playerid, int32
pd->game_field->player[playerid].start_count = startcount; pd->game_field->player[playerid].start_count = startcount;
if(drawcount >= 0) if(drawcount >= 0)
pd->game_field->player[playerid].draw_count = drawcount; pd->game_field->player[playerid].draw_count = drawcount;
//2pick
if(pick_needed)
pd->game_field->player[playerid].pick_needed = TRUE;
else
pd->game_field->player[playerid].pick_needed = FALSE;
} }
extern "C" DECL_DLLEXPORT void get_log_message(ptr pduel, byte* buf) { extern "C" DECL_DLLEXPORT void get_log_message(ptr pduel, byte* buf) {
strcpy((char*)buf, ((duel*)pduel)->strbuffer); strcpy((char*)buf, ((duel*)pduel)->strbuffer);
......
...@@ -38,7 +38,7 @@ uint32 handle_message(void* pduel, uint32 message_type); ...@@ -38,7 +38,7 @@ uint32 handle_message(void* pduel, uint32 message_type);
extern "C" DECL_DLLEXPORT ptr create_duel(uint32 seed); extern "C" DECL_DLLEXPORT ptr create_duel(uint32 seed);
extern "C" DECL_DLLEXPORT void start_duel(ptr pduel, int32 options); extern "C" DECL_DLLEXPORT void start_duel(ptr pduel, int32 options);
extern "C" DECL_DLLEXPORT void end_duel(ptr pduel); extern "C" DECL_DLLEXPORT void end_duel(ptr pduel);
extern "C" DECL_DLLEXPORT void set_player_info(ptr pduel, int32 playerid, int32 lp, int32 startcount, int32 drawcount); extern "C" DECL_DLLEXPORT void set_player_info(ptr pduel, int32 playerid, int32 lp, int32 startcount, int32 drawcount, bool pick_needed = false);
extern "C" DECL_DLLEXPORT void get_log_message(ptr pduel, byte* buf); extern "C" DECL_DLLEXPORT void get_log_message(ptr pduel, byte* buf);
extern "C" DECL_DLLEXPORT int32 get_message(ptr pduel, byte* buf); extern "C" DECL_DLLEXPORT int32 get_message(ptr pduel, byte* buf);
extern "C" DECL_DLLEXPORT int32 process(ptr pduel); extern "C" DECL_DLLEXPORT int32 process(ptr pduel);
......
...@@ -16,6 +16,11 @@ public: ...@@ -16,6 +16,11 @@ public:
static int32 check_param(lua_State* L, int32 param_type, int32 index, BOOL retfalse = FALSE); static int32 check_param(lua_State* L, int32 param_type, int32 index, BOOL retfalse = FALSE);
static int32 check_param_count(lua_State* L, int32 count); static int32 check_param_count(lua_State* L, int32 count);
static int32 check_action_permission(lua_State* L); static int32 check_action_permission(lua_State* L);
//2pick
static int32 duel_save_pick_deck(lua_State *L);
static int32 duel_is_player_need_to_pick_deck(lua_State *L);
static int32 duel_get_start_count(lua_State *L);
static int32 duel_reset_time_limit(lua_State *L);
//millux //millux
static int32 card_is_ritual_type(lua_State *L); static int32 card_is_ritual_type(lua_State *L);
//modded //modded
......
#config file #config file
#nickname & gamename should be less than 20 characters #nickname & gamename should be less than 20 characters
use_d3d = 0 use_d3d = 0
use_image_scale = 1
pro_version = 4930
antialias = 2 antialias = 2
errorlog = 2 errorlog = 2
nickname = Komeiji Koishi nickname = Komeiji Koishi
......
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