2009-02-17 15:02:16 +00:00
|
|
|
/* ScummVM - Graphic Adventure Engine
|
|
|
|
*
|
|
|
|
* ScummVM is the legal property of its developers, whose names
|
|
|
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
|
|
|
* file distributed with this source distribution.
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
*
|
|
|
|
* $URL$
|
|
|
|
* $Id$
|
|
|
|
*
|
|
|
|
*/
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-02-27 02:23:40 +00:00
|
|
|
#include "sci/engine/state.h"
|
2009-02-24 05:51:55 +00:00
|
|
|
#include "sci/engine/kernel.h"
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-02-21 10:23:36 +00:00
|
|
|
namespace Sci {
|
|
|
|
|
- Changed the unimplemented debug SCI kernel functions (InspectObj, ShowSends, ShowObjs, ShowFree, StackUsage and Profiler) to be dummy functions - we have our own debugger, and don't use these functions for debugging
- Removed the function number parameter from all kernel functions, as it's no longer needed, and removed the FAKE_FUNCT_NR hack
- Removed kUnknown() and kStub()
- Dummy/unknown kernel functions are no longer invoked, and a warning is shown instead, with the paremeters passed to them
Note: there is an evil hack used for debugging scripts in invoke_selector(), which probably no longer works now
svn-id: r44461
2009-09-29 14:24:07 +00:00
|
|
|
reg_t kRandom(EngineState *s, int argc, reg_t *argv) {
|
2010-07-28 21:47:15 +00:00
|
|
|
switch (argc) {
|
|
|
|
case 1: // set seed to argv[0]
|
2010-07-28 21:55:40 +00:00
|
|
|
// SCI0/SCI01 just reset the seed to 0 instead of using argv[0] at all
|
2010-07-28 21:47:15 +00:00
|
|
|
return NULL_REG;
|
|
|
|
|
|
|
|
case 2: { // get random number
|
2010-08-20 21:59:14 +00:00
|
|
|
// numbers are definitely unsigned, for example lsl5 door code in k rap radio is random
|
|
|
|
// and 5-digit - we get called kRandom(10000, 65000)
|
|
|
|
// some codes in sq4 are also random and 5 digit (if i remember correctly)
|
|
|
|
const uint16 fromNumber = argv[0].toUint16();
|
|
|
|
const uint16 toNumber = argv[1].toUint16();
|
|
|
|
uint16 range = toNumber - fromNumber + 1;
|
|
|
|
// calculating range is exactly how sierra sci did it and is required for hoyle 4
|
|
|
|
// where we get called with kRandom(0, -1) and we are supposed to give back values from 0 to 0
|
|
|
|
// the returned value will be used as displace-offset for a background cel
|
2010-08-20 22:14:48 +00:00
|
|
|
// note: i assume that the hoyle4 code is actually buggy and it was never fixed because of
|
|
|
|
// the way sierra sci handled it - "it just worked". It should have called kRandom(0, 0)
|
2010-08-20 21:59:14 +00:00
|
|
|
if (range)
|
|
|
|
range--; // the range value was never returned, our random generator gets 0->range, so fix it
|
|
|
|
|
|
|
|
const int randomNumber = fromNumber + (int)g_sci->getRNG().getRandomNumber(range);
|
2010-07-30 22:47:01 +00:00
|
|
|
return make_reg(0, randomNumber);
|
2010-07-28 21:47:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
case 3: // get seed
|
2010-07-28 21:55:40 +00:00
|
|
|
// SCI0/01 did not support this at all
|
2010-07-28 21:47:15 +00:00
|
|
|
// Actually we would have to return the previous seed
|
|
|
|
error("kRandom: scripts asked for previous seed");
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
error("kRandom: unsupported argc");
|
|
|
|
}
|
2009-02-15 06:10:59 +00:00
|
|
|
}
|
|
|
|
|
- Changed the unimplemented debug SCI kernel functions (InspectObj, ShowSends, ShowObjs, ShowFree, StackUsage and Profiler) to be dummy functions - we have our own debugger, and don't use these functions for debugging
- Removed the function number parameter from all kernel functions, as it's no longer needed, and removed the FAKE_FUNCT_NR hack
- Removed kUnknown() and kStub()
- Dummy/unknown kernel functions are no longer invoked, and a warning is shown instead, with the paremeters passed to them
Note: there is an evil hack used for debugging scripts in invoke_selector(), which probably no longer works now
svn-id: r44461
2009-09-29 14:24:07 +00:00
|
|
|
reg_t kAbs(EngineState *s, int argc, reg_t *argv) {
|
2010-08-15 19:01:18 +00:00
|
|
|
return make_reg(0, ABS(argv[0].toSint16()));
|
2009-02-15 06:10:59 +00:00
|
|
|
}
|
|
|
|
|
- Changed the unimplemented debug SCI kernel functions (InspectObj, ShowSends, ShowObjs, ShowFree, StackUsage and Profiler) to be dummy functions - we have our own debugger, and don't use these functions for debugging
- Removed the function number parameter from all kernel functions, as it's no longer needed, and removed the FAKE_FUNCT_NR hack
- Removed kUnknown() and kStub()
- Dummy/unknown kernel functions are no longer invoked, and a warning is shown instead, with the paremeters passed to them
Note: there is an evil hack used for debugging scripts in invoke_selector(), which probably no longer works now
svn-id: r44461
2009-09-29 14:24:07 +00:00
|
|
|
reg_t kSqrt(EngineState *s, int argc, reg_t *argv) {
|
2010-08-15 19:01:18 +00:00
|
|
|
return make_reg(0, (int16) sqrt((float) ABS(argv[0].toSint16())));
|
2009-02-15 06:10:59 +00:00
|
|
|
}
|
|
|
|
|
- Changed the unimplemented debug SCI kernel functions (InspectObj, ShowSends, ShowObjs, ShowFree, StackUsage and Profiler) to be dummy functions - we have our own debugger, and don't use these functions for debugging
- Removed the function number parameter from all kernel functions, as it's no longer needed, and removed the FAKE_FUNCT_NR hack
- Removed kUnknown() and kStub()
- Dummy/unknown kernel functions are no longer invoked, and a warning is shown instead, with the paremeters passed to them
Note: there is an evil hack used for debugging scripts in invoke_selector(), which probably no longer works now
svn-id: r44461
2009-09-29 14:24:07 +00:00
|
|
|
reg_t kGetAngle(EngineState *s, int argc, reg_t *argv) {
|
2009-02-20 16:22:09 +00:00
|
|
|
// Based on behavior observed with a test program created with
|
|
|
|
// SCI Studio.
|
2009-06-07 15:53:30 +00:00
|
|
|
int x1 = argv[0].toSint16();
|
|
|
|
int y1 = argv[1].toSint16();
|
|
|
|
int x2 = argv[2].toSint16();
|
|
|
|
int y2 = argv[3].toSint16();
|
2009-02-15 06:10:59 +00:00
|
|
|
int xrel = x2 - x1;
|
2009-02-20 16:22:09 +00:00
|
|
|
int yrel = y1 - y2; // y-axis is mirrored.
|
2009-02-15 06:10:59 +00:00
|
|
|
int angle;
|
|
|
|
|
2009-02-20 16:22:09 +00:00
|
|
|
// Move (xrel, yrel) to first quadrant.
|
2009-02-15 06:10:59 +00:00
|
|
|
if (y1 < y2)
|
|
|
|
yrel = -yrel;
|
|
|
|
if (x2 < x1)
|
|
|
|
xrel = -xrel;
|
|
|
|
|
2009-02-20 16:22:09 +00:00
|
|
|
// Compute angle in grads.
|
2009-02-15 06:10:59 +00:00
|
|
|
if (yrel == 0 && xrel == 0)
|
|
|
|
angle = 0;
|
|
|
|
else
|
|
|
|
angle = 100 * xrel / (xrel + yrel);
|
|
|
|
|
2009-02-20 16:22:09 +00:00
|
|
|
// Fix up angle for actual quadrant of (xrel, yrel).
|
2009-02-15 06:10:59 +00:00
|
|
|
if (y1 < y2)
|
|
|
|
angle = 200 - angle;
|
|
|
|
if (x2 < x1)
|
|
|
|
angle = 400 - angle;
|
|
|
|
|
2009-02-20 16:22:09 +00:00
|
|
|
// Convert from grads to degrees by merging grad 0 with grad 1,
|
|
|
|
// grad 10 with grad 11, grad 20 with grad 21, etc. This leads to
|
|
|
|
// "degrees" that equal either one or two grads.
|
2009-02-15 06:10:59 +00:00
|
|
|
angle -= (angle + 9) / 10;
|
|
|
|
|
|
|
|
return make_reg(0, angle);
|
|
|
|
}
|
|
|
|
|
- Changed the unimplemented debug SCI kernel functions (InspectObj, ShowSends, ShowObjs, ShowFree, StackUsage and Profiler) to be dummy functions - we have our own debugger, and don't use these functions for debugging
- Removed the function number parameter from all kernel functions, as it's no longer needed, and removed the FAKE_FUNCT_NR hack
- Removed kUnknown() and kStub()
- Dummy/unknown kernel functions are no longer invoked, and a warning is shown instead, with the paremeters passed to them
Note: there is an evil hack used for debugging scripts in invoke_selector(), which probably no longer works now
svn-id: r44461
2009-09-29 14:24:07 +00:00
|
|
|
reg_t kGetDistance(EngineState *s, int argc, reg_t *argv) {
|
2009-06-07 16:50:34 +00:00
|
|
|
int xdiff = (argc > 3) ? argv[3].toSint16() : 0;
|
|
|
|
int ydiff = (argc > 2) ? argv[2].toSint16() : 0;
|
|
|
|
int angle = (argc > 5) ? argv[5].toSint16() : 0;
|
|
|
|
int xrel = (int)(((float) argv[1].toSint16() - xdiff) / cos(angle * PI / 180.0)); // This works because cos(0)==1
|
|
|
|
int yrel = argv[0].toSint16() - ydiff;
|
2009-02-21 21:16:41 +00:00
|
|
|
return make_reg(0, (int16)sqrt((float) xrel*xrel + yrel*yrel));
|
2009-02-15 06:10:59 +00:00
|
|
|
}
|
|
|
|
|
- Changed the unimplemented debug SCI kernel functions (InspectObj, ShowSends, ShowObjs, ShowFree, StackUsage and Profiler) to be dummy functions - we have our own debugger, and don't use these functions for debugging
- Removed the function number parameter from all kernel functions, as it's no longer needed, and removed the FAKE_FUNCT_NR hack
- Removed kUnknown() and kStub()
- Dummy/unknown kernel functions are no longer invoked, and a warning is shown instead, with the paremeters passed to them
Note: there is an evil hack used for debugging scripts in invoke_selector(), which probably no longer works now
svn-id: r44461
2009-09-29 14:24:07 +00:00
|
|
|
reg_t kTimesSin(EngineState *s, int argc, reg_t *argv) {
|
2009-06-07 15:53:30 +00:00
|
|
|
int angle = argv[0].toSint16();
|
|
|
|
int factor = argv[1].toSint16();
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-09-25 13:01:35 +00:00
|
|
|
return make_reg(0, (int)(factor * sin(angle * PI / 180.0)));
|
2009-02-15 06:10:59 +00:00
|
|
|
}
|
|
|
|
|
- Changed the unimplemented debug SCI kernel functions (InspectObj, ShowSends, ShowObjs, ShowFree, StackUsage and Profiler) to be dummy functions - we have our own debugger, and don't use these functions for debugging
- Removed the function number parameter from all kernel functions, as it's no longer needed, and removed the FAKE_FUNCT_NR hack
- Removed kUnknown() and kStub()
- Dummy/unknown kernel functions are no longer invoked, and a warning is shown instead, with the paremeters passed to them
Note: there is an evil hack used for debugging scripts in invoke_selector(), which probably no longer works now
svn-id: r44461
2009-09-29 14:24:07 +00:00
|
|
|
reg_t kTimesCos(EngineState *s, int argc, reg_t *argv) {
|
2009-06-07 15:53:30 +00:00
|
|
|
int angle = argv[0].toSint16();
|
|
|
|
int factor = argv[1].toSint16();
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-09-25 13:01:35 +00:00
|
|
|
return make_reg(0, (int)(factor * cos(angle * PI / 180.0)));
|
2009-02-15 06:10:59 +00:00
|
|
|
}
|
|
|
|
|
- Changed the unimplemented debug SCI kernel functions (InspectObj, ShowSends, ShowObjs, ShowFree, StackUsage and Profiler) to be dummy functions - we have our own debugger, and don't use these functions for debugging
- Removed the function number parameter from all kernel functions, as it's no longer needed, and removed the FAKE_FUNCT_NR hack
- Removed kUnknown() and kStub()
- Dummy/unknown kernel functions are no longer invoked, and a warning is shown instead, with the paremeters passed to them
Note: there is an evil hack used for debugging scripts in invoke_selector(), which probably no longer works now
svn-id: r44461
2009-09-29 14:24:07 +00:00
|
|
|
reg_t kCosDiv(EngineState *s, int argc, reg_t *argv) {
|
2009-06-07 15:53:30 +00:00
|
|
|
int angle = argv[0].toSint16();
|
|
|
|
int value = argv[1].toSint16();
|
2009-02-15 06:10:59 +00:00
|
|
|
double cosval = cos(angle * PI / 180.0);
|
|
|
|
|
2009-09-24 14:07:02 +00:00
|
|
|
if ((cosval < 0.0001) && (cosval > -0.0001)) {
|
2010-06-28 12:29:06 +00:00
|
|
|
error("kCosDiv: Attempted division by zero");
|
2009-09-30 23:00:03 +00:00
|
|
|
return SIGNAL_REG;
|
2009-02-15 06:10:59 +00:00
|
|
|
} else
|
2009-02-21 21:16:41 +00:00
|
|
|
return make_reg(0, (int16)(value / cosval));
|
2009-02-15 06:10:59 +00:00
|
|
|
}
|
|
|
|
|
- Changed the unimplemented debug SCI kernel functions (InspectObj, ShowSends, ShowObjs, ShowFree, StackUsage and Profiler) to be dummy functions - we have our own debugger, and don't use these functions for debugging
- Removed the function number parameter from all kernel functions, as it's no longer needed, and removed the FAKE_FUNCT_NR hack
- Removed kUnknown() and kStub()
- Dummy/unknown kernel functions are no longer invoked, and a warning is shown instead, with the paremeters passed to them
Note: there is an evil hack used for debugging scripts in invoke_selector(), which probably no longer works now
svn-id: r44461
2009-09-29 14:24:07 +00:00
|
|
|
reg_t kSinDiv(EngineState *s, int argc, reg_t *argv) {
|
2009-06-07 15:53:30 +00:00
|
|
|
int angle = argv[0].toSint16();
|
|
|
|
int value = argv[1].toSint16();
|
2009-02-15 06:10:59 +00:00
|
|
|
double sinval = sin(angle * PI / 180.0);
|
|
|
|
|
2009-09-24 14:07:02 +00:00
|
|
|
if ((sinval < 0.0001) && (sinval > -0.0001)) {
|
2010-06-28 12:29:06 +00:00
|
|
|
error("kSinDiv: Attempted division by zero");
|
2009-09-30 23:00:03 +00:00
|
|
|
return SIGNAL_REG;
|
2009-02-15 06:10:59 +00:00
|
|
|
} else
|
2009-02-21 21:16:41 +00:00
|
|
|
return make_reg(0, (int16)(value / sinval));
|
2009-02-15 06:10:59 +00:00
|
|
|
}
|
|
|
|
|
- Changed the unimplemented debug SCI kernel functions (InspectObj, ShowSends, ShowObjs, ShowFree, StackUsage and Profiler) to be dummy functions - we have our own debugger, and don't use these functions for debugging
- Removed the function number parameter from all kernel functions, as it's no longer needed, and removed the FAKE_FUNCT_NR hack
- Removed kUnknown() and kStub()
- Dummy/unknown kernel functions are no longer invoked, and a warning is shown instead, with the paremeters passed to them
Note: there is an evil hack used for debugging scripts in invoke_selector(), which probably no longer works now
svn-id: r44461
2009-09-29 14:24:07 +00:00
|
|
|
reg_t kTimesTan(EngineState *s, int argc, reg_t *argv) {
|
2009-06-07 15:53:30 +00:00
|
|
|
int param = argv[0].toSint16();
|
2009-06-07 16:50:34 +00:00
|
|
|
int scale = (argc > 1) ? argv[1].toSint16() : 1;
|
2009-02-15 06:10:59 +00:00
|
|
|
|
|
|
|
param -= 90;
|
|
|
|
if ((param % 90) == 0) {
|
2010-06-28 12:29:06 +00:00
|
|
|
error("kTimesTan: Attempted tan(pi/2)");
|
2009-09-30 23:00:03 +00:00
|
|
|
return SIGNAL_REG;
|
2009-02-15 06:10:59 +00:00
|
|
|
} else
|
2009-02-21 21:16:41 +00:00
|
|
|
return make_reg(0, (int16) - (tan(param * PI / 180.0) * scale));
|
2009-02-15 06:10:59 +00:00
|
|
|
}
|
|
|
|
|
- Changed the unimplemented debug SCI kernel functions (InspectObj, ShowSends, ShowObjs, ShowFree, StackUsage and Profiler) to be dummy functions - we have our own debugger, and don't use these functions for debugging
- Removed the function number parameter from all kernel functions, as it's no longer needed, and removed the FAKE_FUNCT_NR hack
- Removed kUnknown() and kStub()
- Dummy/unknown kernel functions are no longer invoked, and a warning is shown instead, with the paremeters passed to them
Note: there is an evil hack used for debugging scripts in invoke_selector(), which probably no longer works now
svn-id: r44461
2009-09-29 14:24:07 +00:00
|
|
|
reg_t kTimesCot(EngineState *s, int argc, reg_t *argv) {
|
2009-06-07 15:53:30 +00:00
|
|
|
int param = argv[0].toSint16();
|
2009-06-07 16:50:34 +00:00
|
|
|
int scale = (argc > 1) ? argv[1].toSint16() : 1;
|
2009-02-15 06:10:59 +00:00
|
|
|
|
|
|
|
if ((param % 90) == 0) {
|
2010-06-28 12:29:06 +00:00
|
|
|
error("kTimesCot: Attempted tan(pi/2)");
|
2009-09-30 23:00:03 +00:00
|
|
|
return SIGNAL_REG;
|
2009-02-15 06:10:59 +00:00
|
|
|
} else
|
2009-02-21 21:16:41 +00:00
|
|
|
return make_reg(0, (int16)(tan(param * PI / 180.0) * scale));
|
2009-02-15 06:10:59 +00:00
|
|
|
}
|
2009-02-21 10:23:36 +00:00
|
|
|
|
2010-06-17 07:26:06 +00:00
|
|
|
#ifdef ENABLE_SCI32
|
|
|
|
|
|
|
|
reg_t kMulDiv(EngineState *s, int argc, reg_t *argv) {
|
|
|
|
int16 multiplicant = argv[0].toSint16();
|
|
|
|
int16 multiplier = argv[1].toSint16();
|
|
|
|
int16 denominator = argv[2].toSint16();
|
|
|
|
|
|
|
|
// Sanity check...
|
|
|
|
if (!denominator) {
|
2010-06-28 12:29:06 +00:00
|
|
|
error("kMulDiv: attempt to divide by zero (%d * %d / %d", multiplicant, multiplier, denominator);
|
2010-06-17 07:26:06 +00:00
|
|
|
return NULL_REG;
|
|
|
|
}
|
|
|
|
|
|
|
|
return make_reg(0, multiplicant * multiplier / denominator);
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
2009-02-21 10:23:36 +00:00
|
|
|
} // End of namespace Sci
|