Commit cf32e53e authored by DailyShana's avatar DailyShana

update effect label object

parent c6f757aa
...@@ -672,6 +672,9 @@ int32 effect::check_value_condition(uint32 extraargs) { ...@@ -672,6 +672,9 @@ int32 effect::check_value_condition(uint32 extraargs) {
return (int32)value; return (int32)value;
} }
} }
void* effect::get_label_object() {
return pduel->lua->get_ref_object(label_object);
}
int32 effect::get_speed() { int32 effect::get_speed() {
if(!(type & EFFECT_TYPE_ACTIONS)) if(!(type & EFFECT_TYPE_ACTIONS))
return 0; return 0;
......
...@@ -55,7 +55,7 @@ public: ...@@ -55,7 +55,7 @@ public:
card* active_handler; card* active_handler;
uint16 status; uint16 status;
uint32 label; uint32 label;
void* label_object; int32 label_object;
int32 condition; int32 condition;
int32 cost; int32 cost;
int32 target; int32 target;
...@@ -90,6 +90,7 @@ public: ...@@ -90,6 +90,7 @@ public:
void get_value(card* pcard, 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(effect* peffect, uint32 extraargs, std::vector<int32>* result);
int32 check_value_condition(uint32 extraargs = 0); int32 check_value_condition(uint32 extraargs = 0);
void* get_label_object();
int32 get_speed(); int32 get_speed();
effect* clone(); effect* clone();
card* get_owner() const; card* get_owner() const;
......
...@@ -2028,7 +2028,7 @@ int32 field::adjust_grant_effect() { ...@@ -2028,7 +2028,7 @@ int32 field::adjust_grant_effect() {
} }
for(auto cit = add_set.begin(); cit != add_set.end(); ++cit) { for(auto cit = add_set.begin(); cit != add_set.end(); ++cit) {
card* pcard = *cit; card* pcard = *cit;
effect* geffect = (effect*)peffect->label_object; effect* geffect = (effect*)peffect->get_label_object();
effect* ceffect = geffect->clone(); effect* ceffect = geffect->clone();
ceffect->owner = pcard; ceffect->owner = pcard;
pcard->add_effect(ceffect); pcard->add_effect(ceffect);
......
...@@ -1175,6 +1175,14 @@ int32 interpreter::clone_function_ref(int32 func_ref) { ...@@ -1175,6 +1175,14 @@ int32 interpreter::clone_function_ref(int32 func_ref) {
int32 ref = luaL_ref(current_state, LUA_REGISTRYINDEX); int32 ref = luaL_ref(current_state, LUA_REGISTRYINDEX);
return ref; return ref;
} }
void* interpreter::get_ref_object(int32 ref_handler) {
if(ref_handler == 0)
return nullptr;
lua_rawgeti(current_state, LUA_REGISTRYINDEX, ref_handler);
void* p = *(void**)lua_touserdata(current_state, -1);
lua_pop(current_state, 1);
return p;
}
//Convert a pointer to a lua value, +1 -0 //Convert a pointer to a lua value, +1 -0
void interpreter::card2value(lua_State* L, card* pcard) { void interpreter::card2value(lua_State* L, card* pcard) {
if (!pcard || pcard->ref_handle == 0) if (!pcard || pcard->ref_handle == 0)
......
...@@ -69,6 +69,7 @@ public: ...@@ -69,6 +69,7 @@ public:
int32 get_function_value(int32 f, uint32 param_count, std::vector<int32>* result); int32 get_function_value(int32 f, uint32 param_count, std::vector<int32>* result);
int32 call_coroutine(int32 f, uint32 param_count, uint32* yield_value, uint16 step); int32 call_coroutine(int32 f, uint32 param_count, uint32* yield_value, uint16 step);
int32 clone_function_ref(int32 func_ref); int32 clone_function_ref(int32 func_ref);
void* get_ref_object(int32 ref_handler);
static void card2value(lua_State* L, card* pcard); static void card2value(lua_State* L, card* pcard);
static void group2value(lua_State* L, group* pgroup); static void group2value(lua_State* L, group* pgroup);
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include "field.h" #include "field.h"
#include "card.h" #include "card.h"
#include "effect.h" #include "effect.h"
#include "group.h"
int32 scriptlib::effect_new(lua_State *L) { int32 scriptlib::effect_new(lua_State *L) {
check_param_count(L, 1); check_param_count(L, 1);
...@@ -186,10 +187,17 @@ int32 scriptlib::effect_set_label_object(lua_State *L) { ...@@ -186,10 +187,17 @@ int32 scriptlib::effect_set_label_object(lua_State *L) {
peffect->label_object = 0; peffect->label_object = 0;
return 0; return 0;
} }
if(!lua_isuserdata(L, 2)) if(check_param(L, PARAM_TYPE_CARD, 2, TRUE)) {
card* p = *(card**)lua_touserdata(L, 2);
peffect->label_object = p->ref_handle;
} else if(check_param(L, PARAM_TYPE_EFFECT, 2, TRUE)) {
effect* p = *(effect**)lua_touserdata(L, 2);
peffect->label_object = p->ref_handle;
} else if(check_param(L, PARAM_TYPE_GROUP, 2, TRUE)) {
group* p = *(group**)lua_touserdata(L, 2);
peffect->label_object = p->ref_handle;
} else
luaL_error(L, "Parameter 2 should be \"Card\" or \"Effect\" or \"Group\"."); luaL_error(L, "Parameter 2 should be \"Card\" or \"Effect\" or \"Group\".");
void* p = *(void**)lua_touserdata(L, 2);
peffect->label_object = p;
return 0; return 0;
} }
int32 scriptlib::effect_set_category(lua_State *L) { int32 scriptlib::effect_set_category(lua_State *L) {
...@@ -342,15 +350,14 @@ int32 scriptlib::effect_get_label_object(lua_State *L) { ...@@ -342,15 +350,14 @@ int32 scriptlib::effect_get_label_object(lua_State *L) {
lua_pushnil(L); lua_pushnil(L);
return 1; return 1;
} }
int32 type = *(int32*)peffect->label_object; lua_rawgeti(L, LUA_REGISTRYINDEX, peffect->label_object);
if(type == 1) if(lua_isuserdata(L, -1))
interpreter::card2value(L, (card*)peffect->label_object); return 1;
else if(type == 2) else {
interpreter::group2value(L, (group*)peffect->label_object); lua_pop(L, 1);
else if(type == 3) lua_pushnil(L);
interpreter::effect2value(L, (effect*)peffect->label_object); return 1;
else lua_pushnil(L); }
return 1;
} }
int32 scriptlib::effect_get_category(lua_State *L) { int32 scriptlib::effect_get_category(lua_State *L) {
check_param_count(L, 1); check_param_count(L, 1);
......
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