ironsphererpg/scripts/rpgarray.cs
Jusctsch5 a5143b67f7 T2RPG: Initial commit of ironsphererpg directory
Taking everything obtained from http://ironsphererpg2.webs.com/ and dumping it in a git repo
2015-01-18 21:06:06 -06:00

509 lines
14 KiB
C#

//======================================= ARRAYS ======================================
// Written by JeremyIrons for IronSphere
// March 07 2002
// -Requires an isnumeric function
//=====================================================================================
//
// Tribes2 CS code does not properly support arrays, and so I've coded a "hack" to store data
// in SimSets and emulating array functionality.
// Every support function supports the key => value system (see PHP), but when specifying keys
// and values, the => must be an argument by itself enclosed by quotes.
//
// Example:
// array("test", "hello", "there", "mykey", "=>", "myvalue", "everyone");
//
// This will create the global variable $test and the equivalent in PHP would be:
// $test = array("hello", "there", "mykey" => "myvalue", "everyone");
//
// For a hack, it's not that far off. I've written a bunch of useful support functions, which
// are listed below. They attempt to emulate their PHP counterparts. For more details on their
// functionality, visit http://www.php.net/
//
// To access the value of an array, you must access the array as if it were an object. The
// parameter will be the key with an underscore in front of it:
//
// Example:
// array("test", "hello", "there", "mykey", "=>", "myvalue", "everyone");
// echo($test._0);
// echo($test._1);
// echo($test._mykey);
// echo($test._2);
//
// will display:
//
// hello
// there
// myvalue
// everyone
//
// Unfortunately we can't place a variable in the place of _0, _1, etc. such as $test.%k
// Instead you will need to use the array_get_value_at function, like in this example:
//
// array("myarray", "hello", "there", "mykey", "=>", "myvalue", "everyone");
// %k = "mykey";
// echo($myarray.array_get_value_at(%k));
//
// Notice that you did not need to specify the underscore.
//=====================================================================================
// SUPPORT FUNCTIONS:
//=====================================================================================
//
// array(%arrayname, %arg1, %arg2, %arg3, etc)
// explode(%arrayname, %string, %delimiter, optional %limit)
// %x = array.implode(%glue);
// split = explode
// join = implode
// array_reset()
// array_end()
// array_next()
// array_prev()
// array_current()
// array_count()
// array_sizeof() = array_count
// is_array()
// array_get_key()
// array_get_value()
// array_get_key_at_index(%index)
// array_get_value_at_index(%index)
// array_get_value_at(%key)
// array_key_exists(%key)
// in_array(%value)
// array_search(%value)
// array_pop(%newarrayname)
// array_push(%newarrayname, %arg1, %arg2, %arg3, etc)
// array_shift(%newarrayname)
// array_unshift(%newarrayname, %arg1, %arg2, %arg3, etc)
// array_sum()
//
//=====================================================================================
$array_debug = true;
//%a0, %a1, %a2, %a3, %a4, %a5, %a6, %a7, %a8, %a9, %a10, %a11, %a12, %a13, %a14, %a15, %a16, %a17, %a18, %a19, %a20, %a21, %a22, %a23, %a24, %a25, %a26, %a27, %a28, %a29, %a30, %a31, %a32, %a33, %a34, %a35, %a36, %a37, %a38, %a39, %a40, %a41, %a42, %a43, %a44, %a45, %a46, %a47, %a48, %a49, %a50
function array(%arrname, %a0, %a1, %a2, %a3, %a4, %a5, %a6, %a7, %a8, %a9, %a10, %a11, %a12, %a13, %a14, %a15, %a16, %a17, %a18, %a19, %a20, %a21, %a22, %a23, %a24, %a25, %a26, %a27, %a28, %a29, %a30, %a31, %a32, %a33, %a34, %a35, %a36, %a37, %a38, %a39, %a40, %a41, %a42, %a43, %a44, %a45, %a46, %a47, %a48, %a49, %a50)
{
_array(%arrname, %a0, %a1, %a2, %a3, %a4, %a5, %a6, %a7, %a8, %a9, %a10, %a11, %a12, %a13, %a14, %a15, %a16, %a17, %a18, %a19, %a20, %a21, %a22, %a23, %a24, %a25, %a26, %a27, %a28, %a29, %a30, %a31, %a32, %a33, %a34, %a35, %a36, %a37, %a38, %a39, %a40, %a41, %a42, %a43, %a44, %a45, %a46, %a47, %a48, %a49, %a50);
}
function _array(%arrname, %a0, %a1, %a2, %a3, %a4, %a5, %a6, %a7, %a8, %a9, %a10, %a11, %a12, %a13, %a14, %a15, %a16, %a17, %a18, %a19, %a20, %a21, %a22, %a23, %a24, %a25, %a26, %a27, %a28, %a29, %a30, %a31, %a32, %a33, %a34, %a35, %a36, %a37, %a38, %a39, %a40, %a41, %a42, %a43, %a44, %a45, %a46, %a47, %a48, %a49, %a50)
{
%key = "";
%j = 0;
%count = 0; //indicates the actual amount of key => value combinations
eval("if(isObject($" @ %arrname @ ")){$" @ %arrname @ ".delete();}");
%sb = "$" @ %arrname @ " = new SimSet(){";
for(%i = 0; %i <= 50; %i++)
{
eval("%arg = %a" @ %i @ ";");
eval("%nextarg = %a" @ (%i+1) @ ";");
if(%arg $= "")
break;
if(%nextarg $= "=>")
{
%key = %arg;
%i++;
}
else
{
if(%key !$= "" && !isnumeric(%key))
{
%k = "_" @ %key;
}
else
{
if(%key !$= "")
%j = %key;
%k = "_" @ %j;
%j++;
}
%key = "";
%sb = %sb @ %k @ " = \"" @ %arg @ "\";";
%sb = %sb @ "__internal_key" @ %count @ " = \"" @ %k @ "\";";
%sb = %sb @ "__internal_value" @ %count @ " = \"" @ %arg @ "\";";
%count++;
}
}
%sb = %sb @ "__internal_pointer = 0;";
%sb = %sb @ "__internal_count = " @ (%count-1) @ ";";
%sb = %sb @ "};";
if($array_debug) echo(%sb);
eval(%sb);
}
function SimSet::implode(%this, %glue)
{
%flag = 0;
%g = "";
%this.array_reset();
while((%val = %this.array_get_value()) !$= false)
{
if(%flag $= 1)
%g = %glue;
%flag++;
%stick = %stick @ %g @ %val;
}
return %stick;
}
function explode(%arrname, %string, %delimiter, %limit)
{
%sb = "array(\"" @ %arrname @ "\"";
%tstr = %string @ %delimiter;
%lpos = 0;
while((%pos = strpos(%tstr, %delimiter)) !$= -1)
{
%chunk = getsubstr(%tstr, %lpos, (%pos - %lpos));
%tstr = getsubstr(%tstr, %pos + strlen(%delimiter), 999999);
%sb = %sb @ ", \"" @ %chunk @ "\"";
if(%limit !$= "")
{
%count++;
if(%count >= %limit)
break;
}
}
%sb = %sb @ ");";
eval(%sb);
}
function SimSet::join(%this, %glue)
{
//same as implode
return %this.implode(%glue);
}
function split(%newarrname, %string, %delimiter, %limit)
{
//same as explode
explode(%newarrname, %string, %delimiter, %limit);
}
function SimSet::array_reset(%this)
{
%this.__internal_pointer = 0;
return true;
}
function SimSet::array_end(%this)
{
%this.__internal_pointer = %this.__internal_count;
return true;
}
function SimSet::array_next(%this)
{
if(%this.__internal_pointer <= %this.__internal_count)
{
%this.__internal_pointer++;
return true;
}
else
return false;
}
function SimSet::array_prev(%this)
{
if(%this.__internal_pointer > 0)
{
%this.__internal_pointer--;
return true;
}
else
return false;
}
function SimSet::array_current(%this)
{
return %this.__internal_pointer;
}
function SimSet::array_count(%this)
{
return %this.__internal_count;
}
function SimSet::array_sizeof(%this)
{
//same as array_count
return %this.array_count();
}
function SimSet::is_array(%this)
{
if(%this.__internal_count !$= "")
return true;
else
return false;
}
function SimSet::array_get_key(%this)
{
if(%this.__internal_pointer > %this.__internal_count)
return false;
//gets the key at the current array pointer and moves the pointer forward
%key = %this.array_get_key_at_index(%this.__internal_pointer);
%this.array_next();
return %key;
}
function SimSet::array_get_value(%this)
{
if(%this.__internal_pointer > %this.__internal_count)
return false;
//gets the value at the current array pointer and moves the pointer forward
%val = %this.array_get_value_at_index(%this.__internal_pointer);
%this.array_next();
return %val;
}
function SimSet::array_get_key_at_index(%this, %index)
{
if(%index > %this.__internal_count)
return false;
eval("%key = %this.__internal_key" @ %index @ ";");
return getsubstr(%key, 1, 999999);
}
function SimSet::array_get_value_at_index(%this, %index)
{
if(%index > %this.__internal_count)
return false;
eval("%val = %this.__internal_value" @ %index @ ";");
return %val;
}
function SimSet::array_get_value_at(%this, %key)
{
eval("%val = %this._" @ %key @ ";");
return %val;
}
function SimSet::array_key_exists(%this, %keyfind)
{
for(%i = 0; %i <= %this.__internal_count; %i++)
{
%key = %this.array_get_key_at_index(%i);
if(%key $= %keyfind)
return true;
}
return false;
}
function SimSet::in_array(%this, %valfind)
{
for(%i = 0; %i <= %this.__internal_count; %i++)
{
%val = %this.array_get_value_at_index(%i);
if(%val $= %valfind)
return true;
}
return false;
}
function SimSet::array_search(%this, %valfind)
{
for(%i = 0; %i <= %this.__internal_count; %i++)
{
%val = %this.array_get_value_at_index(%i);
if(%val $= %valfind)
{
%key = %this.array_get_key_at_index(%i);
return %key;
}
}
return false;
}
//WARNING: echo'ing the result of this function crashes T2. No idea why.
function SimSet::array_pop(%this, %newarrname)
{
%ret = %this.array_get_value_at_index(%this.__internal_count);
%sb = "array(\"" @ %newarrname @ "\"";
//rebuild array with the last element removed
for(%i = 0; %i < %this.__internal_count; %i++)
{
%key = %this.array_get_key_at_index(%i);
%value = %this.array_get_value_at_index(%i);
%sb = %sb @ ", \"" @ %key @ "\", \"=>\", \"" @ %value @ "\"";
}
%sb = %sb @ ");";
if($array_debug) echo(%sb);
eval(%sb);
return %ret;
}
function SimSet::array_push(%this, %newarrname, %a0, %a1, %a2, %a3, %a4, %a5, %a6, %a7, %a8, %a9, %a10, %a11, %a12, %a13, %a14, %a15, %a16, %a17, %a18, %a19, %a20, %a21, %a22, %a23, %a24, %a25, %a26, %a27, %a28, %a29, %a30, %a31, %a32, %a33, %a34, %a35, %a36, %a37, %a38, %a39, %a40, %a41, %a42, %a43, %a44, %a45, %a46, %a47, %a48, %a49, %a50)
{
%this._array_push(%newarrname, %a0, %a1, %a2, %a3, %a4, %a5, %a6, %a7, %a8, %a9, %a10, %a11, %a12, %a13, %a14, %a15, %a16, %a17, %a18, %a19, %a20, %a21, %a22, %a23, %a24, %a25, %a26, %a27, %a28, %a29, %a30, %a31, %a32, %a33, %a34, %a35, %a36, %a37, %a38, %a39, %a40, %a41, %a42, %a43, %a44, %a45, %a46, %a47, %a48, %a49, %a50);
}
function SimSet::_array_push(%this, %newarrname, %a0, %a1, %a2, %a3, %a4, %a5, %a6, %a7, %a8, %a9, %a10, %a11, %a12, %a13, %a14, %a15, %a16, %a17, %a18, %a19, %a20, %a21, %a22, %a23, %a24, %a25, %a26, %a27, %a28, %a29, %a30, %a31, %a32, %a33, %a34, %a35, %a36, %a37, %a38, %a39, %a40, %a41, %a42, %a43, %a44, %a45, %a46, %a47, %a48, %a49, %a50)
{
%sb = "array(\"" @ %newarrname @ "\"";
//get contents of current array
for(%i = 0; %i < %this.__internal_count; %i++)
{
%key = %this.array_get_key_at_index(%i);
%value = %this.array_get_value_at_index(%i);
%sb = %sb @ ", \"" @ %key @ "\", \"=>\", \"" @ %value @ "\"";
}
%j = 0;
%key = "";
for(%i = 0; %i <= 50; %i++)
{
eval("%arg = %a" @ %i @ ";");
eval("%nextarg = %a" @ (%i+1) @ ";");
if(%arg $= "")
break;
if(%nextarg $= "=>")
{
%key = %arg;
%i++;
}
else
{
if(%key !$= "")
{
%k = %key;
%key = "";
}
else
%k = "";
if(%k $= "")
%sb = %sb @ ", \"" @ %arg @ "\"";
else
%sb = %sb @ ", \"" @ %k @ "\", \"=>\", \"" @ %arg @ "\"";
}
}
%sb = %sb @ ");";
if($array_debug) echo(%sb);
eval(%sb);
}
//WARNING: echo'ing the result of this function crashes T2. No idea why.
function SimSet::array_shift(%this, %newarrname)
{
%ret = %this.array_get_value_at_index(0);
%sb = "array(\"" @ %newarrname @ "\"";
//rebuild array with the last element removed
for(%i = 1; %i <= %this.__internal_count; %i++)
{
%key = %this.array_get_key_at_index(%i);
%value = %this.array_get_value_at_index(%i);
%sb = %sb @ ", \"" @ %key @ "\", \"=>\", \"" @ %value @ "\"";
}
%sb = %sb @ ");";
if($array_debug) echo(%sb);
eval(%sb);
return %ret;
}
function SimSet::array_unshift(%this, %newarrname, %a0, %a1, %a2, %a3, %a4, %a5, %a6, %a7, %a8, %a9, %a10, %a11, %a12, %a13, %a14, %a15, %a16, %a17, %a18, %a19, %a20, %a21, %a22, %a23, %a24, %a25, %a26, %a27, %a28, %a29, %a30, %a31, %a32, %a33, %a34, %a35, %a36, %a37, %a38, %a39, %a40, %a41, %a42, %a43, %a44, %a45, %a46, %a47, %a48, %a49, %a50)
{
%this._array_unshift(%newarrname, %a0, %a1, %a2, %a3, %a4, %a5, %a6, %a7, %a8, %a9, %a10, %a11, %a12, %a13, %a14, %a15, %a16, %a17, %a18, %a19, %a20, %a21, %a22, %a23, %a24, %a25, %a26, %a27, %a28, %a29, %a30, %a31, %a32, %a33, %a34, %a35, %a36, %a37, %a38, %a39, %a40, %a41, %a42, %a43, %a44, %a45, %a46, %a47, %a48, %a49, %a50);
}
function SimSet::_array_unshift(%this, %newarrname, %a0, %a1, %a2, %a3, %a4, %a5, %a6, %a7, %a8, %a9, %a10, %a11, %a12, %a13, %a14, %a15, %a16, %a17, %a18, %a19, %a20, %a21, %a22, %a23, %a24, %a25, %a26, %a27, %a28, %a29, %a30, %a31, %a32, %a33, %a34, %a35, %a36, %a37, %a38, %a39, %a40, %a41, %a42, %a43, %a44, %a45, %a46, %a47, %a48, %a49, %a50)
{
%sb = "array(\"" @ %newarrname @ "\"";
//build new part of array
%j = 0;
%key = "";
for(%i = 0; %i <= 50; %i++)
{
eval("%arg = %a" @ %i @ ";");
eval("%nextarg = %a" @ (%i+1) @ ";");
if(%arg $= "")
break;
if(%nextarg $= "=>")
{
%key = %arg;
%i++;
}
else
{
if(%key !$= "")
{
%k = %key;
%key = "";
}
else
%k = "";
if(%k $= "")
%sb = %sb @ ", \"" @ %arg @ "\"";
else
%sb = %sb @ ", \"" @ %k @ "\", \"=>\", \"" @ %arg @ "\"";
}
}
//get contents of current array
for(%i = 0; %i < %this.__internal_count; %i++)
{
%key = %this.array_get_key_at_index(%i);
%value = %this.array_get_value_at_index(%i);
%sb = %sb @ ", \"" @ %key @ "\", \"=>\", \"" @ %value @ "\"";
}
%sb = %sb @ ");";
if($array_debug) echo(%sb);
eval(%sb);
}
function SimSet::array_sum(%this)
{
%total = 0;
for(%i = 0; %i <= %this.__internal_count; %i++)
%total += %this.array_get_value_at_index(%i);
return %total;
}
function SimSet::test(%this, %tmp)
{
%this.array_reset();
while((%val = %this.array_get_value()) !$= false)
{
echo("val: " @ %val);
}
%r = %this.array_search(%tmp);
echo("array_search(" @ %tmp @ "): " @ %r);
echo(%this.array_get_value_at(%r));
}
if($array_debug) array("test", "hello", "there", "mykey", "=>", "myvalue", "everyone");