Re: Dos Batch Raycast - Explorer3D Beta
Posted: 27 Aug 2015 18:42
Thanks Dave!
This is the pre-release of 0.3.5. This turn only to RIGHT.
Einstein1969
This is the pre-release of 0.3.5. This turn only to RIGHT.
Code: Select all
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::
:: Dos Batch Raycast ver. 0.3.5 PreBETA by Francesco Poscetti aka einstein1969
::
::--------------------------------------------------------------------------
::
:: Ref: http://www.dostips.com/forum/viewtopic.php?f=3&t=5824
::
:: Thanks to Aacini, foxidrive, dbenham, penpen, jeb, neorobin, Liviu
::
:: Tested on Windows 7
::
:: Changelog
::
:: ver. 0.3.5 xx/yy/2015
:: - Fast rotate. We get about 3-4 FPS
:: - trick by dbenham: Player "direction of view" on map.
:: - Map more readable.
::
:: ver. 0.3 jeb 2015-08-25
:: - Improved speed by inlining the Sinus calculation (~15% on reference system)
:: - Improved speed by direct calculating the next gridX/Y coordinates (~60%)
::
:: ver. 0.2 20/08/2015 919
:: - Not clear the screen until next.
:: - Added moviment on left/ritgh and key "K" "L" for rotate.
:: - Fixed bug on calculate distance
:: - Added partial clipping on Z (Distance)
::
:: ver. 0.1 04/07/2015
:: - New faster algorithm. Not optimizated for now.
:: - Use transpose trick of penpen
:: - Use new set of character for better visualize and fast antialiasing.
:: - Detect when a player slamming against the wall.
:: - You can use WASD for move!
:: - You can view the player in the MAP.
:: - You can modify the MAP more easily.
::
:: Ver. 0.01b 10/08/2014
:: - Added temporary dir and use swapout mechanism for manage env.
::
:: Ver. 0.01a 09/08/2014
:: - Initial version + some fixes
::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@echo off
setlocal
setlocal EnableDelayedExpansion
call :Init
set /A y=1, MapsizeX=33, MapsizeY=10, MapsizeX-=1
rem Load the Map grid. 1/2=wall ./0=empty 9=player position
for %%D in (
"1212121212...2121212121.........."
"2........1...1........2..121....."
"1........21212....121.1.2...2...."
"2..................1..21.....1..."
"1...9.........................2.."
"2....1...12121................2.."
"1....2...2...2.....1..11.....1..."
"1....1...1...1....12..2.2...2...."
"2....2...2...2........1..121....."
"1212212121...1212121212.........."
) do (
set Map[!y!]=%%~D
for %%Y in (!y!) do for /L %%X in (0,1,!MapSizeX!) do (
if "!Map[%%Y]:~%%X,1!" equ "9" (
set /A nx=%%X+1
for %%Z in (!nx!) do set Map[!y!]=!Map[%%Y]:~0,%%X!0!Map[%%Y]:~%%Z!
set /A Playerx = %%X, Playery = !y!
)
)
set /A y+=1
)
set nx=
set y=
set /A MulPlayer=10000
set /A Playerx*=MulPlayer, Playery*=MulPlayer, OldPlayerx=Playerx, OldPlayery=Playery, angle1=0
call :Sin_Cos_Cos "!angle1! * PI / 180" StepY StepX dummy dummy
:loop
set /a gridX=Playerx/MulPlayer, gridy=Playery/MulPlayer
for %%X in (!gridx!) do for %%Y in (!gridy!) do if "!Map[%%Y]:~%%X,1!" geq "1" (
set /A Playerx = OldPlayerx, Playery = OldPlayery
set /P ".=%BEL%"<nul
) else (
if defined Rotate call :Sin_Cos_Cos "!angle1! * PI / 180" StepY StepX dummy dummy
rem trick by dbenham
set /a "angle1=(angle1+360)%%360"
call :raycast %Rotate%
call :drawMap
echo Press H for help.
rem echo Playerx:!Playerx! Playery:!playery! oldplayerx:!oldplayerx! oldplayery=!oldplayery!
rem echo Angle1:!angle1! gridx:!gridx! gridy:!gridy! StepX=!StepX! StepY=!StepY!
set /A OldPlayerx = Playerx, OldPlayery = Playery
)
set "Rotate="
set "oldSys=0"
rem use 'where choice' for localize choice.exe
C:\Windows\System32\choice.exe /N /C wksladzuh >nul
rem "w" UP-FORWARD
if %errorlevel% == 1 set /A "PlayerX+=StepX / 2, PlayerY+=StepY / 2"
rem "s" DOWN-BACKWARD
if %errorlevel% == 3 set /A "PlayerX-=StepX / 2, PlayerY-=StepY / 2"
rem "k" ROTATE LEFT
rem if %errorlevel% == 2 set /A angle1-=15 & set Rotate=Left
rem "l" ROTATE RIGHT
if %errorlevel% == 4 set /A angle1+=15 & set Rotate=Right
rem "a" LEFT
if %errorlevel% == 5 set /A "PlayerX+=StepY / 2, PlayerY-=StepX / 2"
rem "d" RIGHT
if %errorlevel% == 6 set /A "PlayerX-=StepY / 2, PlayerY+=StepX / 2"
if %errorlevel% == 7 set "oldSys=1"
if %errorlevel% == 9 call :Help
goto :loop
goto :eof
:raycast
echo !time: =0!> "%tmp%\raycast.t1.txt"
set/A Mul1=25, MaxIter1=500, MaxIter2=50, ti=0, from=angle1-32, to=angle1+32
set /a MM=%MulPlayer%*%Mul1%
set /A M10=%MulPlayer%*%Mul1%*10
if /I "%Rotate%" == "Left" set /A from=angle1-32, to=angle1-18
if /I "%Rotate%" == "Right" (
set /A from=angle1+18, to=angle1+32
(for /f "skip=15 tokens=*" %%f in (%tmp%\raycast.3D.txt) do echo(%%f)>"%tmp%\raycast.3D_.txt"
)
setlocal
(
for /L %%Z in (%from%,1,%to%) do (
set /A ti+=1
for %%t in (!ti!) do set sts=!sti:~0,%%t!
title !sts!
rem call :Sin_Cos_Cos "%%Z * PI / 180" aStepY aStepX "((%%Z-%Angle1%) * PI / 180)" corr
REM Sin_Cos_Cos inline for speed
(
setlocal
set "p1=%%Z * PI / 180"
set "p4=((%%Z-%Angle1%) * PI / 180)"
set /a "a=(!p1!) %% %PIx2%, b=(a>>31|1)*a"
if !b! gtr %PI32% (set /a "a=a-(a>>31|1)*%PIx2%, c=%SIN%") else (
if !b! gtr %PI_div_2% (set /a "a=(a>>31|1)*%PI%-a, c=%SIN%") else set /a "c=%SIN%")
set /a "a=(%PI_div_2%-!p1!) %% %PIx2%, b=(a>>31|1)*a"
if !b! gtr %PI32% (set /a "a=a-(a>>31|1)*%PIx2%, d=%SIN%") else (
if !b! gtr %PI_div_2% (set /a "a=(a>>31|1)*%PI%-a, d=%SIN%") else set /a "d=%SIN%")
set /a "a=(%PI_div_2%-!p4!) %% %PIx2%, b=(a>>31|1)*a"
if !b! gtr %PI32% (set /a "a=a-(a>>31|1)*%PIx2%, b=%SIN%") else (
if !b! gtr %PI_div_2% (set /a "a=(a>>31|1)*%PI%-a, b=%SIN%") else set /a "b=%SIN%")
for /F "tokens=1,2,3" %%A in ("!c! !d! !b!") do (
endlocal
set "aStepY=%%A"
set "aStepX=%%B"
set "corr=%%C"
)
)
REM Precompute how mulX/Y has to be computed
if !aStepX! equ 0 (
set "formX=set mul=%MaxIter1%" & set mulX=%MaxIter1%
) else if !aStepX! GTR 0 (
set "formX=set /a mulX=(aStepX+%MM%-(ax %% %MM%))/aStepX, mul=mulX"
) ELSE if !aStepX! LSS 0 (
set "formX=set /a mulX=-(ax %% %MM%)/aStepX+1,mul=mulX"
)
if !aStepY! equ 0 (
set "formY=" & set mulY=%MaxIter1%
) else if !aStepY! GTR 0 (
set "formY=set /a mulY=(aStepY+%MM%-(ay %% %MM%))/aStepY"
) ELSE if !aStepY! LSS 0 (
set "formY=set /a mulY=-(ay %% %MM%)/aStepY+1"
)
set /A ax = %PlayerX%*%Mul1%, ay = %PlayerY%*%Mul1%
set "BREAK=" & set /A DistanceCount=%MaxIter1%
if "%oldSys%"=="1" (
for /L %%? in (1,1,%MaxIter1%) do if not defined BREAK (
set /A ax+=aStepX, ay+=aStepY, gridX=ax/%MM%, gridY=ay/%MM%
for /f "tokens=1,2" %%X in ("!gridX! !gridY!") do if "!Map[%%Y]:~%%X,1!" geq "1" set BREAK=true & set DistanceCount=%%?
)
) ELSE (
set dis=0
for /L %%? in (1,1,20) do if not defined BREAK (
!formX!
!formY!
if !mulX! GEQ !mulY! (
set /a mul=mulY
)
set /a ax+=aStepX*mul, ay+=aStepY*mul,dis+=mul, gridX=ax/%MM%, gridY=ay/%MM%
for /f "tokens=1,2" %%X in ("!gridX! !gridY!") do if "!Map[%%Y]:~%%X,1!" geq "1" set BREAK=true & set /a DistanceCount=dis
)
)
rem if !ti! == 63 set "out=!fir! (!ax!,!ay!) (!gridX!,!gridY!) (!aStepX!,!aStepY!)"
set /A "accumul=DistanceCount*(10000/%Mul1%)"
rem Last Step
set /A "ax = (ax-aStepX)*10, ay = (ay-aStepY)*10"
set "BREAK=" & set /A DistanceCount=%MaxIter2%
if "%oldSys%"=="1" (
for /L %%? in (1,1,%MaxIter2%) do if not defined BREAK (
set /A ax+=aStepX, ay+=aStepY, gridX=ax/%M10%, gridY=ay/%M10%
for /f "tokens=1,2" %%X in ("!gridX! !gridY!") do if "!Map[%%Y]:~%%X,1!" geq "1" set BREAK=true & set DistanceCount=%%?
)
) ELSE (
set dis=0
for /L %%? in (1,1,20) do if not defined BREAK (
if !aStepX! equ 0 (set mulX=90) ELSE if !aStepX! GTR 0 (
set /a "mulX=(aStepX+%M10%-(ax %% %MM%))/aStepX"
) ELSE (
set /a "mulX=((ax %% %M10%))/-aStepX+1"
)
if !aStepY! equ 0 (set mulY=90) ELSE if !aStepY! GTR 0 (
set /a "mulY=(aStepY+%M10%-(ay %% %M10%))/aStepY"
) ELSE (
set /a "mulY=((ay %% %M10%))/-aStepY+1"
)
set mul=!mulX!
if !mulX! GEQ !mulY! (
set /a mul=mulY
)
set /a ax+=aStepX*mul, ay+=aStepY*mul,dis+=mul
set /a gridX=ax/%M10%, gridY=ay/%M10%
for /f "tokens=1,2" %%X in ("!gridX! !gridY!") do if "!Map[%%Y]:~%%X,1!" geq "1" set BREAK=true & set /a DistanceCount=dis
)
)
for /f "tokens=1,2" %%X in ("!gridX! !gridY!") do set "C=!Map[%%Y]:~%%X,1!"
set /A "distance=350/((((DistanceCount+accumul)*corr/%Mulplayer%+555)/1000)+1), len=distance*2, st=(50-len)/2"
rem 2D-clipping
if !st! lss 1 set st=1
if !st! gtr 50 set st=50
for /f "tokens=1,2" %%X in ("!st! !len!") do (
if !C! equ 1 (
if !st! gtr 23 (echo -!S_:~0,%%X!úúúúúúú!S_:~0,%%Y!_______!SP:~0,%%X!-) else (
echo -!S_:~0,%%X!°±²Û²±°!SS:~0,%%Y!°±²Û²±°!SP:~0,%%X!-
rem echo -!S_:~0,%%X!²!SC:~0,%%Y!Û!SP:~0,%%X!-
)
) else if !st! gtr 23 (echo -!S_:~0,%%X!úúúúúúú!S_:~0,%%Y!_______!SP:~0,%%X!-) else (
echo -!S_:~0,%%X!°±²Û²±°!S2:~0,%%Y!°±²Û²±°!SP:~0,%%X!-
rem echo -!S_:~0,%%X!²!S2:~0,%%Y!Û!SP:~0,%%X!-
)
)
)
)> "%tmp%\raycast.3D.txt"
endlocal
if /I "%Rotate%" == "Right" copy /Y "%tmp%\raycast.3D_.txt" /B + "%tmp%\raycast.3D.txt" /B "%tmp%\raycast.3D_.txt" >nul
rem if /I "%Rotate%" == "Left" copy /A "%tmp%\raycast.3D_.txt" + "%tmp%\raycast.3D.txt" "%tmp%\raycast.3D.txt"
if defined Rotate copy /Y /B "%tmp%\raycast.3D_.txt" "%tmp%\raycast.3D.txt" >nul
call :transpose
set /P "t1=" < "%tmp%\raycast.t1.txt"
for /F "tokens=1-8 delims=:.," %%a in ("!t1!:!time: =0!") do set /a "a=(((1%%e-1%%a)*60)+1%%f-1%%b)*6000+1%%g%%h-1%%c%%d, a+=(a>>31)&8640000"
echo Time Elapsed:!a!0ms
goto :eof
:transpose
setlocal
set /A LineN=0
:: Load and transpose data
for /f usebackq^ delims^=^ eol^= %%A in ("%tmp%\raycast.3D.txt") do (
set /A LineN+=1
set "N!LineN!=%%A"
)
set /A "MaxN=LineN-1"
set "transposedLine="
for /L %%m in (1, 1, !LineN!) do set "transposedLine=!transposedLine!^!%%^A%%m:~%%n,1^!"
rem to FIX
set/A MaxN=65
cls & for %%A in (N) do for /L %%n in (0, 1, !MaxN!) do echo(^|%transposedLine%^| %%n
endlocal
goto :eof
:drawMap
rem if not defined Rotate (
(
for /L %%Y in (1,1,!MapsizeY!) do (
for /L %%X in (0,1,!MapsizeX!) do (
if "!Map[%%Y]:~%%X,1!" geq "1" (
set /p "=Û" <nul
) else (
if !gridX! equ %%X (
rem trick by dbenham
if !gridY! equ %%Y (set /p "=!P%angle1%!" <nul) else set /p "=." <nul
) else set /p "=." <nul
)
)
echo(
)
) > "%TMP%\Raycast.Map.txt"
type "%TMP%\Raycast.Map.txt"
goto :eof
:Help
cls
echo For best view use raster font 8x8 or 16x8.
echo(
echo Use keyboard:
echo(
echo WASD for move
echo KL for turn/rotate.
echo Z for old rendering system.
echo U for redraw
echo(
pause
goto :eof
:Init
mode 80,80
color 0F
ping 127.0.0.1 -n 2 >nul
cls&echo Loading...
for /f %%i in ('forfiles /m "%~nx0" /c "cmd /c echo 0x07"') do set BEL=%%i
for /f "delims==" %%v in ('set') do if /I not "%%v" == "TMP" if /I not "%%v" == "BEL" set %%v=
rem 0123456789012345678901234567890123456789012345678901234567890123456789
set "sti=||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
set "SS=°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°"
set "SC=///////////////////////////////////////////////////////////////////////"
set "S2=±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±"
set "S_=úúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúú"
set "SP=_______________________________________________________________________"
set /a "PI=(35500000/113+5)/10, PI_div_2=(35500000/113/2+5)/10, PIx2=2*PI, PI32=PI+PI_div_2"
set "SIN=(a-a*a/1920*a/312500+a*a/1920*a/15625*a/15625*a/2560000-a*a/1875*a/15360*a/15625*a/15625*a/16000*a/44800000)"
rem trick by dbenham
:: Define player characters:
for %%# in (
"345 0 15 >"
" 30 45 60 \"
" 75 90 105 v"
"120 135 150 /"
"165 180 195 <"
"210 225 240 \"
"255 270 285 ^"
"300 315 330 /"
) do for /f "tokens=1-4" %%A in (%%#) do (
set "P%%A=%%D"
set "P%%B=%%D"
set "P%%C=%%D"
)
goto :eof
::::::::::::::::::::::::::::::::::: TRIGONOMETRIC FUNCTIONS
:Sin_Cos_Cos rad*10000 return_var*10000 rem RADIANT
setlocal
set /a "a=(%~1) %% %PIx2%, b=(a>>31|1)*a"
if !b! gtr %PI32% (set /a "a=a-(a>>31|1)*%PIx2%, c=%SIN%") else (
if !b! gtr %PI_div_2% (set /a "a=(a>>31|1)*%PI%-a, c=%SIN%") else set /a "c=%SIN%")
set /a "a=(%PI_div_2%-%~1) %% %PIx2%, b=(a>>31|1)*a"
if !b! gtr %PI32% (set /a "a=a-(a>>31|1)*%PIx2%, d=%SIN%") else (
if !b! gtr %PI_div_2% (set /a "a=(a>>31|1)*%PI%-a, d=%SIN%") else set /a "d=%SIN%")
set /a "a=(%PI_div_2%-%4) %% %PIx2%, b=(a>>31|1)*a"
if !b! gtr %PI32% (set /a "a=a-(a>>31|1)*%PIx2%, b=%SIN%") else (
if !b! gtr %PI_div_2% (set /a "a=(a>>31|1)*%PI%-a, b=%SIN%") else set /a "b=%SIN%")
(endlocal & set "%2=%c%" & set "%3=%d%" & set "%5=%b%")
goto :eof
Einstein1969