Commit b66e5403 authored by MobiusMei's avatar MobiusMei

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

parents e157b7b0 e89f63fd
# data files
/beta
/expansions
/specials
......@@ -24,16 +25,27 @@
/gframe/dirent.h
# git repos
/CustomTools
/DataEditorX
/Magic*
/pics
/Printer
/script
/WindBot
/ygopro-*
/*-Cards
# ygopro main program
/ygopro
/ygopro.exe
/ygopro_*.exe
/premake5
/premake5.exe
# libs
/*.dll
/*.so
/*.dylib
# windbot related files
/[Bb]ot.conf
/[Bb]ot.exe
/[Ww]ind[Bb]ot
# ygopro config file
/system_user.conf
# ygopro folders
/deck
......@@ -43,9 +55,24 @@
/sound
/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
*.log
/.vscode
/bak/
/card_list.txt
/temp
/PrinterData.txt
/ygopro_*.bat
os=require("os")
io=require("io")
--globals
local main={}
local extra={}
local main={[0]={},[1]={}}
local extra={[0]={},[1]={}}
local main_monster={}
local main_spell={}
local main_trap={}
local main_monster={[0]={},[1]={}}
local main_spell={[0]={},[1]={}}
local main_trap={[0]={},[1]={}}
local forbidden_check={}
local limited_check={}
local semi_limited_check={}
local main_plain={[0]={},[1]={}}
local main_adv={[0]={},[1]={}}
local forbidden={}
local limited={}
local semi_limited={}
local extra_sp={
[TYPE_FUSION]={[0]={},[1]={}},
[TYPE_SYNCHRO]={[0]={},[1]={}},
[TYPE_XYZ]={[0]={},[1]={}},
[TYPE_LINK]={[0]={},[1]={}},
}
function Auxiliary.LoadLFList()
local started=false
for line in io.lines("lflist.conf") do
if line:find("!") then
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
function Auxiliary.SplitData(inputstr)
local t={}
for str in string.gmatch(inputstr,"([^|]+)") do
table.insert(t,tonumber(str))
end
return t
end
function Auxiliary.LoadDB()
os.execute("sqlite3 2pick/2pick.cdb < 2pick/sqlite_cmd.txt")
for line in io.lines("card_list.txt") do
local col=line:find("|")
local code=tonumber(line:sub(1,col-1))
local cat=tonumber(line:sub(col+1,#line))
function Auxiliary.LoadDB(p,pool)
local file=io.popen("echo \"select * from datas;\" | sqlite3 "..pool)
for line in file:lines() do
local data=Auxiliary.SplitData(line)
local code=data[1]
local cat=data[5]
local lv=data[8] & 0xff
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
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
table.insert(main_spell,code)
table.insert(main_spell[p],code)
elseif (cat & TYPE_TRAP)>0 then
table.insert(main_trap,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)
table.insert(main_trap[p],code)
end
table.insert(main[p],code)
end
end
file:close()
end
function Auxiliary.SinglePick(p,list,count)
local g1=Group.CreateGroup()
local g2=Group.CreateGroup()
for _,g in ipairs({g1,g2}) do
for i=1,count do
local code=list[math.random(#list)]
g:AddCard(Duel.CreateToken(p,code))
end
Duel.SendtoDeck(g,nil,0,REASON_RULE)
--to do: multi card pools
function Auxiliary.LoadCardPools()
local pool_list={}
local file=io.popen("ls 2pick/*.cdb")
for pool in file:lines() do
table.insert(pool_list,pool)
end
file:close()
for p=0,1 do
Auxiliary.LoadDB(p,pool_list[math.random(#pool_list)])
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
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 g2=Group.CreateGroup()
local plist=list[p]
for _,g in ipairs({g1,g2}) do
for i=1,count do
local code=list[math.random(#list)]
local code=plist[math.random(#plist)]
g:AddCard(Duel.CreateToken(p,code))
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)
end
local sg=g1:Clone()
sg:Merge(g2)
--Duel.ConfirmCards(p,sg)
Duel.ResetTimeLimit(p,60)
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)
local g3=Group.CreateGroup()
for nc in aux.Next(tg) do
local copy_code=nc:GetOriginalCode()
g3:AddCard(Duel.CreateToken(p,copy_code))
if copy then
local g3=Group.CreateGroup()
for nc in aux.Next(tg) do
local copy_code=nc:GetOriginalCode()
g3:AddCard(Duel.CreateToken(p,copy_code))
end
Duel.SendtoDeck(g3,nil,0,REASON_RULE)
end
Duel.SendtoDeck(g3,nil,0,REASON_RULE)
end
function Auxiliary.StartPick(e)
math.randomseed(os.time())
local g=Duel.GetFieldGroup(0,LOCATION_HAND | LOCATION_DECK | LOCATION_EXTRA, LOCATION_HAND | LOCATION_DECK | LOCATION_EXTRA)
Duel.Exile(g,REASON_RULE)
for p=0,1 do
if Duel.IsPlayerNeedToPickDeck(p) then
local g=Duel.GetFieldGroup(p,0xff,0)
Duel.Exile(g,REASON_RULE)
end
end
for i=1,5 do
--[[local list=main
local list=main_plain
local count=4
if i==9 then
list=semi_limited
elseif i==10 then
list=limited
local ex_list=nil
local ex_count=nil
if i<3 then
count=3
elseif i==11 then
list=forbidden
count=1
end]]
local list=main_monster
if i==4 then
ex_list=main_adv
ex_count=1
elseif i==4 then
list=main_spell
elseif i==5 then
list=main_trap
end
for p=0,1 do
Auxiliary.SinglePickForMain(p,list,4)
--Auxiliary.SinglePick(p,main,4)
Auxiliary.SinglePick(p,list,count,ex_list,ex_count,true)
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
Auxiliary.SinglePick(p,list,4,nil,nil,false)
end
end
end
for i=1,2 do
for p=0,1 do
Auxiliary.SinglePick(p,extra,4)
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
Duel.ShuffleDeck(0)
Duel.ShuffleDeck(1)
Duel.Draw(0,5,REASON_RULE)
Duel.Draw(1,5,REASON_RULE)
for p=0,1 do
Duel.Draw(p,Duel.GetStartCount(p),REASON_RULE)
end
e:Reset()
end
function Auxiliary.Load2PickRule()
--[[Card.IsSetCard=Auxiliary.TRUE
Card.IsOriginalSetCard=Auxiliary.TRUE
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)]]
math.randomseed(os.time())
Auxiliary.LoadCardPools()
local e1=Effect.GlobalEffect()
e1:SetType(EFFECT_TYPE_FIELD | EFFECT_TYPE_CONTINUOUS)
e1:SetCode(EVENT_ADJUST)
......@@ -218,15 +173,3 @@ function Auxiliary.Load2PickRule()
e1:SetOperation(Auxiliary.StartPick)
Duel.RegisterEffect(e1,0)
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:
- 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"
- 7z x ygopro-scripts-master.zip
- mv -f ygopro-scripts-master script
- 7z x -y 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"
- 7z x ygopro-scripts-master.zip
- cp -rf ygopro-scripts-master/* script
- rm -rf ygopro-scripts-master ygopro-scripts-master.zip
- 7z x -y ygopro-scripts-master.zip
- mv -f ygopro-scripts-master script
- mkdir replay
- mv -f ../../expansions .
- mv -f ../../gframe .
- mv -f ../../ocgcore .
- mv -f ../../premake .
......@@ -85,7 +81,6 @@ after_build:
- mv -f ../../system.conf .
- cp -rf ../../ygopro.exe .
- mv -f ../../premake5.exe .
- mv -f ../../bats/build.bat .
- cd ..
- mkdir redis
......@@ -106,9 +101,9 @@ after_build:
- npm install pm2@latest -g
- npm install ws
- npm install redis
- 7z a -mx9 -xr!.git* ../ygopro-server.7z ./*
- cd ..
- mv -f bats/start.bat .
- 7z a -mx9 -xr!.git* ygopro-server.7z ygopro-server start.bat
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
if(!list)
return 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();
if(deck.extra.size() > 0)
if(deck.extra.size() > 15)
return (DECKERROR_EXTRACOUNT << 28) + deck.extra.size();
if(deck.side.size() > 0)
if(deck.side.size() > 15)
return (DECKERROR_SIDECOUNT << 28) + deck.side.size();
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) {
return errorcode;
}
bool DeckManager::LoadSide(Deck& deck, int* dbuf, int mainc, int sidec) {
/*
std::unordered_map<int, int> pcount;
std::unordered_map<int, int> ncount;
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) {
if(cdit->second != pcount[cdit->first])
return false;
deck = ndeck;
*/
return true;
}
FILE* DeckManager::OpenDeckFile(const wchar_t* file, const char* mode) {
......
......@@ -19,6 +19,7 @@ SingleDuel::SingleDuel(bool is_match) {
for(int i = 0; i < 2; ++i) {
players[i] = 0;
ready[i] = false;
pick_deck_saved[i] = false;
}
duel_count = 0;
memset(match_result, 0, 3);
......@@ -26,6 +27,10 @@ SingleDuel::SingleDuel(bool is_match) {
cache_recorder = 0;
replay_recorder = 0;
#endif
//2pick
int cardlist[128];
cardlist[0] = 89631139;
deckManager.LoadDeck(default_deck, cardlist, 1, 0);
}
SingleDuel::~SingleDuel() {
}
......@@ -364,7 +369,7 @@ void SingleDuel::PlayerReady(DuelPlayer* dp, bool is_ready) {
return;
if(is_ready) {
unsigned int deckerror = 0;
if(!host_info.no_check_deck) {
/*if(!host_info.no_check_deck) {
if(deck_error[dp->type]) {
deckerror = (DECKERROR_UNKNOWNCARD << 28) + deck_error[dp->type];
} else {
......@@ -372,7 +377,7 @@ void SingleDuel::PlayerReady(DuelPlayer* dp, bool is_ready) {
bool allow_tcg = host_info.rule == 1 || host_info.rule == 2;
deckerror = deckManager.CheckDeck(pdeck[dp->type], host_info.lflist, allow_ocg, allow_tcg);
}
}
}*/
if(deckerror) {
STOC_HS_PlayerChange scpc;
scpc.status = (dp->type << 4) | PLAYERCHANGE_NOTREADY;
......@@ -456,6 +461,9 @@ void SingleDuel::StartDuel(DuelPlayer* dp) {
hand_result[1] = 0;
players[0]->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) {
if(res > 3)
......@@ -514,8 +522,16 @@ void SingleDuel::TPResult(DuelPlayer* dp, unsigned char tp) {
Deck d = pdeck[0];
pdeck[0] = pdeck[1];
pdeck[1] = d;
SwapPickDeck();
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;
ReplayHeader rh;
rh.id = 0x31707279;
......@@ -545,8 +561,10 @@ void SingleDuel::TPResult(DuelPlayer* dp, unsigned char tp) {
set_message_handler((message_handler)SingleDuel::MessageHandler);
rnd.reset(seed);
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, 1, 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, !pick_deck_saved[1]);
pick_deck_saved[0] = false;
pick_deck_saved[1] = false;
int opt = (int)host_info.duel_rule << 16;
if(host_info.no_shuffle_deck)
opt |= DUEL_PSEUDO_SHUFFLE;
......@@ -657,6 +675,7 @@ void SingleDuel::DuelEndProc() {
Deck d = pdeck[0];
pdeck[0] = pdeck[1];
pdeck[1] = d;
SwapPickDeck();
}
ready[0] = false;
ready[1] = false;
......@@ -708,6 +727,33 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
offset = pbuf;
unsigned char engType = BufferIO::ReadUInt8(pbuf);
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: {
WaitforResponse(last_response);
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) {
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:
static int MessageHandler(long fduel, int type);
static void SingleTimer(evutil_socket_t fd, short events, void* arg);
//2pick
void SwapPickDeck();
protected:
//2pick
Deck default_deck;
Deck pick_deck[2];
bool pick_deck_saved[2];
DuelPlayer* players[2];
DuelPlayer* pplayer[2];
bool ready[2];
......
......@@ -71,6 +71,7 @@ struct player_info {
int32 lp;
int32 start_count;
int32 draw_count;
int32 pick_needed;
uint32 used_location;
uint32 disabled_location;
uint32 extra_p_count;
......@@ -912,4 +913,7 @@ public:
#define MSG_CUSTOM_MSG 180
#define MSG_SELECT_UNSELECT_CARD 190
//2pick
#define MSG_SAVE_PICK_DECK 220
#define MSG_RESET_TIME 221
#endif /* FIELD_H_ */
......@@ -369,6 +369,11 @@ static const struct luaL_Reg grouplib[] = {
};
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
{ "SelectField", scriptlib::duel_select_field },
{ "GetMasterRule", scriptlib::duel_get_master_rule },
......
......@@ -13,6 +13,57 @@
#include "group.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
int32 scriptlib::duel_select_field(lua_State * L) {
check_action_permission(L);
......
......@@ -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_deck_check[0] = FALSE;
pd->game_field->core.shuffle_deck_check[1] = FALSE;
/*
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);
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);
*/
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) {
card* pcard = pd->game_field->player[0].tag_list_main.back();
......@@ -111,7 +113,7 @@ extern "C" DECL_DLLEXPORT void end_duel(ptr pduel) {
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;
if(lp > 0)
pd->game_field->player[playerid].lp = lp;
......@@ -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;
if(drawcount >= 0)
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) {
strcpy((char*)buf, ((duel*)pduel)->strbuffer);
......
......@@ -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 void start_duel(ptr pduel, int32 options);
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 int32 get_message(ptr pduel, byte* buf);
extern "C" DECL_DLLEXPORT int32 process(ptr pduel);
......
......@@ -16,6 +16,11 @@ public:
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_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
static int32 card_is_ritual_type(lua_State *L);
//modded
......
#config file
#nickname & gamename should be less than 20 characters
use_d3d = 0
use_image_scale = 1
pro_version = 4930
antialias = 2
errorlog = 2
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