pol-core/bscript/object.cpp | 43 +++++++++++++++++++++++++++++++++++++++++++ pol-core/bscript/objmethods.h | 3 ++- pol-core/bscript/parser.cpp | 3 ++- 3 files changed, 47 insertions(+), 2 deletions(-) diff --git a/pol-core/bscript/object.cpp b/pol-core/bscript/object.cpp index 5a0defe..c1ae52a 100644 --- a/pol-core/bscript/object.cpp +++ b/pol-core/bscript/object.cpp @@ -1569,6 +1569,49 @@ namespace Pol { return new BError( "array.randomentry() doesn't take parameters." ); } break; + case MTH_CYCLE: + if (name_arr.empty()) + { + long shift_by; + + if (ex.numParams() > 0) { + if (ex.getParam(0, shift_by) == false) { + ///cout << "false, shift_by=" << shift_by << endl; + shift_by = 1; + } + if (shift_by == 0) { + return new BLong(0); + } + } + else { + shift_by = 1; + } + + if (ref_arr.size() == 0) + return new BLong(0); + + long pick_idx = (shift_by > 0) ? (ref_arr.size() - 1) : 0; + long insert_idx = (shift_by > 0) ? 0 : (ref_arr.size() - 1); + + const BObjectRef& old_uobj_ref = ref_arr[pick_idx]; + + if (old_uobj_ref.get() == NULL) + return NULL; + + BObjectImp* old_uobj_ref_imp = old_uobj_ref.get()->impptr()->copy(); + ref_arr.erase(ref_arr.begin() + pick_idx); + + //cout << "shift_by:" << shift_by << ", pick_idx: " << pick_idx << ", insert_idx: " << insert_idx << endl; + + BObjectRef tmp; + ref_arr.insert(ref_arr.begin() + insert_idx, tmp); + + BObjectRef& ref = ref_arr[insert_idx]; + ref.set(new BObject(old_uobj_ref_imp)); + + return new BLong(1); + } + break; default: return NULL; diff --git a/pol-core/bscript/objmethods.h b/pol-core/bscript/objmethods.h index a2d2c22..b26fc2d 100644 --- a/pol-core/bscript/objmethods.h +++ b/pol-core/bscript/objmethods.h @@ -171,7 +171,8 @@ namespace Pol { MTH_UPPER, MTH_LOWER, //145 MTH_FORMAT, - MTH_DISABLE_SKILLS_FOR + MTH_DISABLE_SKILLS_FOR, + MTH_CYCLE, }; diff --git a/pol-core/bscript/parser.cpp b/pol-core/bscript/parser.cpp index 69855fa..f41d67c 100644 --- a/pol-core/bscript/parser.cpp +++ b/pol-core/bscript/parser.cpp @@ -655,7 +655,8 @@ namespace Pol { { MTH_UPPER, "upper" }, { MTH_LOWER, "lower" }, //145 { MTH_FORMAT, "format" }, - { MTH_DISABLE_SKILLS_FOR, "disableskillsfor" } + { MTH_DISABLE_SKILLS_FOR, "disableskillsfor" }, + { MTH_CYCLE, "cycle" } }; int n_objmethods = sizeof object_methods / sizeof object_methods[0]; ObjMethod* getKnownObjMethod( const char* token )