1 /*
2 * OpenBOR - http://www.chronocrash.com
3 * -----------------------------------------------------------------------
4 * All rights reserved. See LICENSE in OpenBOR root for license details.
5 *
6 * Copyright (c) 2004 - 2017 OpenBOR Team
7 */
8
9 // Math
10 // 2017-04-26
11 // Caskey, Damon V.
12 //
13 // Mathematical operations. Ordinal functions
14 // written by White Dragon.
15
16 #include "scriptcommon.h"
17
math_sin(ScriptVariant ** varlist,ScriptVariant ** pretvar,int paramCount)18 HRESULT math_sin(ScriptVariant **varlist , ScriptVariant **pretvar, int paramCount)
19 {
20 LONG ltemp;
21 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[0], <emp)))
22 {
23 ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
24 (*pretvar)->dblVal = sin_table[(ltemp % 360 + 360) % 360];
25 return S_OK;
26 }
27 *pretvar = NULL;
28 return E_FAIL;
29 }
30
math_cos(ScriptVariant ** varlist,ScriptVariant ** pretvar,int paramCount)31 HRESULT math_cos(ScriptVariant **varlist , ScriptVariant **pretvar, int paramCount)
32 {
33 LONG ltemp;
34 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[0], <emp)))
35 {
36 ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
37 (*pretvar)->dblVal = cos_table[(ltemp % 360 + 360) % 360];
38 return S_OK;
39 }
40 *pretvar = NULL;
41 return E_FAIL;
42 }
43
math_ssin(ScriptVariant ** varlist,ScriptVariant ** pretvar,int paramCount)44 HRESULT math_ssin(ScriptVariant **varlist , ScriptVariant **pretvar, int paramCount)
45 {
46 DOUBLE dbltemp;
47
48 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[0], &dbltemp)))
49 {
50 double PI = 3.14159265;
51
52 ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
53 (*pretvar)->dblVal = (DOUBLE)sin(dbltemp*PI/180.0);
54 return S_OK;
55 }
56 *pretvar = NULL;
57 return E_FAIL;
58 }
59
math_scos(ScriptVariant ** varlist,ScriptVariant ** pretvar,int paramCount)60 HRESULT math_scos(ScriptVariant **varlist , ScriptVariant **pretvar, int paramCount)
61 {
62 DOUBLE dbltemp;
63
64 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[0], &dbltemp)))
65 {
66 double PI = 3.14159265;
67
68 ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
69 (*pretvar)->dblVal = (DOUBLE)cos(dbltemp*PI/180.0);
70 return S_OK;
71 }
72 *pretvar = NULL;
73 return E_FAIL;
74 }
75
math_sqrt(ScriptVariant ** varlist,ScriptVariant ** pretvar,int paramCount)76 HRESULT math_sqrt(ScriptVariant **varlist , ScriptVariant **pretvar, int paramCount)
77 {
78 DOUBLE dbltemp;
79 float inv;
80
81 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[0], &dbltemp)))
82 {
83 ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
84 inv = invsqrt((float)dbltemp);
85 assert(inv != 0.0f);
86 (*pretvar)->dblVal = (DOUBLE)1.0 / inv;
87 return S_OK;
88 }
89 *pretvar = NULL;
90
91 return E_FAIL;
92 }
93
math_pow(ScriptVariant ** varlist,ScriptVariant ** pretvar,int paramCount)94 HRESULT math_pow(ScriptVariant **varlist , ScriptVariant **pretvar, int paramCount)
95 {
96 DOUBLE dbltempA, dbltempB;
97
98 if( SUCCEEDED(ScriptVariant_DecimalValue(varlist[0], &dbltempA)) && SUCCEEDED(ScriptVariant_DecimalValue(varlist[1], &dbltempB)) )
99 {
100 ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
101 (*pretvar)->dblVal = pow((double)dbltempA,(double)dbltempB);
102 return S_OK;
103 }
104 *pretvar = NULL;
105 return E_FAIL;
106 }
107
math_asin(ScriptVariant ** varlist,ScriptVariant ** pretvar,int paramCount)108 HRESULT math_asin(ScriptVariant **varlist , ScriptVariant **pretvar, int paramCount)
109 {
110 DOUBLE dbltemp;
111
112 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[0], &dbltemp)))
113 {
114 double PI = 3.14159265;
115
116 ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
117 (*pretvar)->dblVal = (DOUBLE)(asin((double)dbltemp) * 180.0 / PI);
118 return S_OK;
119 }
120 *pretvar = NULL;
121 return E_FAIL;
122 }
123
math_acos(ScriptVariant ** varlist,ScriptVariant ** pretvar,int paramCount)124 HRESULT math_acos(ScriptVariant **varlist , ScriptVariant **pretvar, int paramCount)
125 {
126 DOUBLE dbltemp;
127
128 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[0], &dbltemp)))
129 {
130 double PI = 3.14159265;
131
132 ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
133 (*pretvar)->dblVal = (DOUBLE)(aacos((double)dbltemp) * 180.0 / PI);
134 return S_OK;
135 }
136 *pretvar = NULL;
137 return E_FAIL;
138 }
139
math_atan(ScriptVariant ** varlist,ScriptVariant ** pretvar,int paramCount)140 HRESULT math_atan(ScriptVariant **varlist , ScriptVariant **pretvar, int paramCount)
141 {
142 DOUBLE dbltemp;
143
144 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[0], &dbltemp)))
145 {
146 double PI = 3.14159265;
147
148 ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
149 (*pretvar)->dblVal = (DOUBLE)(aatan((double)dbltemp) * 180.0 / PI);
150 return S_OK;
151 }
152 *pretvar = NULL;
153 return E_FAIL;
154 }
155
math_trunc(ScriptVariant ** varlist,ScriptVariant ** pretvar,int paramCount)156 HRESULT math_trunc(ScriptVariant **varlist , ScriptVariant **pretvar, int paramCount)
157 {
158 DOUBLE dbltemp;
159
160 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[0], &dbltemp)))
161 {
162 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
163 (*pretvar)->lVal = (LONG)(trunc(dbltemp));
164 return S_OK;
165 }
166 *pretvar = NULL;
167 return E_FAIL;
168 }
169
math_round(ScriptVariant ** varlist,ScriptVariant ** pretvar,int paramCount)170 HRESULT math_round(ScriptVariant **varlist , ScriptVariant **pretvar, int paramCount)
171 {
172 DOUBLE dbltemp;
173
174 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[0], &dbltemp)))
175 {
176 ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
177 (*pretvar)->dblVal = (DOUBLE)(round(dbltemp));
178 return S_OK;
179 }
180 *pretvar = NULL;
181 return E_FAIL;
182 }
183
184