Reusing A Random Location generator = working AHA moment.
Moderators: angster, RoryAndersonCDT, michaelm75au, MOD_Command
Reusing A Random Location generator = working AHA moment.
So this is not my code. It is a copy of some code that was posted a few months ago on this forum. Trying to generate a random number and types of submarines and then randomly place then within a set area
Location Randomizer function
function random_loc( latmin, latmax, lonmin, longmax, depthm)
local lat_var,lonvar,newlat,newlon;
for i=1,10000 do
lat_var = math.random(1,(10^5))
lon_var = math.random(1,(10^5))
newlat=math.random(latmint, latmax)+(lat_var/10^5)
newlon=math.random(lonmin, lonmax)+(lon_var/10^5)
ndepth=World_GetElevation({latitude=newlat, longitude=newlon})
if ndepth <= depthm then
return newlat,newlon,ndepth;
end
end
return nil, nil, nil
end
Random Sub/location code
math.randomseed(os.time())
math.random();
math.random(); math.random()
local SSNA=math.random(2,4)
local SSKA=math.random(3,6)
local SSGA=math.random(1,2)
local SSNB=math.random(2,4)
local SSKB=math.random(3,6)
local SSGB=math.random(1,2)
local subtype, subran, rname
for i=1,SSNA do
subran=math.random(1,3)
if subran==1 then
subtype='159'
elseif subran==2 then
subtype='58'
else subtype='411'
end
newlat, newlong, ndepth = random_loc( 67, 70, -17, -14, 250)
rname=math.random(1,500)
ScenEdit_AddUnit({side='USSR', type='sub', dbid='subtype', latitude=newlat, longitude=newlong, name='sub'..rname, depth='200'})
end
Getting this error: "ERROR: [string "chunk"]:48: bad argument #1 to 'floor' (number expected, got nil)"
Location Randomizer function
function random_loc( latmin, latmax, lonmin, longmax, depthm)
local lat_var,lonvar,newlat,newlon;
for i=1,10000 do
lat_var = math.random(1,(10^5))
lon_var = math.random(1,(10^5))
newlat=math.random(latmint, latmax)+(lat_var/10^5)
newlon=math.random(lonmin, lonmax)+(lon_var/10^5)
ndepth=World_GetElevation({latitude=newlat, longitude=newlon})
if ndepth <= depthm then
return newlat,newlon,ndepth;
end
end
return nil, nil, nil
end
Random Sub/location code
math.randomseed(os.time())
math.random();
math.random(); math.random()
local SSNA=math.random(2,4)
local SSKA=math.random(3,6)
local SSGA=math.random(1,2)
local SSNB=math.random(2,4)
local SSKB=math.random(3,6)
local SSGB=math.random(1,2)
local subtype, subran, rname
for i=1,SSNA do
subran=math.random(1,3)
if subran==1 then
subtype='159'
elseif subran==2 then
subtype='58'
else subtype='411'
end
newlat, newlong, ndepth = random_loc( 67, 70, -17, -14, 250)
rname=math.random(1,500)
ScenEdit_AddUnit({side='USSR', type='sub', dbid='subtype', latitude=newlat, longitude=newlong, name='sub'..rname, depth='200'})
end
Getting this error: "ERROR: [string "chunk"]:48: bad argument #1 to 'floor' (number expected, got nil)"
Last edited by vettim89 on Wed Mar 23, 2022 8:22 pm, edited 2 times in total.
"We have met the enemy and they are ours" - Commodore O.H. Perry
-
KnightHawk75
- Posts: 1850
- Joined: Thu Nov 15, 2018 7:24 pm
Re: Reusing A Random Location generator = failed
Please post or link to the whole thing, for example there is an error but you've not included the lines involved in that error.
If you can wrap the requested code into the post with a forum code tags around it (there is a button for it to the right of ") that way indentation is maintained.
If you can wrap the requested code into the post with a forum code tags around it (there is a button for it to the right of ") that way indentation is maintained.
Re: Reusing A Random Location generator = failed
Here is the code posted out of the Lua Console
Code: Select all
>> function random_loc( latmin, latmax, lonmin, longmax, depthm)
local lat_var,lonvar,newlat,newlon;
for i=1,10000 do
lat_var = math.random(1,(10^5))
lon_var = math.random(1,(10^5))
newlat=math.random(latmint, latmax)+(lat_var/10^5)
newlon=math.random(lonmin, lonmax)+(lon_var/10^5)
ndepth=World_GetElevation({latitude=newlat, longitude=newlon})
if ndepth <= depthm then
return newlat,newlon,ndepth;
end
end
return nil, nil, nil
end
math.randomseed(os.time())
math.random();
local SSNA=math.random(2,4)
local SSKA=math.random(3,6)
local SSGA=math.random(1,2)
local SSNB=math.random(2,4)
local SSKB=math.random(3,6)
local SSGB=math.random(1,2)
local sub_type, subran, rname
for i=1,SSNA do
subran=math.random(1,3)
if subran==1 then
sub_type='159'
elseif subran==2 then
sub_type='58'
else subtype='411'
end
newlat, newlong, ndepth = random_loc( 67, 70, -17, -14, 250)
rname=math.random(1,500)
ScenEdit_AddUnit({side='USSR', type='sub', dbid=sub_type, latitude=newlat, longitude=newlong, name='sub'..rname, depth='200'})
end
ERROR: [string "chunk"]:48: bad argument #1 to 'floor' (number expected, got nil) "We have met the enemy and they are ours" - Commodore O.H. Perry
-
KnightHawk75
- Posts: 1850
- Joined: Thu Nov 15, 2018 7:24 pm
Re: Reusing A Random Location generator = failed
In new location code...
1. "longmax" parameter is refereed to in later code as lonmax (without the g). one or the other needs to be changed. As is lonmax is nil in the call to math.random for new longitude.
2. "latmin" is typo'd as latmint, so that value to math.random was nil.
3. "lon_var" is typod as lonvar in the local definition, so that value was global when used later not local, not that mattered for this error.
Outside the function...
4. subtype is misspelled when used in the 'else' case, this presented a case where 1 out of 3 times you would end up with failure as the dbid would end up nil.
Unrelated but I changed os.time to os.clock as well, code that runs ok with above corrections:
1. "longmax" parameter is refereed to in later code as lonmax (without the g). one or the other needs to be changed. As is lonmax is nil in the call to math.random for new longitude.
2. "latmin" is typo'd as latmint, so that value to math.random was nil.
3. "lon_var" is typod as lonvar in the local definition, so that value was global when used later not local, not that mattered for this error.
Outside the function...
4. subtype is misspelled when used in the 'else' case, this presented a case where 1 out of 3 times you would end up with failure as the dbid would end up nil.
Unrelated but I changed os.time to os.clock as well, code that runs ok with above corrections:
Code: Select all
function random_loc( latmin, latmax, lonmin, lonmax, depthm)
local lat_var,lon_var,newlat,newlon;
for i=1,10000 do
lat_var = math.random(1,(10^5));
lon_var = math.random(1,(10^5));
newlat=math.random(latmin, latmax)+(lat_var/10^5);
newlon=math.random(lonmin, lonmax)+(lon_var/10^5);
ndepth=World_GetElevation({latitude=newlat, longitude=newlon});
if ndepth <= depthm then
return newlat,newlon,ndepth;
end
end
return nil, nil, nil
end
math.randomseed(os.clock())
math.random();
local SSNA=math.random(2,4)
local SSKA=math.random(3,6)
local SSGA=math.random(1,2)
local SSNB=math.random(2,4)
local SSKB=math.random(3,6)
local SSGB=math.random(1,2)
local sub_type, subran, rname
for i=1,SSNA do
subran=math.random(1,3)
if subran==1 then sub_type='159';
elseif subran==2 then sub_type='58';
else sub_type='411';
end
newlat, newlong, ndepth = random_loc( 67, 70, -17, -14, 250)
rname=math.random(1,500)
ScenEdit_AddUnit({side='a', type='sub', dbid=sub_type, latitude=newlat, longitude=newlong, name='sub'..rname, depth='200'})
end
Re: Reusing A Random Location generator = failed
Knighthawk,
Ran the code you supplied and got a new error. BTW, thanks as always for you help.
Ran the code you supplied and got a new error. BTW, thanks as always for you help.
Code: Select all
>> function random_loc( latmin, latmax, lonmin, lonmax, depthm)
local lat_var,lon_var,newlat,newlon;
for i=1,10000 do
lat_var = math.random(1,(10^5));
lon_var = math.random(1,(10^5));
newlat=math.random(latmin, latmax)+(lat_var/10^5);
newlon=math.random(lonmin, lonmax)+(lon_var/10^5);
ndepth=World_GetElevation({latitude=newlat, longitude=newlon});
if ndepth <= depthm then
return newlat,newlon,ndepth;
end
end
return nil, nil, nil
end
math.randomseed(os.clock())
math.random();
local SSNA=math.random(2,4)
local SSKA=math.random(3,6)
local SSGA=math.random(1,2)
local SSNB=math.random(2,4)
local SSKB=math.random(3,6)
local SSGB=math.random(1,2)
local sub_type, subran, rname
for i=1,SSNA do
subran=math.random(1,3)
if subran==1 then sub_type='159';
elseif subran==2 then sub_type='58';
else sub_type='411';
end
newlat, newlong, ndepth = random_loc( 67, 70, -17, -14, 250)
rname=math.random(1,500)
ScenEdit_AddUnit({side='a', type='sub', dbid=sub_type, latitude=newlat, longitude=newlong, name='sub'..rname, depth='200'})
end
ERROR: Sequence contains no matching element
"We have met the enemy and they are ours" - Commodore O.H. Perry
-
KnightHawk75
- Posts: 1850
- Joined: Thu Nov 15, 2018 7:24 pm
Re: Reusing A Random Location generator = failed
In the code the side is named "a" in the add unit call, change it back to 'USSR' or whatever your side name is for the scene, probably the issue.vettim89 wrote: Fri Mar 11, 2022 1:54 am Knighthawk,
Ran the code you supplied and got a new error. BTW, thanks as always for you help.
ERROR: Sequence contains no matching element
Re: Reusing A Random Location generator = failed
Oops. Failed to notice that. Thanks again
"We have met the enemy and they are ours" - Commodore O.H. Perry
Re: Reusing A Random Location generator = working but...
So the code has been properly debugged and is now working except for the final line of each iteration. I successfully create the subs I want but the "Assign Unit To Mission" function is failing. The script runs in the console without error message but I end up with a bunch of submarines sitting in the ocean without a mission
Code: Select all
math.randomseed(os.clock())
math.random();
local SSNA=math.random(2,4)
local SSKA=math.random(3,6)
local SSGA=math.random(1,2)
local SSNB=math.random(2,4)
local SSKB=math.random(3,6)
local SSGB=math.random(1,2)
local sub_type, subran, rname
for i=1,SSNA do
subran=math.random(1,3)
if subran==1 then sub_type='159';
elseif subran==2 then sub_type='58';
else sub_type='411';
end
newlat, newlong, ndepth = random_loc( 67, 70, -17, -14, 250)
rname=math.random(1,500)
sub=ScenEdit_AddUnit({side='USSR', type='sub', dbid=sub_type, latitude=newlat, longitude=newlong, name='sub'..rname, depth='200'})
if sub_type=='411' then
ScenEdit_AssignUnitToMission(sub.name, 'Sub Patrol C')
else
ScenEdit_AssignUnitToMission(sub.name, 'Sub Patrol A')
end
end
for i=1,SSKA do
subran=math.random(1,3)
if subran==1 then sub_type='187';
elseif subran==2 then sub_type='410';
else sub_type='250';
end
newlat, newlong, ndepth = random_loc( 67, 70, -17, -14, 250)
rname=math.random(1,500)
sub=ScenEdit_AddUnit({side='USSR', type='sub', dbid=sub_type, latitude=newlat, longitude=newlong, name='sub'..rname, depth='200'})
ScenEdit_AssignUnitToMission(sub.name, 'Sub Patrol A')
end
for i=1,SSGA do
subran=math.random(1,3)
if subran==1 then sub_type='196';
elseif subran==2 then sub_type='390';
else sub_type='110';
end
newlat, newlong, ndepth = random_loc( 67, 70, -17, -14, 250)
rname=math.random(1,500)
sub=ScenEdit_AddUnit({side='USSR', type='sub', dbid=sub_type, latitude=newlat, longitude=newlong, name='sub'..rname, depth='200'})
ScenEdit_AssignUnitToMission(sub.name, 'Sub Patrol A')
end
for i=1,SSNB do
subran=math.random(1,3)
if subran==1 then sub_type='159';
elseif subran==2 then sub_type='58';
else sub_type='411';
end
newlat, newlong, ndepth = random_loc( 64, 67, 3, 6, 250)
rname=math.random(1,500)
sub=ScenEdit_AddUnit({side='USSR', type='sub', dbid=sub_type, latitude=newlat, longitude=newlong, name='sub'..rname, depth='200'})
if sub_type=='411' then
ScenEdit_AssignUnitToMission(sub.name, 'Sub Patrol D')
else
ScenEdit_AssignUnitToMission(sub.name, 'Sub Patrol B')
end
end
for i=1,SSKB do
subran=math.random(1,3)
if subran==1 then sub_type='187';
elseif subran==2 then sub_type='410';
else sub_type='250';
end
newlat, newlong, ndepth = random_loc( 64, 67, 3, 6, 250)
rname=math.random(1,500)
sub=ScenEdit_AddUnit({side='USSR', type='sub', dbid=sub_type, latitude=newlat, longitude=newlong, name='sub'..rname, depth='200'})
ScenEdit_AssignUnitToMission(sub.name, 'Sub Patrol B')
end
for i=1,SSGB do
subran=math.random(1,3)
if subran==1 then sub_type='196';
elseif subran==2 then sub_type='390';
else sub_type='110';
end
newlat, newlong, ndepth = random_loc( 64, 67, 3, 6, 250)
rname=math.random(1,500)
sub=ScenEdit_AddUnit({side='USSR', type='sub', dbid=sub_type, latitude=newlat, longitude=newlong, name='sub'..rname, depth='200'})
ScenEdit_AssignUnitToMission(sub.name, 'Sub Patrol B')
end "We have met the enemy and they are ours" - Commodore O.H. Perry
-
KnightHawk75
- Posts: 1850
- Joined: Thu Nov 15, 2018 7:24 pm
Re: Reusing A Random Location generator = working but...
Do the missions pre-exist on the side before this code is called? Cause if not, that would happen.vettim89 wrote: Sat Mar 12, 2022 6:16 pm I successfully create the subs I want but the "Assign Unit To Mission" function is failing.
Also while probably not the issue:
1. I would use sub.guid, not sub.name
2. sub is not defined as local.
3. you could just do sub.mission = 'ValidMissionNameHere';
Re: Reusing A Random Location generator = working AHA moment.
I figured it out. I am only posting this so others may not make the same mistake
error #1: I used 'depth' not altitude. Lua did not recognize 'depth' and ignored the setting
error #2: realistic sub communications were set to on for this scenario. You cannot assign a submarine to a mission with that setting on unless they are at communications depth which I believe is above 100 ft (some one who knows for sure correct me if I am wrong here).
So I changed depth to altitude (in negative numbers) set to periscope depth and TADA the function worked!!!
error #1: I used 'depth' not altitude. Lua did not recognize 'depth' and ignored the setting
error #2: realistic sub communications were set to on for this scenario. You cannot assign a submarine to a mission with that setting on unless they are at communications depth which I believe is above 100 ft (some one who knows for sure correct me if I am wrong here).
So I changed depth to altitude (in negative numbers) set to periscope depth and TADA the function worked!!!
"We have met the enemy and they are ours" - Commodore O.H. Perry
