mirror of
https://github.com/boxgaming/qbjs.git
synced 2024-09-20 04:24:45 +00:00
Refined implementation of RND, Randomize.
This commit is contained in:
parent
0549282fad
commit
3b51ec61b4
4 changed files with 92 additions and 28 deletions
|
@ -42,7 +42,7 @@ CodeMirror.defineMode("qbjs", function(conf, parserConf) {
|
||||||
'_screenexists', '_sinh', '_source', '_sndclose', '_sndopen', '_sndplay', '_sndloop', '_sndpause', '_sndstop', '_sndvol',
|
'_screenexists', '_sinh', '_source', '_sndclose', '_sndopen', '_sndplay', '_sndloop', '_sndpause', '_sndstop', '_sndvol',
|
||||||
'_title', '_trim', '_width', 'abs', 'asc', 'atn', 'beep', 'chr', 'circle', 'cls', 'color', 'command', 'cos', 'cvi', 'cvl', 'data', 'draw', 'exp',
|
'_title', '_trim', '_width', 'abs', 'asc', 'atn', 'beep', 'chr', 'circle', 'cls', 'color', 'command', 'cos', 'cvi', 'cvl', 'data', 'draw', 'exp',
|
||||||
'fix', 'hex', 'input', 'inkey', 'instr', 'int', 'lbound', 'left', 'lcase', 'len', 'line', 'locate', 'log', 'ltrim', 'mid', 'mki', 'mkl',
|
'fix', 'hex', 'input', 'inkey', 'instr', 'int', 'lbound', 'left', 'lcase', 'len', 'line', 'locate', 'log', 'ltrim', 'mid', 'mki', 'mkl',
|
||||||
'oct', 'paint', 'point', 'preset', 'print', 'pset', 'right', 'rtrim', 'read', 'restore', 'rnd', 'screen', 'shared', 'sgn', 'sin', 'sleep', 'space', 'sqr',
|
'oct', 'paint', 'point', 'preset', 'print', 'pset', 'right', 'rtrim', 'randomize', 'read', 'restore', 'rnd', 'screen', 'shared', 'sgn', 'sin', 'sleep', 'space', 'sqr',
|
||||||
'str', 'swap', 'tan', 'time', 'timer', 'ubound', 'ucase', 'val', 'varptr', 'window',
|
'str', 'swap', 'tan', 'time', 'timer', 'ubound', 'ucase', 'val', 'varptr', 'window',
|
||||||
// QBJS-specific
|
// QBJS-specific
|
||||||
'export', 'from', 'import', '_label']
|
'export', 'from', 'import', '_label']
|
||||||
|
|
25
qb.js
25
qb.js
|
@ -39,6 +39,7 @@ var QB = new function() {
|
||||||
var _dataBulk = [];
|
var _dataBulk = [];
|
||||||
var _readCursorPosition;
|
var _readCursorPosition;
|
||||||
var _dataLabelMap = new Map();
|
var _dataLabelMap = new Map();
|
||||||
|
var _randomSeed = 327680;
|
||||||
|
|
||||||
// Array handling methods
|
// Array handling methods
|
||||||
// ----------------------------------------------------
|
// ----------------------------------------------------
|
||||||
|
@ -1630,9 +1631,31 @@ var QB = new function() {
|
||||||
return String(value).trimEnd();
|
return String(value).trimEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.sub_Randomize = function(using, n) {
|
||||||
|
const buffer = new ArrayBuffer(8);
|
||||||
|
const view = new DataView(buffer);
|
||||||
|
var m;
|
||||||
|
if (n == undefined) {
|
||||||
|
view.setFloat64(0, 0, false); // TODO: implement prompt
|
||||||
|
m = view.getUint32(0);
|
||||||
|
m ^= (m >> 16);
|
||||||
|
_randomSeed = ((m & 0xffff)<<8) | (_randomSeed & 0xff);
|
||||||
|
} else {
|
||||||
|
view.setFloat64(0, n, false);
|
||||||
|
m = view.getUint32(0);
|
||||||
|
m ^= (m >> 16);
|
||||||
|
if (using == false) {
|
||||||
|
_randomSeed = ((m & 0xffff)<<8) | (_randomSeed & 0xff);
|
||||||
|
} else if (using == true) {
|
||||||
|
_randomSeed = ((m & 0xffff)<<8) | (327680 & 0xff);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
this.func_Rnd = function(n) {
|
this.func_Rnd = function(n) {
|
||||||
// TODO: implement modifier parameter
|
// TODO: implement modifier parameter
|
||||||
return Math.random();
|
_randomSeed = (_randomSeed * 16598013 + 12820163) & 0xFFFFFF;
|
||||||
|
return _randomSeed / 0x1000000; // Inspired by libqb.cpp.
|
||||||
}
|
}
|
||||||
|
|
||||||
this.sub_Screen = async function(mode) {
|
this.sub_Screen = async function(mode) {
|
||||||
|
|
49
qb2js.js
49
qb2js.js
|
@ -506,26 +506,28 @@ var ConvertSub = null;
|
||||||
}
|
}
|
||||||
if ( m.name == "Line" ) {
|
if ( m.name == "Line" ) {
|
||||||
js = (await func_CallMethod( m)) +"(" +(await func_ConvertLine( args)) +");";
|
js = (await func_CallMethod( m)) +"(" +(await func_ConvertLine( args)) +");";
|
||||||
} else if ( m.name == "PSet" || m.name == "Circle" || m.name == "PReset" || m.name == "Paint" ) {
|
|
||||||
js = (await func_CallMethod( m)) +"(" +(await func_ConvertPSet( args)) +");";
|
|
||||||
} else if ( m.name == "_PrintString" ) {
|
|
||||||
js = (await func_CallMethod( m)) +"(" +(await func_ConvertPrintString( args)) +");";
|
|
||||||
} else if ( m.name == "Print" ) {
|
|
||||||
js = (await func_CallMethod( m)) +"(" +(await func_ConvertPrint( args)) +");";
|
|
||||||
} else if ( m.name == "Input" || m.name == "Line Input" ) {
|
|
||||||
js = (await func_ConvertInput( m, args));
|
|
||||||
} else if ( m.name == "Read" ) {
|
|
||||||
js = (await func_ConvertRead( m, args));
|
|
||||||
} else if ( m.name == "Swap" ) {
|
|
||||||
js = (await func_ConvertSwap( m, args));
|
|
||||||
} else if ( m.name == "Cls" ) {
|
} else if ( m.name == "Cls" ) {
|
||||||
js = (await func_CallMethod( m)) +"(" +(await func_ConvertCls( args)) +");";
|
js = (await func_CallMethod( m)) +"(" +(await func_ConvertCls( args)) +");";
|
||||||
} else if ( m.name == "Data" ) {
|
} else if ( m.name == "Data" ) {
|
||||||
js = (await func_CallMethod( m)) +"(" +(await func_ConvertData( args)) +");";
|
js = (await func_CallMethod( m)) +"(" +(await func_ConvertData( args)) +");";
|
||||||
} else if ( m.name == "_PutImage" ) {
|
} else if ( m.name == "Input" || m.name == "Line Input" ) {
|
||||||
js = (await func_CallMethod( m)) +"(" +(await func_ConvertPutImage( args)) +");";
|
js = (await func_ConvertInput( m, args));
|
||||||
|
} else if ( m.name == "PSet" || m.name == "Circle" || m.name == "PReset" || m.name == "Paint" ) {
|
||||||
|
js = (await func_CallMethod( m)) +"(" +(await func_ConvertPSet( args)) +");";
|
||||||
|
} else if ( m.name == "Print" ) {
|
||||||
|
js = (await func_CallMethod( m)) +"(" +(await func_ConvertPrint( args)) +");";
|
||||||
|
} else if ( m.name == "Randomize" ) {
|
||||||
|
js = (await func_ConvertRandomize( m, args));
|
||||||
|
} else if ( m.name == "Read" ) {
|
||||||
|
js = (await func_ConvertRead( m, args));
|
||||||
|
} else if ( m.name == "Swap" ) {
|
||||||
|
js = (await func_ConvertSwap( m, args));
|
||||||
} else if ( m.name == "Window" ) {
|
} else if ( m.name == "Window" ) {
|
||||||
js = (await func_CallMethod( m)) +"(" +(await func_ConvertWindow( args)) +");";
|
js = (await func_CallMethod( m)) +"(" +(await func_ConvertWindow( args)) +");";
|
||||||
|
} else if ( m.name == "_PrintString" ) {
|
||||||
|
js = (await func_CallMethod( m)) +"(" +(await func_ConvertPrintString( args)) +");";
|
||||||
|
} else if ( m.name == "_PutImage" ) {
|
||||||
|
js = (await func_CallMethod( m)) +"(" +(await func_ConvertPutImage( args)) +");";
|
||||||
} else if ( m.name == "_FullScreen" ) {
|
} else if ( m.name == "_FullScreen" ) {
|
||||||
js = (await func_CallMethod( m)) +"(" +(await func_ConvertFullScreen( args)) +");";
|
js = (await func_CallMethod( m)) +"(" +(await func_ConvertFullScreen( args)) +");";
|
||||||
} else {
|
} else {
|
||||||
|
@ -760,6 +762,24 @@ var ConvertData = null;
|
||||||
ConvertData = r +"]";
|
ConvertData = r +"]";
|
||||||
return ConvertData;
|
return ConvertData;
|
||||||
}
|
}
|
||||||
|
async function func_ConvertRandomize(m/*METHOD*/,args/*STRING*/) {
|
||||||
|
if (QB.halted()) { return; }
|
||||||
|
var ConvertRandomize = null;
|
||||||
|
var uusing = ''; // STRING
|
||||||
|
var theseed = ''; // STRING
|
||||||
|
uusing = "false";
|
||||||
|
theseed = args;
|
||||||
|
if ((QB.func__Trim( args)) == "" ) {
|
||||||
|
theseed = "undefined";
|
||||||
|
} else {
|
||||||
|
if (((QB.func_UCase( (QB.func__Trim( (QB.func_Left( args, 5)))))) == "USING") ) {
|
||||||
|
uusing = "true";
|
||||||
|
theseed = (QB.func__Trim( (QB.func_Right( args, (QB.func_Len( args)) - 5))));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ConvertRandomize = (await func_CallMethod( m)) +"(" + uusing +", " + theseed +")";
|
||||||
|
return ConvertRandomize;
|
||||||
|
}
|
||||||
async function func_ConvertRead(m/*METHOD*/,args/*STRING*/) {
|
async function func_ConvertRead(m/*METHOD*/,args/*STRING*/) {
|
||||||
if (QB.halted()) { return; }
|
if (QB.halted()) { return; }
|
||||||
var ConvertRead = null;
|
var ConvertRead = null;
|
||||||
|
@ -2867,6 +2887,7 @@ if (QB.halted()) { return; }
|
||||||
await sub_AddQBMethod( "SUB", "PReset", False);
|
await sub_AddQBMethod( "SUB", "PReset", False);
|
||||||
await sub_AddQBMethod( "SUB", "Print", True);
|
await sub_AddQBMethod( "SUB", "Print", True);
|
||||||
await sub_AddQBMethod( "SUB", "PSet", False);
|
await sub_AddQBMethod( "SUB", "PSet", False);
|
||||||
|
await sub_AddQBMethod( "SUB", "Randomize", False);
|
||||||
await sub_AddQBMethod( "SUB", "Restore", False);
|
await sub_AddQBMethod( "SUB", "Restore", False);
|
||||||
await sub_AddQBMethod( "FUNCTION", "Right$", False);
|
await sub_AddQBMethod( "FUNCTION", "Right$", False);
|
||||||
await sub_AddQBMethod( "FUNCTION", "RTrim$", False);
|
await sub_AddQBMethod( "FUNCTION", "RTrim$", False);
|
||||||
|
|
|
@ -591,17 +591,23 @@ Function ConvertSub$ (m As Method, args As String)
|
||||||
If m.name = "Line" Then
|
If m.name = "Line" Then
|
||||||
js = CallMethod(m) + "(" + ConvertLine(args) + ");"
|
js = CallMethod(m) + "(" + ConvertLine(args) + ");"
|
||||||
|
|
||||||
|
ElseIf m.name = "Cls" Then
|
||||||
|
js = CallMethod(m) + "(" + ConvertCls(args) + ");"
|
||||||
|
|
||||||
|
ElseIf m.name = "Data" Then
|
||||||
|
js = CallMethod(m) + "(" + ConvertData(args) + ");"
|
||||||
|
|
||||||
|
ElseIf m.name = "Input" Or m.name = "Line Input" Then
|
||||||
|
js = ConvertInput(m, args)
|
||||||
|
|
||||||
ElseIf m.name = "PSet" Or m.name = "Circle" Or m.name = "PReset" Or m.name = "Paint" Then
|
ElseIf m.name = "PSet" Or m.name = "Circle" Or m.name = "PReset" Or m.name = "Paint" Then
|
||||||
js = CallMethod(m) + "(" + ConvertPSet(args) + ");"
|
js = CallMethod(m) + "(" + ConvertPSet(args) + ");"
|
||||||
|
|
||||||
ElseIf m.name = "_PrintString" Then
|
|
||||||
js = CallMethod(m) + "(" + ConvertPrintString(args) + ");"
|
|
||||||
|
|
||||||
ElseIf m.name = "Print" Then
|
ElseIf m.name = "Print" Then
|
||||||
js = CallMethod(m) + "(" + ConvertPrint(args) + ");"
|
js = CallMethod(m) + "(" + ConvertPrint(args) + ");"
|
||||||
|
|
||||||
ElseIf m.name = "Input" Or m.name = "Line Input" Then
|
ElseIf m.name = "Randomize" Then
|
||||||
js = ConvertInput(m, args)
|
js = ConvertRandomize(m, args)
|
||||||
|
|
||||||
ElseIf m.name = "Read" Then
|
ElseIf m.name = "Read" Then
|
||||||
js = ConvertRead(m, args)
|
js = ConvertRead(m, args)
|
||||||
|
@ -609,18 +615,15 @@ Function ConvertSub$ (m As Method, args As String)
|
||||||
ElseIf m.name = "Swap" Then
|
ElseIf m.name = "Swap" Then
|
||||||
js = ConvertSwap(m, args)
|
js = ConvertSwap(m, args)
|
||||||
|
|
||||||
ElseIf m.name = "Cls" Then
|
ElseIf m.name = "Window" Then
|
||||||
js = CallMethod(m) + "(" + ConvertCls(args) + ");"
|
js = CallMethod(m) + "(" + ConvertWindow(args) + ");"
|
||||||
|
|
||||||
ElseIf m.name = "Data" Then
|
ElseIf m.name = "_PrintString" Then
|
||||||
js = CallMethod(m) + "(" + ConvertData(args) + ");"
|
js = CallMethod(m) + "(" + ConvertPrintString(args) + ");"
|
||||||
|
|
||||||
ElseIf m.name = "_PutImage" Then
|
ElseIf m.name = "_PutImage" Then
|
||||||
js = CallMethod(m) + "(" + ConvertPutImage(args) + ");"
|
js = CallMethod(m) + "(" + ConvertPutImage(args) + ");"
|
||||||
|
|
||||||
ElseIf m.name = "Window" Then
|
|
||||||
js = CallMethod(m) + "(" + ConvertWindow(args) + ");"
|
|
||||||
|
|
||||||
ElseIf m.name = "_FullScreen" Then
|
ElseIf m.name = "_FullScreen" Then
|
||||||
js = CallMethod(m) + "(" + ConvertFullScreen(args) + ");"
|
js = CallMethod(m) + "(" + ConvertFullScreen(args) + ");"
|
||||||
Else
|
Else
|
||||||
|
@ -836,6 +839,22 @@ Function ConvertData$ (args As String)
|
||||||
ConvertData$ = r + "]"
|
ConvertData$ = r + "]"
|
||||||
End Function
|
End Function
|
||||||
|
|
||||||
|
Function ConvertRandomize$ (m As Method, args As String)
|
||||||
|
Dim uusing As String
|
||||||
|
Dim theseed As String
|
||||||
|
uusing = "false"
|
||||||
|
theseed = args
|
||||||
|
If _Trim$(args) = "" Then
|
||||||
|
theseed = "undefined"
|
||||||
|
Else
|
||||||
|
If (UCase$(_Trim$(Left$(args, 5))) = "USING") Then
|
||||||
|
uusing = "true"
|
||||||
|
theseed = _Trim$(Right$(args, Len(args) - 5))
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
ConvertRandomize = CallMethod(m) + "(" + uusing + ", " + theseed + ")"
|
||||||
|
End Function
|
||||||
|
|
||||||
Function ConvertRead$ (m As Method, args As String)
|
Function ConvertRead$ (m As Method, args As String)
|
||||||
Dim js As String
|
Dim js As String
|
||||||
Dim vname As String
|
Dim vname As String
|
||||||
|
@ -2992,6 +3011,7 @@ Sub InitQBMethods
|
||||||
AddQBMethod "SUB", "PReset", False
|
AddQBMethod "SUB", "PReset", False
|
||||||
AddQBMethod "SUB", "Print", True
|
AddQBMethod "SUB", "Print", True
|
||||||
AddQBMethod "SUB", "PSet", False
|
AddQBMethod "SUB", "PSet", False
|
||||||
|
AddQBMethod "SUB", "Randomize", False
|
||||||
AddQBMethod "SUB", "Restore", False
|
AddQBMethod "SUB", "Restore", False
|
||||||
AddQBMethod "FUNCTION", "Right$", False
|
AddQBMethod "FUNCTION", "Right$", False
|
||||||
AddQBMethod "FUNCTION", "RTrim$", False
|
AddQBMethod "FUNCTION", "RTrim$", False
|
||||||
|
|
Loading…
Reference in a new issue