Skip to content

Commit

Permalink
update get_function_value with multiple result (#680)
Browse files Browse the repository at this point in the history
* update register_card

* update get_function_value with multiple result
  • Loading branch information
salix5 authored Dec 1, 2024
1 parent 65bd779 commit 16f2c36
Show file tree
Hide file tree
Showing 6 changed files with 103 additions and 102 deletions.
60 changes: 30 additions & 30 deletions card.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2736,11 +2736,11 @@ int32 card::filter_summon_procedure(uint8 playerid, effect_set* peset, uint8 ign
effect_set extra_count;
filter_effect(EFFECT_EXTRA_SUMMON_COUNT, &extra_count);
for(int32 i = 0; i < extra_count.size(); ++i) {
std::vector<int32> retval;
extra_count[i]->get_value(this, 0, &retval);
int32 new_min = retval.size() > 0 ? retval[0] : 0;
int32 new_zone = retval.size() > 1 ? retval[1] : 0x1f;
int32 releasable = retval.size() > 2 ? (retval[2] < 0 ? 0xff00ff + retval[2] : retval[2]) : 0xff00ff;
std::vector<lua_Integer> retval;
extra_count[i]->get_value(this, 0, retval);
int32 new_min = retval.size() > 0 ? static_cast<int32>(retval[0]) : 0;
uint32 new_zone = retval.size() > 1 ? static_cast<uint32>(retval[1]) : 0x1f;
int32 releasable = retval.size() > 2 ? (retval[2] < 0 ? 0xff00ff + static_cast<int32>(retval[2]) : static_cast<int32>(retval[2])) : 0xff00ff;
if(new_min < min)
new_min = min;
new_zone &= zone;
Expand Down Expand Up @@ -2769,12 +2769,12 @@ int32 card::check_summon_procedure(effect* proc, uint8 playerid, uint8 ignore_co
effect_set eset;
filter_effect(EFFECT_EXTRA_SUMMON_COUNT, &eset);
for(int32 i = 0; i < eset.size(); ++i) {
std::vector<int32> retval;
eset[i]->get_value(this, 0, &retval);
int32 new_min_tribute = retval.size() > 0 ? retval[0] : 0;
int32 new_zone = retval.size() > 1 ? retval[1] : 0x1f;
int32 releasable = retval.size() > 2 ? (retval[2] < 0 ? 0xff00ff + retval[2] : retval[2]) : 0xff00ff;
if(new_min_tribute < (int32)min_tribute)
std::vector<lua_Integer> retval;
eset[i]->get_value(this, 0, retval);
int32 new_min_tribute = retval.size() > 0 ? static_cast<int32>(retval[0]) : 0;
uint32 new_zone = retval.size() > 1 ? static_cast<uint32>(retval[1]) : 0x1f;
int32 releasable = retval.size() > 2 ? (retval[2] < 0 ? 0xff00ff + static_cast<int32>(retval[2]) : static_cast<int32>(retval[2])) : 0xff00ff;
if(new_min_tribute < min_tribute)
new_min_tribute = min_tribute;
new_zone &= zone;
if(is_summonable(proc, new_min_tribute, new_zone, releasable))
Expand Down Expand Up @@ -2819,11 +2819,11 @@ int32 card::filter_set_procedure(uint8 playerid, effect_set* peset, uint8 ignore
effect_set extra_count;
filter_effect(EFFECT_EXTRA_SET_COUNT, &extra_count);
for(int32 i = 0; i < extra_count.size(); ++i) {
std::vector<int32> retval;
extra_count[i]->get_value(this, 0, &retval);
int32 new_min = retval.size() > 0 ? retval[0] : 0;
int32 new_zone = retval.size() > 1 ? retval[1] : 0x1f;
int32 releasable = retval.size() > 2 ? (retval[2] < 0 ? 0xff00ff + retval[2] : retval[2]) : 0xff00ff;
std::vector<lua_Integer> retval;
extra_count[i]->get_value(this, 0, retval);
int32 new_min = retval.size() > 0 ? static_cast<int32>(retval[0]) : 0;
uint32 new_zone = retval.size() > 1 ? static_cast<uint32>(retval[1]) : 0x1f;
int32 releasable = retval.size() > 2 ? (retval[2] < 0 ? 0xff00ff + static_cast<int32>(retval[2]) : static_cast<int32>(retval[2])) : 0xff00ff;
if(new_min < min)
new_min = min;
new_zone &= zone;
Expand All @@ -2849,12 +2849,12 @@ int32 card::check_set_procedure(effect* proc, uint8 playerid, uint8 ignore_count
effect_set eset;
filter_effect(EFFECT_EXTRA_SET_COUNT, &eset);
for(int32 i = 0; i < eset.size(); ++i) {
std::vector<int32> retval;
eset[i]->get_value(this, 0, &retval);
int32 new_min_tribute = retval.size() > 0 ? retval[0] : 0;
int32 new_zone = retval.size() > 1 ? retval[1] : 0x1f;
int32 releasable = retval.size() > 2 ? (retval[2] < 0 ? 0xff00ff + retval[2] : retval[2]) : 0xff00ff;
if(new_min_tribute < (int32)min_tribute)
std::vector<lua_Integer> retval;
eset[i]->get_value(this, 0, retval);
int32 new_min_tribute = retval.size() > 0 ? static_cast<int32>(retval[0]) : 0;
uint32 new_zone = retval.size() > 1 ? static_cast<uint32>(retval[1]) : 0x1f;
int32 releasable = retval.size() > 2 ? (retval[2] < 0 ? 0xff00ff + static_cast<int32>(retval[2]) : static_cast<int32>(retval[2])) : 0xff00ff;
if(new_min_tribute < min_tribute)
new_min_tribute = min_tribute;
new_zone &= zone;
if(is_summonable(proc, new_min_tribute, new_zone, releasable))
Expand Down Expand Up @@ -3395,10 +3395,10 @@ int32 card::get_summon_tribute_count() {
for(int32 i = 0; i < eset.size(); ++i) {
if(eset[i]->is_flag(EFFECT_FLAG_COUNT_LIMIT) && eset[i]->count_limit == 0)
continue;
std::vector<int32> retval;
eset[i]->get_value(this, 0, &retval);
int32 dec = retval.size() > 0 ? retval[0] : 0;
int32 effect_code = retval.size() > 1 ? retval[1] : 0;
std::vector<lua_Integer> retval;
eset[i]->get_value(this, 0, retval);
int32 dec = retval.size() > 0 ? static_cast<int32>(retval[0]) : 0;
int32 effect_code = retval.size() > 1 ? static_cast<int32>(retval[1]) : 0;
if(effect_code > 0) {
auto it = std::find(duplicate.begin(), duplicate.end(), effect_code);
if(it == duplicate.end())
Expand Down Expand Up @@ -3428,10 +3428,10 @@ int32 card::get_set_tribute_count() {
for(int32 i = 0; i < eset.size(); ++i) {
if(eset[i]->is_flag(EFFECT_FLAG_COUNT_LIMIT) && eset[i]->count_limit == 0)
continue;
std::vector<int32> retval;
eset[i]->get_value(this, 0, &retval);
int32 dec = retval.size() > 0 ? retval[0] : 0;
int32 effect_code = retval.size() > 1 ? retval[1] : 0;
std::vector<lua_Integer> retval;
eset[i]->get_value(this, 0, retval);
int32 dec = retval.size() > 0 ? static_cast<int32>(retval[0]) : 0;
int32 effect_code = retval.size() > 1 ? static_cast<int32>(retval[1]) : 0;
if(effect_code > 0) {
auto it = std::find(duplicate.begin(), duplicate.end(), effect_code);
if(it == duplicate.end())
Expand Down
12 changes: 6 additions & 6 deletions effect.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -722,33 +722,33 @@ int32 effect::get_value(effect* peffect, uint32 extraargs) {
return (int32)value;
}
}
void effect::get_value(uint32 extraargs, std::vector<int32>* result) {
void effect::get_value(uint32 extraargs, std::vector<lua_Integer>& result) {
if(is_flag(EFFECT_FLAG_FUNC_VALUE)) {
pduel->lua->add_param(this, PARAM_TYPE_EFFECT, TRUE);
pduel->lua->get_function_value(value, 1 + extraargs, result);
} else {
pduel->lua->params.clear();
result->push_back((int32)value);
result.push_back(value);
}
}
void effect::get_value(card* pcard, uint32 extraargs, std::vector<int32>* result) {
void effect::get_value(card* pcard, uint32 extraargs, std::vector<lua_Integer>& result) {
if(is_flag(EFFECT_FLAG_FUNC_VALUE)) {
pduel->lua->add_param(pcard, PARAM_TYPE_CARD, TRUE);
pduel->lua->add_param(this, PARAM_TYPE_EFFECT, TRUE);
pduel->lua->get_function_value(value, 2 + extraargs, result);
} else {
pduel->lua->params.clear();
result->push_back((int32)value);
result.push_back(value);
}
}
void effect::get_value(effect* peffect, uint32 extraargs, std::vector<int32>* result) {
void effect::get_value(effect* peffect, uint32 extraargs, std::vector<lua_Integer>& result) {
if(is_flag(EFFECT_FLAG_FUNC_VALUE)) {
pduel->lua->add_param(peffect, PARAM_TYPE_EFFECT, TRUE);
pduel->lua->add_param(this, PARAM_TYPE_EFFECT, TRUE);
pduel->lua->get_function_value(value, 2 + extraargs, result);
} else {
pduel->lua->params.clear();
result->push_back((int32)value);
result.push_back((int32)value);
}
}
int32 effect::get_integer_value() {
Expand Down
6 changes: 3 additions & 3 deletions effect.h
Original file line number Diff line number Diff line change
Expand Up @@ -98,9 +98,9 @@ class effect {
int32 get_value(uint32 extraargs = 0);
int32 get_value(card* pcard, uint32 extraargs = 0);
int32 get_value(effect* peffect, uint32 extraargs = 0);
void get_value(uint32 extraargs, std::vector<int32>* result);
void get_value(card* pcard, uint32 extraargs, std::vector<int32>* result);
void get_value(effect* peffect, uint32 extraargs, std::vector<int32>* result);
void get_value(uint32 extraargs, std::vector<lua_Integer>& result);
void get_value(card* pcard, uint32 extraargs, std::vector<lua_Integer>& result);
void get_value(effect* peffect, uint32 extraargs, std::vector<lua_Integer>& result);
int32 get_integer_value();
int32 check_value_condition(uint32 extraargs = 0);
void* get_label_object();
Expand Down
15 changes: 8 additions & 7 deletions interpreter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,9 @@ interpreter::interpreter(duel* pd): coroutines(256) {
interpreter::~interpreter() {
lua_close(lua_state);
}
int32 interpreter::register_card(card *pcard) {
void interpreter::register_card(card *pcard) {
if (!pcard)
return;
//create a card in by userdata
luaL_checkstack(lua_state, 1, nullptr);
card ** ppcard = (card**) lua_newuserdata(lua_state, sizeof(card*)); //+1 userdata
Expand All @@ -68,7 +70,6 @@ int32 interpreter::register_card(card *pcard) {
pcard->set_status(STATUS_INITIALIZING, FALSE);
}
pcard->cardid = pduel->game_field->infos.card_id++;
return OPERATION_SUCCESS;
}
void interpreter::register_effect(effect *peffect) {
if (!peffect)
Expand Down Expand Up @@ -501,7 +502,7 @@ int32 interpreter::get_function_value(int32 f, uint32 param_count) {
}
return OPERATION_FAIL;
}
int32 interpreter::get_function_value(int32 f, uint32 param_count, std::vector<int32>* result) {
int32 interpreter::get_function_value(int32 f, uint32 param_count, std::vector<lua_Integer>& result) {
int32 is_success = OPERATION_FAIL;
if(!f) {
params.clear();
Expand All @@ -513,14 +514,14 @@ int32 interpreter::get_function_value(int32 f, uint32 param_count, std::vector<i
if (call_function(f, param_count, LUA_MULTRET)) {
int32 stack_newtop = lua_gettop(current_state);
for (int32 index = stack_top + 1; index <= stack_newtop; ++index) {
int32 return_value = 0;
lua_Integer return_value = 0;
if(lua_isboolean(current_state, index))
return_value = lua_toboolean(current_state, index);
else if(lua_isinteger(current_state, index))
return_value = (int32)lua_tointeger(current_state, index);
return_value = lua_tointeger(current_state, index);
else
return_value = (int32)lua_tonumber(current_state, index);
result->push_back(return_value);
return_value = static_cast<lua_Integer>(lua_tonumber(current_state, index));
result.push_back(return_value);
}
lua_settop(current_state, stack_top);
is_success = OPERATION_SUCCESS;
Expand Down
4 changes: 2 additions & 2 deletions interpreter.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ class interpreter {
explicit interpreter(duel* pd);
~interpreter();

int32 register_card(card* pcard);
void register_card(card* pcard);
void register_effect(effect* peffect);
void unregister_effect(effect* peffect);
void register_group(group* pgroup);
Expand All @@ -74,7 +74,7 @@ class interpreter {
int32 check_filter(lua_State* L, card* pcard, int32 findex, int32 extraargs);
int32 get_operation_value(card* pcard, int32 findex, int32 extraargs);
int32 get_function_value(int32 f, uint32 param_count);
int32 get_function_value(int32 f, uint32 param_count, std::vector<int32>* result);
int32 get_function_value(int32 f, uint32 param_count, std::vector<lua_Integer>& result);
int32 call_coroutine(int32 f, uint32 param_count, int32* yield_value, uint16 step);
int32 clone_function_ref(int32 func_ref);
void* get_ref_object(int32 ref_handler);
Expand Down
Loading

0 comments on commit 16f2c36

Please sign in to comment.