1

我制作了一个角色文件,我的游戏从中提取数据和变量。看起来像这样:

playerName= Marche
playerRace= Elf
playerHP= 100
playerSPD= 200
playerATK= 120
playerDEF= 70

最终幻想参考任何人...?无论如何,当角色升级时,我需要一个批处理脚本来找到字符串“playerHP=100”。playerHP在脚本中设置为变量。基本上,它会占用当前的生命值,并将其乘以 120%,从而增加数量。如何回显该数学的结果以替换当前数字?

例如,如果这没有任何意义,我有 100 生命值。我升级了,因此我的生命值增加了 120%,所以现在我有 120 点生命值。我想找到字符串“playerHP = 100”并将其替换为“playerHP = 120”。

如果可以避免,我不想下载任何其他命令(我已经看过 sed 几次)。非常感谢

编辑:我没有搜索字符串并替换,而是接受了 jeb 的建议,只是删除了文件并重新回显了所有数据。它最终看起来像这样:

set /a LeveledUpPlayerHP=(%ppHP%* 12) / (10)
set /a LeveledUpPlayerSPD=(%ppSPD%* 12) / (10)
set /a LeveledUpPlayerATK=(%ppATK%* 12) / (10)
set /a LeveledUpPlayerDEF=(%ppDEF%* 12) / (10)
echo Updating stats...
del "C:\Users\%USERNAME%\Desktop\CMDRPG\player\playerData.dll
ping 1.1.1.1 -n 1 -w 500 > nul
echo playerName= %playerName%>playerData.dll
echo playerRace= %playerRace%>>playerData.dll
echo playerHP= %LeveledUpPlayerHP%>>playerData.dll
echo playerSPD= %LeveledUpPlayerSPD%>>playerData.dll
echo playerATK= %LeveledUpPlayerATK%>>playerData.dll
echo playerDEF= %LeveledUpPlayerDEF%>>playerData.dll

playerName 和 playerRace 都在这部分代码之前加载。Ping 仅用作等待功能,让文件在回显新数据之前删除。似乎工作正常。谢谢大家

4

3 回答 3

2

据推测,值出现在文件中的顺序无关紧要。如果是这样,那么以下内容将有效地“编辑”您的文件。

它首先使用 FINDSTR 来隔离当前 playerHP 值,并使用 FOR /F 从字符串中解析出该值。SET /A 增加玩家的HP。然后使用 FINDSTR 创建一个新文件来写入playerHP 之外的所有当前值,然后将新的 playerHP 信息附加到末尾。

@echo off
set "file=gameData.txt"
for /f "tokens=2 delims==" %%N in ('findstr /bl "playerHP=" "%file%"') do set /a "newHP=%%N*120/100"
>"%file%.mod" (
  findstr /blv "playerHP=" "%file%"
  echo playerHP=%newHP%
)
move /y "%file%.mod" "%file%" >nul

但是为什么要这么麻烦。我应该认为您已经将内存中的所有值作为环境变量。只需确保要存储在文件中的所有变量都以通用唯一前缀开头。在您的示例中,它们都以“玩家”开头,但您可能想要更通用的东西 - 可能是像 # 这样的符号。所以你可以有#playerName、#playerRace等。

只需根据需要更新内存中的值。当需要将当前游戏状态保存到文件时,您需要做的就是

>"gameData.txt" set #

每次都会创建一个包含所有当前值的全新文件。

要加载这些值,您完全按照 jeb 的建议进行操作:

for /f "usebackq delims=" %%A in ("gameData.txt") do set %%A
于 2013-08-06T17:22:04.870 回答
2

试试这个(输出在%inifile%.new):

@ECHO OFF &SETLOCAL ENABLEDELAYEDEXPANSION
SET "inifile=file"

FOR /f %%a IN ('^<"%inifile%" find /c /v ""') DO SET /a lines=%%a
< "%inifile%" (
FOR /l %%a IN (1,1,%lines%) DO (
    SET "line="
    SET /p "line="
    IF NOT "!line:playerHP=!"=="!line!" (
        FOR /f "tokens=2delims= " %%b IN ("!line!") DO SET /a HP=%%b*12/10
        SET "line=playerHP= !HP!"
    )
    ECHO(!line!
))>"%inifile%.new"

输入输出:

>类型文件
playerName=马尔凯
playerRace=精灵
玩家HP= 100
玩家SPD= 200
玩家攻击= 120
玩家防御= 70

>test.bat

>类型文件.new
playerName=马尔凯
playerRace=精灵
玩家HP= 120
玩家SPD= 200
玩家攻击= 120
玩家防御= 70
于 2013-08-06T16:45:47.507 回答
1

要将数据保存在文件中,您可以使用类似的块

(
  echo playerName=%playerName%
  echo playerRace=%playerRace%
  echo playerHP=%playerHP%
) > player.ini

并加载它你可以使用

for /F "delims=" %%L in (player.ini) do set "%%L"
于 2013-08-06T16:51:11.350 回答