Commit 028fbb46 authored by argon.sun's avatar argon.sun

ver update

parent 84025ebf
......@@ -266,6 +266,8 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
mainGame->wDeckEdit->setVisible(false);
mainGame->wFilter->setVisible(false);
mainGame->btnSideOK->setVisible(true);
if(!mainGame->dInfo.isObserver)
mainGame->btnLeaveGame->setVisible(false);
mainGame->deckBuilder.result_string[0] = L'0';
mainGame->deckBuilder.result_string[1] = 0;
mainGame->deckBuilder.results.clear();
......@@ -381,6 +383,11 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
mainGame->wPhase->setVisible(true);
mainGame->btnSideOK->setVisible(false);
mainGame->device->setEventReceiver(&mainGame->dField);
if(selftype > 1) {
mainGame->dInfo.isObserver = true;
mainGame->btnLeaveGame->setText(dataManager.GetSysString(1350));
mainGame->btnLeaveGame->setVisible(true);
}
if(selftype != 1) {
BufferIO::CopyWStr(mainGame->stHostSingleDuelist[0]->getText(), mainGame->dInfo.hostname, 20);
BufferIO::CopyWStr(mainGame->stHostSingleDuelist[1]->getText(), mainGame->dInfo.clientname, 20);
......@@ -615,6 +622,10 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
int playertype = BufferIO::ReadInt8(pbuf);
mainGame->dInfo.isFirst = (playertype & 0xf) ? false : true;
mainGame->dInfo.isObserver = (playertype & 0xf0) ? true : false;
if(!mainGame->dInfo.isObserver) {
mainGame->btnLeaveGame->setText(dataManager.GetSysString(1351));
mainGame->btnLeaveGame->setVisible(true);
}
mainGame->dInfo.lp[mainGame->LocalPlayer(0)] = BufferIO::ReadInt32(pbuf);
mainGame->dInfo.lp[mainGame->LocalPlayer(1)] = BufferIO::ReadInt32(pbuf);
myswprintf(mainGame->dInfo.strLP[0], L"%d", mainGame->dInfo.lp[0]);
......@@ -1221,7 +1232,7 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
pcard = mainGame->dField.GetCard(c, l, s);
if (code != 0)
pcard->SetCode(code);
myswprintf(textBuffer, L"%d[%ls]", i, dataManager.GetName(code));
myswprintf(textBuffer, L"*[%ls]", dataManager.GetName(code));
mainGame->lstLog->addItem(textBuffer);
mainGame->logParam.push_back(code);
float shift = -0.15f;
......@@ -1254,7 +1265,7 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
pcard = mainGame->dField.GetCard(c, l, s);
if (code != 0)
pcard->SetCode(code);
myswprintf(textBuffer, L"%d[%ls]", i, dataManager.GetName(code));
myswprintf(textBuffer, L"*[%ls]", dataManager.GetName(code));
mainGame->lstLog->addItem(textBuffer);
mainGame->logParam.push_back(code);
if (l & 0x41) {
......@@ -2384,7 +2395,7 @@ void DuelClient::BeginRefreshHost() {
return;
}
timeval timeout = {5, 0};
resp_event = event_new(broadev, reply, EV_TIMEOUT | EV_READ | EV_PERSIST, BroadcastReply, broadev);
resp_event = event_new(broadev, reply, EV_TIMEOUT | EV_READ, BroadcastReply, broadev);
event_add(resp_event, &timeout);
Thread::NewThread(RefreshThread, broadev);
//send request
......
......@@ -90,6 +90,19 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
mainGame->HideElement(mainGame->wReplaySave, true);
break;
}
case BUTTON_LEAVE_GAME: {
if(mainGame->dInfo.isObserver) {
DuelClient::StopClient();
mainGame->CloseDuelWindow();
mainGame->dInfo.isStarted = false;
mainGame->device->setEventReceiver(&mainGame->menuHandler);
mainGame->ShowElement(mainGame->wLanWindow);
} else {
DuelClient::SendPacketToServer(CTOS_SURRENDER);
mainGame->localAction.Set();
}
break;
}
case BUTTON_MSG_OK: {
mainGame->HideElement(mainGame->wMessage, true);
break;
......@@ -110,7 +123,6 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
break;
}
}
mainGame->HideElement(mainGame->wQuery);
break;
}
case BUTTON_NO: {
......@@ -138,7 +150,6 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
break;
}
}
mainGame->HideElement(mainGame->wQuery);
break;
}
case BUTTON_POS_AU: {
......
......@@ -433,6 +433,9 @@ bool Game::Initialize() {
btnReplayStep = env->addButton(rect<s32>(5, 55, 85, 75), wReplayControl, BUTTON_REPLAY_STEP, dataManager.GetSysString(1345));
btnReplaySwap = env->addButton(rect<s32>(5, 80, 85, 100), wReplayControl, BUTTON_REPLAY_SWAP, dataManager.GetSysString(1346));
btnReplayExit = env->addButton(rect<s32>(5, 105, 85, 125), wReplayControl, BUTTON_REPLAY_EXIT, dataManager.GetSysString(1347));
//
btnLeaveGame = env->addButton(rect<s32>(205, 200, 295, 273), 0, BUTTON_LEAVE_GAME, L"");
btnLeaveGame->setVisible(false);
device->setEventReceiver(&menuHandler);
LoadConfig();
env->getSkin()->setFont(guiFont);
......@@ -756,6 +759,7 @@ void Game::CloseDuelWindow() {
wReplayControl->setVisible(false);
stHintMsg->setVisible(false);
btnSideOK->setVisible(false);
btnLeaveGame->setVisible(false);
lstLog->clear();
logParam.clear();
lstHostList->clear();
......
......@@ -306,6 +306,8 @@ public:
irr::gui::IGUIButton* btnReplayStep;
irr::gui::IGUIButton* btnReplayExit;
irr::gui::IGUIButton* btnReplaySwap;
//surrender/leave
irr::gui::IGUIButton* btnLeaveGame;
};
......@@ -386,6 +388,7 @@ extern Game* mainGame;
#define BUTTON_BP 260
#define BUTTON_M2 261
#define BUTTON_EP 262
#define BUTTON_LEAVE_GAME 263
#define BUTTON_CLEAR_LOG 270
#define LISTBOX_LOG 271
#define BUTTON_CATEGORY_OK 300
......
......@@ -56,6 +56,8 @@ bool NetServer::StartBroadcast() {
void NetServer::StopServer() {
if(!net_evbase)
return;
if(duel_mode)
duel_mode->EndDuel();
event_base_loopexit(net_evbase, 0);
}
void NetServer::StopBroadcast() {
......@@ -158,6 +160,7 @@ int NetServer::ServerThread(void* param) {
void NetServer::DisconnectPlayer(DuelPlayer* dp) {
auto bit = users.find(dp->bev);
if(bit != users.end()) {
bufferevent_flush(dp->bev, EV_WRITE, BEV_FLUSH);
bufferevent_disable(dp->bev, EV_READ);
bufferevent_free(dp->bev);
users.erase(bit);
......@@ -166,7 +169,7 @@ void NetServer::DisconnectPlayer(DuelPlayer* dp) {
void NetServer::HandleCTOSPacket(DuelPlayer* dp, char* data, unsigned int len) {
char* pdata = data;
unsigned char pktType = BufferIO::ReadUInt8(pdata);
if(dp->state == 0xff || (dp->state && dp->state != pktType))
if((pktType != CTOS_SURRENDER) && (dp->state == 0xff || (dp->state && dp->state != pktType)))
return;
switch(pktType) {
case CTOS_RESPONSE: {
......@@ -241,6 +244,12 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, char* data, unsigned int len) {
duel_mode->LeaveGame(dp);
break;
}
case CTOS_SURRENDER: {
if(!duel_mode)
break;
duel_mode->Surrender(dp);
break;
}
case CTOS_HS_TODUELIST: {
if(!duel_mode || duel_mode->pduel)
break;
......
......@@ -121,6 +121,7 @@ public:
virtual int Analyze(char* msgbuffer, unsigned int len) {
return 0;
}
virtual void Surrender(DuelPlayer* dp) {}
virtual void GetResponse(DuelPlayer* dp, void* pdata, unsigned int len) {}
virtual void EndDuel() {};
......@@ -153,6 +154,7 @@ public:
#define CTOS_CREATE_GAME 0x11
#define CTOS_JOIN_GAME 0x12
#define CTOS_LEAVE_GAME 0x13
#define CTOS_SURRENDER 0x14
#define CTOS_HS_TODUELIST 0x20
#define CTOS_HS_TOOBSERVER 0x21
#define CTOS_HS_READY 0x22
......
......@@ -26,6 +26,7 @@ void SingleDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
scem.msg = ERRMSG_JOINERROR;
scem.code = 0;
NetServer::SendPacketToPlayer(dp, STOC_ERROR_MSG, scem);
NetServer::DisconnectPlayer(dp);
return;
}
CTOS_JoinGame* pkt = (CTOS_JoinGame*)pdata;
......@@ -34,6 +35,7 @@ void SingleDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
scem.msg = ERRMSG_VERERROR;
scem.code = PRO_VERSION;
NetServer::SendPacketToPlayer(dp, STOC_ERROR_MSG, scem);
NetServer::DisconnectPlayer(dp);
return;
}
wchar_t jpass[20];
......@@ -129,6 +131,7 @@ void SingleDuel::LeaveGame(DuelPlayer* dp) {
}
NetServer::DisconnectPlayer(dp);
} else {
if(!pduel) {
STOC_HS_PlayerChange scpc;
players[dp->type] = 0;
ready[dp->type] = false;
......@@ -139,10 +142,22 @@ void SingleDuel::LeaveGame(DuelPlayer* dp) {
NetServer::SendPacketToPlayer(players[1], STOC_HS_PLAYER_CHANGE, scpc);
for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc);
if(pduel)
NetServer::StopServer();
else {
NetServer::DisconnectPlayer(dp);
} else {
unsigned char wbuf[3];
wbuf[0] = MSG_WIN;
wbuf[1] = 1 - dp->type;
wbuf[2] = 0;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, wbuf, 3);
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
EndDuel();
NetServer::SendPacketToPlayer(players[0], STOC_DUEL_END);
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
NetServer::StopServer();
}
}
}
......@@ -428,7 +443,10 @@ void SingleDuel::Process() {
stop = Analyze(engineBuffer, engLen);
}
}
if(stop == 2) {
if(stop == 2)
DuelEndProc();
}
void SingleDuel::DuelEndProc() {
if(!match_mode) {
NetServer::SendPacketToPlayer(players[0], STOC_DUEL_END);
NetServer::ReSendToPlayer(players[1]);
......@@ -477,7 +495,28 @@ void SingleDuel::Process() {
NetServer::SendPacketToPlayer(*oit, STOC_WAITING_SIDE);
}
}
}
void SingleDuel::Surrender(DuelPlayer* dp) {
if(dp->type > 1 || !pduel)
return;
unsigned char wbuf[3];
uint32 player = dp->type;
wbuf[0] = MSG_WIN;
wbuf[1] = 1 - player;
wbuf[2] = 0;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, wbuf, 3);
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
if(players[player] == pplayer[player]) {
match_result[duel_count++] = player;
tp_player = 1 - player;
} else {
match_result[duel_count++] = 1 - player;
tp_player = player;
}
EndDuel();
DuelEndProc();
}
int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
char* offset, *pbufw, *pbuf = msgbuffer;
......
......@@ -22,10 +22,12 @@ public:
virtual void HandResult(DuelPlayer* dp, unsigned char res);
virtual void TPResult(DuelPlayer* dp, unsigned char tp);
virtual void Process();
virtual void Surrender(DuelPlayer* dp);
virtual int Analyze(char* msgbuffer, unsigned int len);
virtual void GetResponse(DuelPlayer* dp, void* pdata, unsigned int len);
virtual void EndDuel();
void DuelEndProc();
void WaitforResponse(int playerid);
void RefreshMzone(int player, int flag = 0x181fff, int use_cache = 1);
void RefreshSzone(int player, int flag = 0x181fff, int use_cache = 1);
......
/*
* libdebug.cpp
*
* Created on: 2012-2-8
* Author: Argon
*/
#include "scriptlib.h"
#include "duel.h"
#include "field.h"
#include "card.h"
#include "effect.h"
#include "ocgapi.h"
int32 scriptlib::debug_message(lua_State *L) {
duel* pduel = interpreter::get_duel_info(L);
lua_getglobal(L, "tostring");
lua_pushvalue(L, -2);
lua_pcall(L, 1, 1, 0);
sprintf(pduel->strbuffer, "%s", lua_tostring(L, -1));
handle_message(pduel, 2);
return 0;
}
int32 scriptlib::debug_add_card(lua_State *L) {
check_param_count(L, 6);
duel* pduel = interpreter::get_duel_info(L);
int32 code = lua_tointeger(L, 1);
int32 owner = lua_tointeger(L, 2);
int32 playerid = lua_tointeger(L, 3);
int32 location = lua_tointeger(L, 4);
int32 sequence = lua_tointeger(L, 5);
int32 position = lua_tointeger(L, 6);
int32 proc = lua_toboolean(L, 7);
if(owner != 0 && owner != 1)
return 0;
if(playerid != 0 && playerid != 1)
return 0;
if(pduel->game_field->is_location_useable(playerid, location, sequence)) {
card* pcard = pduel->new_card(code);
pcard->owner = owner;
pduel->game_field->add_card(playerid, pcard, location, sequence);
pcard->current.position = position;
if(!(location & LOCATION_ONFIELD) || (position & POS_FACEUP)) {
pcard->enable_field_effect(TRUE);
pduel->game_field->adjust_instant();
}
if(proc)
pcard->set_status(STATUS_PROC_COMPLETE, TRUE);
interpreter::card2value(L, pcard);
return 1;
}
return 0;
}
int32 scriptlib::debug_set_player_info(lua_State *L) {
check_param_count(L, 4);
duel* pduel = interpreter::get_duel_info(L);
uint32 playerid = lua_tointeger(L, 1);
uint32 lp = lua_tointeger(L, 2);
uint32 startcount = lua_tointeger(L, 3);
uint32 drawcount = lua_tointeger(L, 4);
duel* pd = (duel*)pduel;
if(playerid != 0 && playerid != 1)
return 0;
pd->game_field->player[playerid].lp = lp;
pd->game_field->player[playerid].start_count = startcount;
pd->game_field->player[playerid].draw_count = drawcount;
return 0;
}
......@@ -32,7 +32,7 @@ function c38679204.initial_effect(c)
c:RegisterEffect(e3)
end
function c38679204.eqcon(e,tp,eg,ep,ev,re,r,rp)
return c:IsPreviousLocation(LOCATION_MZONE)
return e:GetHandler():IsPreviousLocation(LOCATION_MZONE)
end
function c38679204.eqcost(e,tp,eg,ep,ev,re,r,rp,chk)
if chk==0 then return Duel.CheckLPCost(tp,500) end
......@@ -59,7 +59,7 @@ function c38679204.descon(e,tp,eg,ep,ev,re,r,rp)
local ec=e:GetHandler():GetEquipTarget()
local dt=nil
if ec==Duel.GetAttacker() then dt=Duel.GetAttackTarget()
elseif ec==Duel.GetAttackTarget() then di=Duel.GetAttacker() end
elseif ec==Duel.GetAttackTarget() then dt=Duel.GetAttacker() end
e:SetLabelObject(dt)
return dt and dt:IsRelateToBattle()
end
......
......@@ -20,13 +20,13 @@ function c46668237.initial_effect(c)
e2:SetOperation(c46668237.operation)
c:RegisterEffect(e2)
end
function c46668237.filter(c)
return c:IsLocation(LOCATION_MZONE) and c:IsFaceup() and c:IsRace(RACE_BEAST)
function c46668237.filter(c,tp)
return c:IsLocation(LOCATION_MZONE) and c:IsFaceup() and c:IsControler(tp) and c:IsRace(RACE_BEAST)
end
function c46668237.adjop(e,tp,eg,ep,ev,re,r,rp)
local pg=e:GetLabelObject()
if pg then pg:DeleteGroup() end
local dg=eg:Filter(c46668237.filter,nil)
local dg=eg:Filter(c46668237.filter,nil,tp)
e:SetLabelObject(dg)
dg:KeepAlive()
end
......
......@@ -44,6 +44,14 @@ function c67030233.initial_effect(c)
e4:SetTarget(c67030233.sptg)
e4:SetOperation(c67030233.spop)
c:RegisterEffect(e4)
--
local e5=Effect.CreateEffect(c)
e5:SetType(EFFECT_TYPE_SINGLE)
e5:SetProperty(EFFECT_FLAG_SINGLE_RANGE)
e5:SetRange(LOCATION_MZONE)
e5:SetCode(EFFECT_INDESTRUCTABLE_EFFECT)
e5:SetValue(1)
c:RegisterEffect(e5)
end
function c67030233.matfilter(c,syncard)
return c:IsFaceup() and c:IsCanBeSynchroMaterial(syncard)
......
......@@ -14,11 +14,11 @@ function c74191942.target(e,tp,eg,ep,ev,re,r,rp,chk)
Duel.SetOperationInfo(0,CATEGORY_TOHAND,nil,1,tp,LOCATION_DECK)
end
function c74191942.activate(e,tp,eg,ep,ev,re,r,rp)
Duel.Hint(HINT_SELECTMSG,tp,Stringid(74191942,0))
Duel.Hint(HINT_SELECTMSG,tp,aux.Stringid(74191942,0))
local g=Duel.SelectMatchingCard(tp,Card.IsAbleToHand,tp,LOCATION_DECK,0,5,5,nil)
if g:GetCount()<5 then return end
Duel.ConfirmCards(1-tp,g)
Duel.Hint(HINT_SELECTMSG,tp,Stringid(74191942,1))
Duel.Hint(HINT_SELECTMSG,1-tp,aux.Stringid(74191942,1))
local sg=g:Select(1-tp,1,1,nil)
Duel.SendtoHand(sg,nil,REASON_EFFECT)
g:Sub(sg)
......
......@@ -31,7 +31,7 @@ function c79229522.splimit(e,se,sp,st)
return e:GetHandler():GetLocation()~=LOCATION_EXTRA
end
function c79229522.spfilter1(c,tp)
return c:IsCode(70095154) and c:IsAbleToGraveAsCost() and c:IsCanBeFusionMaterial() and (c:IsControler(tp) or c:IsFaceup())
return c:IsCode(70095154) and c:IsAbleToGraveAsCost() and (c:IsControler(tp) or c:IsFaceup())
and Duel.IsExistingMatchingCard(c79229522.spfilter2,tp,LOCATION_MZONE,LOCATION_MZONE,1,c,tp)
end
function c79229522.spfilter2(c,tp)
......
......@@ -295,6 +295,8 @@
!system 1347 退出
!system 1348 载入录像
!system 1349 录像信息:
!system 1350 离开
!system 1351 投降
!system 1390 等待对方行动中...
!system 1391 等待对方行动中....
!system 1392 等待对方行动中.....
......@@ -342,6 +344,7 @@
!system 1623 投掷硬币结果:
!system 1624 投掷骰子结果:
#vistory reason
!victory 0x0 投降
!victory 0x1 LP变成0
!victory 0x2 没有卡可抽
!victory 0x3 被封印的埃及使者
......
......@@ -3,9 +3,9 @@
antialias = 2
nickname = Player
gamename = Game
lastdeck = chaosls
lastdeck = test
textfont = c:/windows/fonts/simsun.ttc
numfont = c:/windows/fonts/arialbd.ttf
serverport = 7911
lastip = 10.110.5.251
lastip = 192.168.3.235
lastport = 7911
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