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], &ltemp)))
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], &ltemp)))
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