Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions engine/source/openborscript/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,10 @@ HRESULT math_pow(ScriptVariant **varlist , ScriptVariant **pretvar, int paramCou
HRESULT math_asin(ScriptVariant **varlist , ScriptVariant **pretvar, int paramCount);
HRESULT math_acos(ScriptVariant **varlist , ScriptVariant **pretvar, int paramCount);
HRESULT math_atan(ScriptVariant **varlist , ScriptVariant **pretvar, int paramCount);
HRESULT math_atan2(ScriptVariant **varlist , ScriptVariant **pretvar, int paramCount);
HRESULT math_angle(ScriptVariant **varlist , ScriptVariant **pretvar, int paramCount);
HRESULT math_ceil(ScriptVariant **varlist , ScriptVariant **pretvar, int paramCount);
HRESULT math_floor(ScriptVariant **varlist , ScriptVariant **pretvar, int paramCount);
HRESULT math_trunc(ScriptVariant **varlist , ScriptVariant **pretvar, int paramCount);
HRESULT math_round(ScriptVariant **varlist , ScriptVariant **pretvar, int paramCount);

Expand Down
12 changes: 12 additions & 0 deletions engine/source/openborscript/index.c
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,10 @@ const char *Script_GetFunctionName(void *functionRef)
{
return "atan";
}
else if (functionRef == ((void *)math_atan2))
{
return "atan2";
}
else if (functionRef == ((void *)math_trunc))
{
return "trunc";
Expand Down Expand Up @@ -1218,6 +1222,14 @@ void Script_LoadSystemFunctions()
(void *)math_acos, "acos");
List_InsertAfter(&theFunctionList,
(void *)math_atan, "atan");
List_InsertAfter(&theFunctionList,
(void *)math_atan2, "atan2");
List_InsertAfter(&theFunctionList,
(void *)math_angle, "angle");
List_InsertAfter(&theFunctionList,
(void *)math_ceil, "ceil");
List_InsertAfter(&theFunctionList,
(void *)math_floor, "floor");
List_InsertAfter(&theFunctionList,
(void *)math_trunc, "trunc");
List_InsertAfter(&theFunctionList,
Expand Down
120 changes: 120 additions & 0 deletions engine/source/openborscript/math.c
Original file line number Diff line number Diff line change
Expand Up @@ -470,6 +470,126 @@ HRESULT math_atan(ScriptVariant **varlist , ScriptVariant **pretvar, int paramCo
return E_FAIL;
}

/*
* Caskey, Damon V.
* 2026-06-08
*
* Get arctangent of Y/X as a decimal degree.
*/
HRESULT math_atan2(ScriptVariant **varlist, ScriptVariant **pretvar, int paramCount)
{
DOUBLE y_temp;
DOUBLE x_temp;

if (ScriptVariant_DecimalValue(varlist[0], &y_temp) == S_OK &&
ScriptVariant_DecimalValue(varlist[1], &x_temp) == S_OK) {

ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);

(*pretvar)->dblVal = (DOUBLE)(atan2((double)y_temp, (double)x_temp) * 180.0 / MATH_PI);

return S_OK;
}

*pretvar = NULL;
return E_FAIL;
}

/*
* Caskey, Damon V.
* 2026-06-08
*
* Get direction angle of Y/X as a decimal degree
* normalized to [0, 360).
*/
HRESULT math_angle(ScriptVariant **varlist, ScriptVariant **pretvar, int paramCount)
{
DOUBLE y;
DOUBLE x;
DOUBLE degrees;

if (ScriptVariant_DecimalValue(varlist[0], &y) == S_OK &&
ScriptVariant_DecimalValue(varlist[1], &x) == S_OK)
{
degrees = (DOUBLE)(atan2((double)y, (double)x) * 180.0 / MATH_PI);

if (degrees < 0.0) {
degrees += 360.0;
}

ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
(*pretvar)->dblVal = degrees;
return S_OK;
}

*pretvar = NULL;
return E_FAIL;
}

/*
* Caskey, Damon V.
* 2026-06-08
*
* Get floor value of a variant as an integer.
* Preserves integer carriers and promotes decimal
* results to 64-bit integer carriers when needed.
*/
HRESULT math_floor(ScriptVariant **varlist, ScriptVariant **pretvar, int paramCount)
{
DOUBLE dbltemp;

switch (varlist[0]->vt) {
case VT_INTEGER:
case VT_INTEGER64:
case VT_UINTEGER64:
ScriptVariant_Copy(*pretvar, varlist[0]);
return S_OK;

default:
break;
}

if (ScriptVariant_DecimalValue(varlist[0], &dbltemp) == S_OK &&
math_set_truncated_integer(*pretvar, (DOUBLE)floor((double)dbltemp)) == S_OK) {
return S_OK;
}

*pretvar = NULL;
return E_FAIL;
}

/*
* Caskey, Damon V.
* 2026-06-08
*
* Get ceiling value of a variant as an integer.
* Preserves integer carriers and promotes decimal
* results to 64-bit integer carriers when needed.
*/
HRESULT math_ceil(ScriptVariant **varlist, ScriptVariant **pretvar, int paramCount)
{
DOUBLE dbltemp;

switch (varlist[0]->vt) {
case VT_INTEGER:
case VT_INTEGER64:
case VT_UINTEGER64:
ScriptVariant_Copy(*pretvar, varlist[0]);
return S_OK;

default:
break;
}

if (ScriptVariant_DecimalValue(varlist[0], &dbltemp) == S_OK &&
math_set_truncated_integer(*pretvar, (DOUBLE)ceil((double)dbltemp)) == S_OK) {
return S_OK;
}

*pretvar = NULL;
return E_FAIL;
}

/*
* Caskey, Damon V.
* 2026-06-08
Expand Down
Loading
Loading