我正在編寫一個桌面RPG的商店生成器。根據您選擇的派系生成不同的內容,隨機確定店鋪的效果(差,平均,好,優),然後隨機確定店內物品的數量。我可以在批量顯示中將負值設置爲0嗎?
但是爲了使某些物品或多或少顯示出來,我將它設置爲擁有3d6-5箭頭,這會導致至少-2和最多13個箭頭。當然,商店不能有-2個箭頭。是否有任何方法可以爲變量設置最小和最大範圍,但是0最小,或者將任何負值顯示爲0?
我正在編寫一個桌面RPG的商店生成器。根據您選擇的派系生成不同的內容,隨機確定店鋪的效果(差,平均,好,優),然後隨機確定店內物品的數量。我可以在批量顯示中將負值設置爲0嗎?
但是爲了使某些物品或多或少顯示出來,我將它設置爲擁有3d6-5箭頭,這會導致至少-2和最多13個箭頭。當然,商店不能有-2個箭頭。是否有任何方法可以爲變量設置最小和最大範圍,但是0最小,或者將任何負值顯示爲0?
if %val% lss 0 set /a val=0
是單向的
這裏有一個更全面的版本:
@ECHO OFF
SETLOCAL
SET val=5
ECHO ==== :setlt =====
CALL :setlt val 3&CALL :showval %val% val
CALL :setlt val 6&CALL :showval %val% val
CALL :setlt val 5&CALL :showval %val% val
CALL :setlt val 3 27&CALL :showval %val% val
CALL :setlt val 6 1&CALL :showval %val% val
CALL :setlt val 5 11&CALL :showval %val% val
ECHO ==== :setgt =====
CALL :setgt val 3&CALL :showval %val% val
CALL :setgt val 6&CALL :showval %val% val
CALL :setgt val 5&CALL :showval %val% val
CALL :setgt val 3 27&CALL :showval %val% val
CALL :setgt val 6 1&CALL :showval %val% val
CALL :setgt val 5 11&CALL :showval %val% val
ECHO ==== :setra =====
CALL :setra val 3 8&CALL :showval %val% val
CALL :setra val 8 11&CALL :showval %val% val
CALL :setra val 2 4&CALL :showval %val% val
CALL :setra val 3 8 6&CALL :showval %val% val
CALL :setra val 8 11 6&CALL :showval %val% val
CALL :setra val 2 4 6&CALL :showval %val% val
CALL :setra val 3 8 6 7 &CALL :showval %val% val
CALL :setra val 8 11 6 7&CALL :showval %val% val
CALL :setra val 2 4 6 7&CALL :showval %val% val
CALL :setra val 3 8 "" 6&CALL :showval %val% val
CALL :setra val 8 11 "" 6&CALL :showval %val% val
CALL :setra val 2 4 "" 6&CALL :showval %val% val
ECHO ==== add some extras =====
SET val=20&CALL :disp val 1 8 "" "" "The strange die rolls "
SET val=-4&CALL :disp val 0 8 "" "" "" "ghouls flee in fear"
SET val=-4&CALL :disp val 0 8 "" "" "There are " "arrows in stock"
SET val=-4&CALL :dispgz val 0 8 "" "" "There are " "arrows in stock"
SET val=14&CALL :dispgz val 0 8 "" "" "There are " "arrows in stock"
GOTO :EOF
:: set a variable %1 to %3 if it is less than %2
:setlt
CALL SET $1=%%%1%%
IF %$1% lss %2 SET "%1=%~3"
IF NOT DEFINED %1 SET "%1=%~2"
goto :eof
:: set a variable %1 to %3 if it is greater than %2
:setgt
CALL SET $1=%%%1%%
IF %$1% gtr %2 SET "%1=%~3"
IF NOT DEFINED %1 SET "%1=%~2"
goto :eof
:: set a variable %1 to %4 if it is less than %2 or %5 if it is greater than %3
:setra
CALL ECHO if %%%1%% .lt. %2 SET to "%~4" IF %%%1%% .gt. %3 to "%~5"
CALL :setlt %1 %2 %~4
CALL :setgt %1 %3 %5
goto :eof
:showval
CALL ECHO value was %1 is now %%%2%%
SET %2=%1
GOTO :eof
:: Display with limits.
:disp
setlocal
CALL SET $2=%%%1%%
CALL :setra $2 %2 %3 "%~4" "%~5"
ECHO %~6%$2% %~7
endlocal
GOTO :eof
:: Display with limits - but only if resolved value is greater than zero
:dispgz
setlocal
CALL SET $2=%%%1%%
CALL :setra $2 %2 %3 "%~4" "%~5"
IF %$2% gtr 0 ECHO %~6%$2% %~7
endlocal
GOTO :eof
下面是輸出:
==== :setlt =====
value was 5 is now 5
value was 5 is now 6
value was 5 is now 5
value was 5 is now 5
value was 5 is now 1
value was 5 is now 5
==== :setgt =====
value was 5 is now 3
value was 5 is now 5
value was 5 is now 5
value was 5 is now 27
value was 5 is now 5
value was 5 is now 5
==== :setra =====
if 5 .lt. 3 SET to "" IF 5 .gt. 8 to ""
value was 5 is now 5
if 5 .lt. 8 SET to "" IF 5 .gt. 11 to ""
value was 5 is now 8
if 5 .lt. 2 SET to "" IF 5 .gt. 4 to ""
value was 5 is now 4
if 5 .lt. 3 SET to "6" IF 5 .gt. 8 to ""
value was 5 is now 5
if 5 .lt. 8 SET to "6" IF 5 .gt. 11 to ""
value was 5 is now 6
if 5 .lt. 2 SET to "6" IF 5 .gt. 4 to ""
value was 5 is now 4
if 5 .lt. 3 SET to "6" IF 5 .gt. 8 to "7"
value was 5 is now 5
if 5 .lt. 8 SET to "6" IF 5 .gt. 11 to "7"
value was 5 is now 6
if 5 .lt. 2 SET to "6" IF 5 .gt. 4 to "7"
value was 5 is now 7
if 5 .lt. 3 SET to "" IF 5 .gt. 8 to "6"
value was 5 is now 5
if 5 .lt. 8 SET to "" IF 5 .gt. 11 to "6"
value was 5 is now 8
if 5 .lt. 2 SET to "" IF 5 .gt. 4 to "6"
value was 5 is now 6
==== add some extras =====
if 20 .lt. 1 SET to "" IF 20 .gt. 8 to ""
The strange die rolls 8
if -4 .lt. 0 SET to "" IF -4 .gt. 8 to ""
0 ghouls flee in fear
if -4 .lt. 0 SET to "" IF -4 .gt. 8 to ""
There are 0 arrows in stock
if -4 .lt. 0 SET to "" IF -4 .gt. 8 to ""
if 14 .lt. 0 SET to "" IF 14 .gt. 8 to ""
There are 8 arrows in stock
而現在我可以自由地胡扯了一下.. 。
Afte R時val
至5中,存在的基本格式
CALL :setlt val 3&CALL :showval %val% val
例程:showval
顯示val
的電流值的許多行,然後將其復位到其原始值。這樣一來,我可以報告前CALL
的結果並重置價值,任何價值,我選擇(但我沒有使用該功能...)
的:setlt
調用的參數是可變的,限制, forced_value - 其中forced_value
是可選的。如果未指定強制值,則將使用限制。
所以:setlt
與val 3
將其當前價值是less than 3
的val
值設置爲3
參數 - 但如果參數爲val 6 1
那麼如果val
當前值小於6
,將其值改爲1
。
因此,:showval
例程顯示每種情況下的結果,然後將val
重置爲5
。
:setgt
與此類似,只需設置當前值爲greater than
而不是less than
時的值。
下一頁組是具有參數var minval maxval forceifltmin forceifgtmax
的:setra
- 唯一的扭結是如果不使用forceifltmin
但forceiflmax
是使用,那麼forceifltmin
必須是空的參數(""
)。
我已經在:setra
的開頭添加了call echo...
行,純粹是爲了顯示發生了什麼 - 它對調試很有用。只需REM
或::
該行,以便您可以打開或關閉調試。
(提示:與調試線,你可以嘗試
set "debug=REM "
%debug%echo this is a debug line
只需設置debug
要麼REM
或沒有把你的調試線或關閉)
最後是:disp
和:dispgz
程序。這些是非常不同的。他們故意不要更改變量的值,並設計爲顯示該值,就好像它在範圍內一樣,還有另外兩個參數 - 兩個可選參數都是text-before和text-after值。兩者應提供"quoted"
。
這次只需要顯示text-before
值text-after
,這樣您就可以構建如圖所示的消息。
如果你不想顯示包含應用範圍的檢查是>0
然後用:dispgz
@Magoo感謝脫線後,除非值的值線,你真的讓我的「DM自動工具套件」項目實際上是可能的:)真的,你已經幫助過Character Creator,Random Encounter Generator和Shop Generator。我對你對這個套件其他部分的激烈問題的迴應作了前言。 –
@ashatte其實它確實提供了我的問題的答案,並完美地工作。問題? –
@SeanMcLain沒問題,只是習慣了審查過程。對不起。 – ashatte