Commit 95eb5a6a authored by MobiusMei's avatar MobiusMei

Merge remote-tracking branch 'origin/master'

parents 0a10d8ab 4098ec72
......@@ -18,6 +18,11 @@ local extra_sp={
[TYPE_LINK]={[0]={},[1]={}},
}
local xyz_plain={[0]={},[1]={}}
local xyz_adv={[0]={},[1]={}}
local extra_fixed={62709239,95169481}
function Auxiliary.SplitData(inputstr)
local t={}
for str in string.gmatch(inputstr,"([^|]+)") do
......@@ -44,6 +49,13 @@ function Auxiliary.LoadDB(p,pool)
table.insert(list[p],code)
end
end
if (cat & TYPE_XYZ)>0 then
if lv>4 then
table.insert(xyz_adv[p],code)
else
table.insert(xyz_plain[p],code)
end
end
elseif (cat & TYPE_TOKEN)==0 then
if (cat & TYPE_MONSTER)>0 then
table.insert(main_monster[p],code)
......@@ -81,7 +93,7 @@ function Auxiliary.SaveDeck()
Duel.SavePickDeck(p,g)
end
end
function Auxiliary.SinglePick(p,list,count,ex_list,ex_count,copy)
function Auxiliary.SinglePick(p,list,count,ex_list,ex_count,copy,lv_diff,fixed)
if not Duel.IsPlayerNeedToPickDeck(p) then return end
local g1=Group.CreateGroup()
local g2=Group.CreateGroup()
......@@ -95,7 +107,8 @@ function Auxiliary.SinglePick(p,list,count,ex_list,ex_count,copy)
local pick_count=0
while pick_count<count do
local code=plist[math.random(#plist)]
if not ag:IsExists(Card.IsCode,1,nil,code) then
local lv=Duel.ReadCard(code,CARDDATA_LEVEL)
if not ag:IsExists(Card.IsCode,1,nil,code) and not (lv_diff and g:IsExists(Card.IsLevel,1,nil,lv)) then
local card=Duel.CreateToken(p,code)
g:AddCard(card)
ag:AddCard(card)
......@@ -111,7 +124,8 @@ function Auxiliary.SinglePick(p,list,count,ex_list,ex_count,copy)
local ex_pick_count=0
while ex_pick_count<ex_count do
local code=ex_plist[math.random(#ex_plist)]
if not ag:IsExists(Card.IsCode,1,nil,code) then
local lv=Duel.ReadCard(code,CARDDATA_LEVEL)
if not ag:IsExists(Card.IsCode,1,nil,code) and not (lv_diff and g:IsExists(Card.IsLevel,1,nil,lv)) then
local card=Duel.CreateToken(p,code)
g:AddCard(card)
ag:AddCard(card)
......@@ -119,6 +133,12 @@ function Auxiliary.SinglePick(p,list,count,ex_list,ex_count,copy)
end
end
end
if fixed then
for _,code in ipairs(fixed) do
local card=Duel.CreateToken(p,code)
g:AddCard(card)
end
end
Duel.SendtoDeck(g,nil,0,REASON_RULE)
end
local sg=g1:Clone()
......@@ -176,13 +196,22 @@ function Auxiliary.StartPick(e)
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)
if tp==TYPE_XYZ then
Auxiliary.SinglePick(p,xyz_plain,3,xyz_adv,1,false)
else
local lv_diff=(tp==TYPE_SYNCHRO)
Auxiliary.SinglePick(p,list,4,nil,nil,false,lv_diff)
end
end
end
end
for i=1,2 do
for p=0,1 do
Auxiliary.SinglePick(p,extra,4,nil,nil,false)
if i==1 then
Auxiliary.SinglePick(p,extra,4,nil,nil,false)
else
Auxiliary.SinglePick(p,extra,2,nil,nil,false,false,extra_fixed)
end
end
end
Auxiliary.SaveDeck()
......
......@@ -1007,6 +1007,11 @@ uint32 card::get_ritual_level(card* pcard) {
uint32 card::check_xyz_level(card* pcard, uint32 lv) {
if(status & STATUS_NO_LEVEL)
return 0;
//modded - rose xyz summon
card* rcard = pduel->game_field->rose_card;
uint32 rlv = pduel->game_field->rose_level;
if(rcard == this && rlv == lv)
return rlv;
uint32 lev;
effect_set eset;
filter_effect(EFFECT_XYZ_LEVEL, &eset);
......
......@@ -18,6 +18,9 @@ duel::duel() {
lua = new interpreter(this);
game_field = new field(this);
game_field->temp_card = new_card(0);
//modded - for rose xyz summon
game_field->rose_card = 0;
game_field->rose_level = 0;
clear_buffer();
}
duel::~duel() {
......@@ -43,6 +46,9 @@ void duel::clear() {
effects.clear();
game_field = new field(this);
game_field->temp_card = new_card(0);
//modded - for rose xyz summon
game_field->rose_card = 0;
game_field->rose_level = 0;
}
card* duel::new_card(uint32 code) {
card* pcard = new card(this);
......
......@@ -342,6 +342,9 @@ public:
processor core;
return_value returns;
tevent nil_event;
//modded - for rose xyz summon
card* rose_card;
uint32 rose_level;
static int32 field_used_count[32];
explicit field(duel* pduel);
......@@ -913,7 +916,23 @@ public:
#define MSG_CUSTOM_MSG 180
#define MSG_SELECT_UNSELECT_CARD 190
//card datas for Duel.ReadCard / Card.SetCardData, arranged by database format
#define CARDDATA_CODE 1
#define CARDDATA_ALIAS 2
#define CARDDATA_SETCODE 3
#define CARDDATA_TYPE 4
#define CARDDATA_LEVEL 5
#define CARDDATA_ATTRIBUTE 6
#define CARDDATA_RACE 7
#define CARDDATA_ATTACK 8
#define CARDDATA_DEFENSE 9
#define CARDDATA_LSCALE 10
#define CARDDATA_RSCALE 11
#define CARDDATA_LINK_MARKER 12
//2pick
#define MSG_SAVE_PICK_DECK 220
#define MSG_RESET_TIME 221
#endif /* FIELD_H_ */
......@@ -23,6 +23,7 @@ static const struct luaL_Reg cardlib[] = {
{ "SetCardData", scriptlib::card_set_card_data },
{ "GetLinkMarker", scriptlib::card_get_link_marker },
{ "GetOriginalLinkMarker", scriptlib::card_get_origin_link_marker },
{ "IsXyzSummonableByRose", scriptlib::card_is_xyz_summonable_by_rose },
{ "GetCode", scriptlib::card_get_code },
{ "GetOriginalCode", scriptlib::card_get_origin_code },
......@@ -387,7 +388,9 @@ static const struct luaL_Reg duellib[] = {
{ "Exile", scriptlib::duel_exile },
{ "DisableActionCheck", scriptlib::duel_disable_action_check },
{ "SetMetatable", scriptlib::duel_setmetatable },
{ "MoveTurnCount", scriptlib::duel_move_turn_count },
{ "MoveTurnCount", scriptlib::duel_move_turn_count },
{ "GetCardsInZone", scriptlib::duel_get_cards_in_zone },
{ "XyzSummonByRose", scriptlib::duel_xyz_summon_by_rose },
{ "EnableGlobalFlag", scriptlib::duel_enable_global_flag },
{ "GetLP", scriptlib::duel_get_lp },
......@@ -659,6 +662,34 @@ interpreter::interpreter(duel* pd): coroutines(256) {
load_script((char*) "./script/constant.lua");
load_script((char*) "./script/utility.lua");
//load kpro constant
//card data constants
lua_pushinteger(lua_state, CARDDATA_CODE);
lua_setglobal(lua_state, "CARDDATA_CODE");
lua_pushinteger(lua_state, CARDDATA_ALIAS);
lua_setglobal(lua_state, "CARDDATA_ALIAS");
lua_pushinteger(lua_state, CARDDATA_SETCODE);
lua_setglobal(lua_state, "CARDDATA_SETCODE");
lua_pushinteger(lua_state, CARDDATA_TYPE);
lua_setglobal(lua_state, "CARDDATA_TYPE");
lua_pushinteger(lua_state, CARDDATA_LEVEL);
lua_setglobal(lua_state, "CARDDATA_LEVEL");
lua_pushinteger(lua_state, CARDDATA_ATTRIBUTE);
lua_setglobal(lua_state, "CARDDATA_ATTRIBUTE");
lua_pushinteger(lua_state, CARDDATA_ATTRIBUTE);
lua_setglobal(lua_state, "CARDDATA_ATTRIBUTE");
lua_pushinteger(lua_state, CARDDATA_RACE);
lua_setglobal(lua_state, "CARDDATA_RACE");
lua_pushinteger(lua_state, CARDDATA_ATTACK);
lua_setglobal(lua_state, "CARDDATA_ATTACK");
lua_pushinteger(lua_state, CARDDATA_DEFENSE);
lua_setglobal(lua_state, "CARDDATA_DEFENSE");
lua_pushinteger(lua_state, CARDDATA_LSCALE);
lua_setglobal(lua_state, "CARDDATA_LSCALE");
lua_pushinteger(lua_state, CARDDATA_RSCALE);
lua_setglobal(lua_state, "CARDDATA_RSCALE");
lua_pushinteger(lua_state, CARDDATA_LINK_MARKER);
lua_setglobal(lua_state, "CARDDATA_LINK_MARKER");
//effects
lua_pushinteger(lua_state, EFFECT_CHANGE_LINK_MARKER_KOISHI);
lua_setglobal(lua_state, "EFFECT_CHANGE_LINK_MARKER_KOISHI");
lua_pushinteger(lua_state, EFFECT_ADD_LINK_MARKER_KOISHI);
......@@ -667,6 +698,7 @@ interpreter::interpreter(duel* pd): coroutines(256) {
lua_setglobal(lua_state, "EFFECT_REMOVE_LINK_MARKER_KOISHI");
lua_pushinteger(lua_state, EFFECT_CANNOT_LOSE_KOISHI);
lua_setglobal(lua_state, "EFFECT_CANNOT_LOSE_KOISHI");
//music hints
lua_pushinteger(lua_state, HINT_MUSIC);
lua_setglobal(lua_state, "HINT_MUSIC");
lua_pushinteger(lua_state, HINT_SOUND);
......
......@@ -44,40 +44,40 @@ int32 scriptlib::card_set_card_data(lua_State *L) {
card* pcard = *(card**) lua_touserdata(L, 1);
int32 stype = lua_tonumberint(L, 2);
switch(stype) {
case ASSUME_CODE:
case CARDDATA_CODE:
pcard->data.code = lua_tonumberint(L, 3);
break;
case ASSUME_TYPE:
pcard->data.type = lua_tonumberint(L, 3);
case CARDDATA_ALIAS:
pcard->data.alias = lua_tonumberint(L, 3);
break;
case ASSUME_LEVEL:
pcard->data.level = lua_tonumberint(L, 3);
case CARDDATA_SETCODE:
pcard->data.setcode = lua_tonumberint(L, 3);
break;
case CARDDATA_TYPE:
pcard->data.type = lua_tonumberint(L, 3);
break;
case ASSUME_RANK:
case CARDDATA_LEVEL:
pcard->data.level = lua_tonumberint(L, 3);
break;
case ASSUME_ATTRIBUTE:
case CARDDATA_ATTRIBUTE:
pcard->data.attribute = lua_tonumberint(L, 3);
break;
case ASSUME_RACE:
case CARDDATA_RACE:
pcard->data.race = lua_tonumberint(L, 3);
break;
case ASSUME_ATTACK:
case CARDDATA_ATTACK:
pcard->data.attack = lua_tonumberint(L, 3);
break;
case ASSUME_DEFENSE:
case CARDDATA_DEFENSE:
pcard->data.defense = lua_tonumberint(L, 3);
break;
case 9:
pcard->data.alias = lua_tonumberint(L, 3);
break;
case 10:
case CARDDATA_LSCALE:
pcard->data.lscale = lua_tonumberint(L, 3);
break;
case 11:
case CARDDATA_RSCALE:
pcard->data.rscale = lua_tonumberint(L, 3);
break;
case 12:
case CARDDATA_LINK_MARKER:
pcard->data.link_marker = lua_tonumberint(L, 3);
break;
}
......@@ -100,6 +100,30 @@ int32 scriptlib::card_get_origin_link_marker(lua_State *L) {
lua_pushinteger(L, pcard->data.link_marker);
return 1;
}
int32 scriptlib::card_is_xyz_summonable_by_rose(lua_State *L) {
check_param_count(L, 3);
check_param(L, PARAM_TYPE_CARD, 1);
check_param(L, PARAM_TYPE_CARD, 2);
check_param(L, PARAM_TYPE_CARD, 3);
card* pcard = *(card**) lua_touserdata(L, 1);
if(!(pcard->data.type & TYPE_XYZ))
return 0;
card* rcard = *(card**) lua_touserdata(L, 2);
card* mcard = *(card**) lua_touserdata(L, 3);
group* materials = pcard->pduel->new_group(rcard);
materials->container.insert(mcard);
uint32 p = pcard->pduel->game_field->core.reason_player;
pcard->pduel->game_field->core.limit_xyz = materials;
pcard->pduel->game_field->core.limit_xyz_minc = 2;
pcard->pduel->game_field->core.limit_xyz_maxc = 2;
pcard->pduel->game_field->rose_card = rcard;
pcard->pduel->game_field->rose_level = mcard->get_level();
int32 result = pcard->is_special_summonable(p, SUMMON_TYPE_XYZ);
pcard->pduel->game_field->rose_card = 0;
pcard->pduel->game_field->rose_level = 0;
lua_pushboolean(L, result);
return 1;
}
int32 scriptlib::card_get_code(lua_State *L) {
check_param_count(L, 1);
......
......@@ -113,40 +113,40 @@ int32 scriptlib::duel_read_card(lua_State *L) {
for(uint32 i = 0; i < args; ++i) {
int32 flag = lua_tonumberint(L, 2 + i);
switch(flag) {
case 1:
case CARDDATA_CODE:
lua_pushinteger(L, dat.code);
break;
case 2:
case CARDDATA_ALIAS:
lua_pushinteger(L, dat.alias);
break;
case 3:
case CARDDATA_SETCODE:
lua_pushinteger(L, dat.setcode);
break;
case 4:
case CARDDATA_TYPE:
lua_pushinteger(L, dat.type);
break;
case 5:
case CARDDATA_LEVEL:
lua_pushinteger(L, dat.level);
break;
case 6:
case CARDDATA_ATTRIBUTE:
lua_pushinteger(L, dat.attribute);
break;
case 7:
case CARDDATA_RACE:
lua_pushinteger(L, dat.race);
break;
case 8:
case CARDDATA_ATTACK:
lua_pushinteger(L, dat.attack);
break;
case 9:
case CARDDATA_DEFENSE:
lua_pushinteger(L, dat.defense);
break;
case 10:
case CARDDATA_LSCALE:
lua_pushinteger(L, dat.lscale);
break;
case 11:
case CARDDATA_RSCALE:
lua_pushinteger(L, dat.rscale);
break;
case 12:
case CARDDATA_LINK_MARKER:
lua_pushinteger(L, dat.link_marker);
break;
default:
......@@ -204,6 +204,46 @@ int32 scriptlib::duel_move_turn_count(lua_State *L) {
pduel->write_buffer8(turn_player | 0x2);
return 0;
}
int32 scriptlib::duel_get_cards_in_zone(lua_State *L) {
check_param_count(L, 2);
uint32 rplayer = lua_tonumberint(L, 1);
if(rplayer != 0 && rplayer != 1)
return 0;
uint32 zone = lua_tonumberint(L, 2);
duel* pduel = interpreter::get_duel_info(L);
field::card_set cset;
pduel->game_field->get_cards_in_zone(&cset, zone, rplayer, LOCATION_MZONE);
pduel->game_field->get_cards_in_zone(&cset, zone, rplayer, LOCATION_SZONE);
pduel->game_field->get_cards_in_zone(&cset, zone >> 16, 1 - rplayer, LOCATION_MZONE);
pduel->game_field->get_cards_in_zone(&cset, zone >> 16, 1 - rplayer, LOCATION_SZONE);
group* pgroup = pduel->new_group(cset);
interpreter::group2value(L, pgroup);
return 1;
}
int32 scriptlib::duel_xyz_summon_by_rose(lua_State *L) {
check_action_permission(L);
check_param_count(L, 4);
check_param(L, PARAM_TYPE_CARD, 2);
check_param(L, PARAM_TYPE_CARD, 3);
check_param(L, PARAM_TYPE_CARD, 4);
uint32 playerid = lua_tonumberint(L, 1);
if(playerid != 0 && playerid != 1)
return 0;
card* pcard = *(card**)lua_touserdata(L, 2);
card* rcard = *(card**) lua_touserdata(L, 3);
card* mcard = *(card**) lua_touserdata(L, 4);
duel* pduel = pcard->pduel;
group* materials = pduel->new_group(rcard);
materials->container.insert(mcard);
pduel->game_field->core.limit_xyz = materials;
pduel->game_field->core.limit_xyz_minc = 0;
pduel->game_field->core.limit_xyz_maxc = 0;
pduel->game_field->core.summon_cancelable = FALSE;
pduel->game_field->rose_card = rcard;
pduel->game_field->rose_level = mcard->get_level();
pduel->game_field->special_summon_rule(playerid, pcard, SUMMON_TYPE_XYZ);
return lua_yield(L, 0);
}
int32 scriptlib::duel_enable_global_flag(lua_State *L) {
check_param_count(L, 1);
......
......@@ -2570,7 +2570,12 @@ int32 field::special_summon_rule(uint16 step, uint8 sumplayer, card* target, uin
if(proc->value == SUMMON_TYPE_SYNCHRO)
matreason = REASON_SYNCHRO;
else if(proc->value == SUMMON_TYPE_XYZ)
{
matreason = REASON_XYZ;
//modded - rose xyz summon
pduel->game_field->rose_card = 0;
pduel->game_field->rose_level = 0;
}
else if(proc->value == SUMMON_TYPE_LINK)
matreason = REASON_LINK;
if (target->material_cards.size()) {
......
......@@ -28,6 +28,7 @@ public:
static int32 card_set_card_data(lua_State *L);
static int32 card_get_link_marker(lua_State *L);
static int32 card_get_origin_link_marker(lua_State *L);
static int32 card_is_xyz_summonable_by_rose(lua_State *L);
static int32 effect_set_owner(lua_State *L);
static int32 effect_get_range(lua_State *L);
static int32 effect_get_count_limit(lua_State *L);
......@@ -38,6 +39,8 @@ public:
static int32 duel_disable_action_check(lua_State *L);
static int32 duel_setmetatable(lua_State *L);
static int32 duel_move_turn_count(lua_State *L);
static int32 duel_get_cards_in_zone(lua_State *L);
static int32 duel_xyz_summon_by_rose(lua_State *L);
//metatable
static int32 group_meta_add(lua_State *L);
static int32 group_meta_sub(lua_State *L);
......
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