精华内容
下载资源
问答
  • 注意:如果只需要perl代码,则可以跳到本文的结尾。... 我将向您展示如何使用Perl脚本执行此操作。 你需要什么 任何最新版本的perl(5.06或更高版本都可以)和一台用于运行脚本的服务器。 最好使用...

    注意:如果只需要perl代码,则可以跳到本文的结尾。

    介绍

    许多网站都有您可以用来下载文件的表格或链接。 您单击一个表单按钮或单击一个链接,一两分钟后,您的Web浏览器中会弹出一个文件下载对话框,并提示您输入一些说明,例如“打开”或“保存”。 我将向您展示如何使用Perl脚本执行此操作。

    你需要什么

    任何最新版本的perl(5.06或更高版本都可以)和一台用于运行脚本的服务器。 最好使用允许您将文件存储在Web根目录之上的服务器,但这不是必需的。 稍微了解一下HTML会有所帮助,但这不是必需的。 通常,您将脚本上载到cgi-bin文件夹中,并将文件权限设置为755。服务器上载脚本的文件夹和权限可能会有所不同。

    Perl代码

    几乎所有作为CGI进程运行的perl脚本都需要以shebang行开头。 最常见的shebang行是:

    #!/usr/bin/perl
    它只是告诉服务器在哪里可以找到perl。 您的服务器所需的shebang行可能有所不同。 大多数网络主机会将这些信息发布在其网站的某个位置。 为了获得良好的perl编码实践和CGI安全性,我们将在shebang行上添加一个开关:-T。 注意:它必须是大写的T。
    #!/usr/bin/perl -T
    T代表“异味”模式。 作为脚本的程序员,这实际上是为了防止您犯一个可怕的错误,并允许CGI表单的用户将数据发送到服务器,而该数据可能以不安全的方式使用。 作为CGI进程运行的所有perl脚本都应使用-T开关,因此我将其包括在内。 模组

    模块有点像可以在perl程序中使用的单独的perl程序。 许多人编写的模块已成为其他perl程序员一直使用的标准。 我们将使用以下模块:

    
    use strict;
    use warnings;
    use CGI;
    # Uncomment the next line only for debugging the script.
    #use CGI::Carp qw/fatalsToBrowser/; 
    前两个实际上不是模块,它们是实用程序。 它们会影响perl本身的功能。 在本文中,我不会对其进行解释。 您需要相信我,它们在几乎所有perl程序中都非常重要。 “ CGI”模块是将为我们完成大部分工作的模块:处理表单数据,打印http标头等。 “ CGI :: Carp”模块确实用于调试,如果有问题,可以帮助您使脚本运行。 如果有任何致命错误导致脚本失败,它将在屏幕上显示一条错误消息。 这些错误也将在服务器错误日志中打印出来。

    程序的后两行建立了一些重要参数:

    
    $CGI::POST_MAX = 1024;
    $CGI::DISABLE_UPLOADS = 1; 
    “ POST_MAX”以字节为单位设置将被视为过多数据的最大限制,并导致脚本返回错误。 我将此限制设置为较低(1 kb),因为此脚本需要发送给它的数据很少。 第二行告诉脚本不接受文件上传。 有道理,因为我们要下载文件,而不是上传文件。 这样可以防止用户尝试使用更改后的格式将文件发送到您的脚本。 可以保存所有表单并更改HTML代码,并且用户可以将所需的任何内容发送到脚本,这取决于您是否要在服务器端进行。 用户所做的一切完全不受您的控制。 设置路径和选项
    
    ####################################
    #### User Configuration Section ####
    #################################### 
    # The path to where the downloadable files are. 
    # Preferably this should be above the web root folder.
    my $path_to_files = '/home/user/downloads/'; 
    # The path to the error log file
    my $error_log     = '/home/user/downloads/logs/errors.txt'; 
    # Option to log errors: 1 = yes, 0 = no
    my $log           = 1; 
    # To prevent hot-linking to your script
    my $url = 'http://www.yoursite.com';
    ########################################
    #### End User Configuration Section ####
    ######################################## 
    $ path_to_files是存储要下载文件的目录。 我建议您将它们存储在无法通过Web访问的文件夹中。 通常可以通过将它们放在与根Web文件夹平行的文件夹(public_html或www)中或上方的文件夹中来完成。

    $ error_log是errors.txt文件的路径,该文件记录了脚本生成的错误。

    $ log打开或关闭错误日志。

    $ url应该是您网站的名称,包括“

    http://”部分。 创建CGI对象
    my $q = CGI->new;
    $ q是我们将用于执行CGI模块的各种方法的对象。 我喜欢将其视为管家。 您告诉管家您想要什么,他知道如何完成,您不必担心细节。 我们的“管家”,$ q,将知道如何处理我们给他的“命令”。

    实际上,CGI模块具有许多您可以赋予“管家”的“命令”。 我们将使用其中一些。 学习使用CGI模块几乎就像学习小型编程语言一样。 但是美丽之处在于您只需要知道命令的功能,而不是命令的方式即可。 就像真正的男管家一样,您必须相信他知道他在做什么,并且可以高效,高效地完成工作,而无需顾虑。 我建议您花些时间阅读CGI模块文档,即使您不太了解CGI模块文档,至少也应该熟悉基本的表单处理方法。 我留给你。

    安全检查站

    当将脚本作为CGI运行时,请不要低估对安全性的需求。 我们将使用三个“检查点”来检测任何可疑活动。 第一个是要检查发送到脚本的数据量。 我们将cgi_error()命令传递给值得信赖的男管家“ $ q”,他将返回响应$ error。 “ 413”表示已超过我们为$ CGI :: POST_MAX设置的限制,因此我们将检查该响应。 注意:在整篇文章中,我交替使用命令和方法来表示同一件事。

    
    if (my $error = $q->cgi_error()){
       if ($error =~ /^413\b/o) {
          error('Maximum data limit exceeded.');
       }
       else {
          error('An unknown error has occured.'); 
       }
    } 
    接下来,我们检查是否有人尝试将文件上传到脚本。 为了发送文件,必须在CGI表单的“实体”属性中使用“多部分/表单数据”。
    
    if ($ENV{'CONTENT_TYPE'} =~ m|^multipart/form-data|io ) {
       error('Invalid Content-Type : multipart/form-data.')
    } 
    接下来,我们检查使用脚本的请求是否来自您的网站。
    if ($ENV{'HTTP_REFERER'} && $ENV{'HTTP_REFERER'} !~ m|^\Q$url|io) {
       error('Access forbidden.')
    }
    获取文件名

    我将使用Vars方法将发送到脚本的所有参数转换为哈希值。 再次,我们调用“ $ q”进行实际工作。

    my %IN = $q->Vars;
    现在,我们确保有一个名为“ file”的参数。
    my $file = $IN{'file'} or error('No file selected.');
    验证,验证,验证

    您说的还不够,必须验证发送到CGI脚本的所有数据。 如果我们只允许将任何内容发送到脚本,则有人可以发送以下内容:/ foo / bar并根据您附加的路径,脚本会乖乖地去查找foo目录并下载bar文件。 当然,人们可以尝试做一些更糟糕的事情,但这不是有关如何使用前门入侵网站的文章。 为了防止用户摆脱这种危险的特技,我们需要验证发送到脚本的数据。

    
    if ($file =~ /^(\w+[\w.-]+\.\w+)$/) {
       $file = $1;
    }
    else {
       error('Invalid characters in filename.');
    }     
    该代码中看起来很神秘的部分($ file =〜/^(\w+[\w.-]+\.\w+)$/)被称为正则表达式(regexp)。 通常,正则表达式是用于验证/过滤表单数据的内容。 正则表达式已经超出了本文的范围。 如果您有兴趣了解该正则表达式,则必须阅读一些正则表达式教程。 请参阅文章末尾的在线资源。 基本上,它正在检查数据是否是这样的:frog.gif,puppy-dog.jpg或meatloaf.txt。 它以基本文件名格式filename.ext检查受限制的字符集“ a-zA-Z0-9_-。”,并拒绝其他任何无效字符。

    上面的代码也“保留”了数据。 由于数据将用于打开服务器上的文件,因此我们必须取消对该文件的污染,以满足–T开关的要求,即我们没有做任何不安全的事情。 取消污染数据的唯一方法是使用正则表达式。 正则表达式中的括号将模式匹配存储在内存中,我们使用$ 1获得该值。 然后,我们将值分配回变量$ file,现在将用于打开文件的数据位于脚本的内部,并且–T开关将认为它可以安全使用。 由您决定验证/过滤足以完成任务。 例如,如果您在regexp /(.*)/中使用了此模式,则-T开关不会抱怨,但是数据将像在表单中输入或通过超链接一样发送到脚本中。 那将是一件愚蠢的事。

    如果数据未通过验证例程,则会将一条消息发送到错误子例程,并向用户发出警报。

    准备下载
    download($file) or error('An unknown error has occured.');
    如果文件下载失败,则会将一条消息发送到错误子例程,并向用户发出警报。 download()子例程
    
    sub download {
       my $file = $_[0] or return(0); 
       # Uncomment the next line only for debugging the script 
       #open(my $DLFILE, '<', "$path_to_files/$file") or die "Can't open file '$path_to_files/$file' : $!"; 
       # Comment the next line if you uncomment the above line 
       open(my $DLFILE, '<', "$path_to_files/$file") or return(0); 
       # this prints the download headers with the file size included
       # so you get a progress bar in the dialog box that displays during file downloads. 
       print $q->header(-type            => 'application/x-download',
                        -attachment      => $file,
                        -Content_length  => -s "$path_to_files/$file",
       ); 
       binmode $DLFILE;
       print while <$DLFILE>;
       undef ($DLFILE);
       return(1);
    } 
    子例程的第一行获取文件名或将0(零)返回给调用方以指示失败。 有两行打开文件,一行用于调试目的,一行用于在一切正常运行时运行脚本。 代码的下一部分将显示使Web浏览器下载文件而不是尝试显示文件的标头。
    
       print $q->header(-type            => 'application/x-download',
                        -attachment      => $file,
                        -Content_length  => -s "$path_to_files/$file",
       ); 
    header()方法中的“ type”选项是导致下载的特定标题。

    “附件”选项定义要下载的文件的名称。 您可以给文件指定任何名称,而不必是实际的文件名。 如果您有理由隐藏文件的真实名称,或者需要为下载的文件提供真实名称以外的其他名称,则这可能很有用。 “ Content-length”选项使用–s文件测试操作符来获取文件的大小。 这允许文件下载对话框显示文件大小和进度条,并估计完成文件下载所需的时间。

    子例程的最后四行完成了下载过程。

    
       binmode $DLFILE;
       print while <$DLFILE>;
       undef ($DLFILE);
       return(1); 
    binmode()函数告诉perl以“二进制”模式传输文件。 使用二进制模式将在接收端损坏文件的可能性很小。 但是通常使用它没有问题,在某些情况下有必要。 如果在使用binmode时遇到问题,请删除或注释掉该行。 有关更多详细信息,请参见binmode函数文档。 “打印”行实际上是将文件从服务器传输到客户端的行。 “ undef”关闭文件,因为我使用了间接文件句柄。 我们在子例程末尾返回1(一)以指示成功。 子程序

    “错误”子例程非常简单。 它使用一些html生成方法来打印基本的html文档,该文档显示了我们发送给它的错误消息,存储在$ _ [0]中。 CGI模块文档中讨论了每种方法。 如果您打开了错误日志记录,则也会调用“ log_error”函数。

    
    sub error {
       print $q->header(-type=>'text/html'),
             $q->start_html(-title=>'Error'),
             $q->h3("Error: $_[0]"),
             $q->end_html;
       log_error($_[0]) if $log;
       exit(0);
    } 
    接下来是“ log_error”子例程。 可以检测到脚本检测到的每个错误,因此您可以查看站点的访问者如何滥用脚本。 这是值得跟踪的好信息。 可能矫over过正,但我​​坚信跟踪错误,因为它们可以帮助您编写更安全的脚本并向您发出警告,让您注意僵尸程序或试图滥用该脚本的人。 它将错误和一些其他信息附加到文件中。 我个人喜欢记录发送到脚本的名称/值对,以查看用户是否更改了表单或查询字符串。 这些值将在$ params中,格式如下:“ name =” value ::: name = value ::: name = value”。 “ scalar localtime()”为您带来方便,因此您可以轻松读取错误的日期/时间。 “时间”以纪元秒为单位记录日期/时间,这是记录日期/时间的标准方法,因此计算机程序和脚本可以理解它。 最终由您决定如何处理此信息。 我建议您不时检查一次错误日志。 您可以将其删除,脚本将创建一个新的脚本。 或者完全在脚本的“用户配置”部分中关闭错误日志记录。
    
    sub log_error {
       my $error = $_[0]; 
       # Uncomment the next line only for debugging the script
       #open (my $log, ">>", $error_log) or die "Can't open error log: $!"; 
       # Comment the next line if you uncomment the above line
       open (my $log, ">>", $error_log) or return(0); 
       flock $log,2;
       my $params = join(':::', map{"$_=$IN{$_}"} keys %IN) || 'no params';
       print $log '"', join('","',time, 
                          scalar localtime(),
                          $ENV{'REMOTE_ADDR'},
                          $ENV{'SERVER_NAME'},
                          $ENV{'HTTP_HOST'},
                          $ENV{'HTTP_REFERER'},
                          $ENV{'HTTP_USER_AGENT'},
                          $ENV{'SCRIPT_NAME'},
                          $ENV{'REQUEST_METHOD'},
                          $params,
                          $error),
                          "\"\n";
    } 
    介面

    剩下要做的唯一决定就是如何允许您网站的访问者访问下载脚本。 您可以使用超链接或HTML表单或两者的某种组合。 您可以让另一个脚本(甚至相同的脚本)生成该接口。 基本概念是将下载文件的名称传递给下载脚本。 使用超链接的示例:

    <a href=”cgi-bin/download.pl?file=frog.jpg”>Download the Frog Image</a>
    我将由您自己来发现创建下载脚本接口的其他方法。 结论

    这是一个非常基本的脚本。 您可以向脚本添加更多功能,例如,添加一个计数器文件,该计数器文件跟踪每个文件的下载次数。 您可以添加身份验证,以便您的用户必须登录才能下载文件。 您可以将脚本绑定到数据库,而不是将文件存储在服务器上。

    凯文(又名KevinADC)

    本文受《

    创用CC许可 资源 Perldoc网站所有在线perl文档。 CGI.pm CGI模块文档(在perldoc上)。 搜索CPAN综合Perl存档网络。 巨大的Perl模块存储库

    和更多。

    CGI安全性CGI安全性入门。 完整的脚本
    
    #!/usr/bin/perl -T 
    ## Load pragmas and modules
    use strict;
    use warnings;
    use CGI;
    # Uncomment the next line only for debugging the script.
    #use CGI::Carp qw/fatalsToBrowser/; 
    # The next two lines are very important. Do not modify them
    # if you do not understand what they do.
    $CGI::POST_MAX = 1024;
    $CGI::DISABLE_UPLOADS = 1;   
    ####################################
    #### User Configuration Section ####
    #################################### 
    # The path to where the downloadable files are. 
    # Prefereably this should be above the web root folder.
    my $path_to_files = '/home/user/downloads/'; 
    # The path to the error log file
    my $error_log     = '/home/user/downloads/logs/errors.txt'; 
    # Option to log errors: 1 = yes, 0 = no
    my $log           = 1; 
    # To prevent hot-linking to your script
    my $url = 'http://www.yoursite.com'; 
    ####################################
    ## End User Configuration Section ##
    #################################### 
    # Edit below here at your own risk 
    my $q = CGI->new; 
    ######################################
    ## This section checks for a number ##
    ## of possible errors or suspicious ##
    ## activity.                        ##
    ###################################### 
    # check to see if data limit is exceeded
    if (my $error = $q->cgi_error()){
       if ($error =~ /^413\b/o) {
          error('Maximum data limit exceeded.');
       }
       else {
          error('An unknown error has occured.'); 
       }
    } 
    # Check to see if the content-type is acceptable.
    # multipart/form-data indicates someone is trying
    # to upload data to the script with a hacked form.
    # $CGI_DISABLE_UPLOADS prevents uploads. This routine
    # is to catch the attempt and log it. 
    if ($ENV{'CONTENT_TYPE'} =~ m|^multipart/form-data|io ) {
       error('Invalid Content-Type : multipart/form-data.')
    }        
    # Check if the request came from your website, if not
    # it indicates remote access or hot linking.
    if ($ENV{'HTTP_REFERER'} && $ENV{'HTTP_REFERER'} !~ m|^\Q$url|io) {
       error('Access forbidden.')
    } 
    ################################
    ## End error checking section ##
    ################################ 
    # Get the data sent to the script.
    my %IN = $q->Vars; 
    # Parse the "file" paramater sent to the script.
    my $file = $IN{'file'} or error('No file selected.'); 
    # Here we untaint the filename and make sure there are no characters like '/' 
    # in the name that could be used to download files from any folder on the website.
    if ($file =~ /^(\w+[\w.-]+\.\w+)$/o) {
       $file = $1;
    }
    else {
       error('Invalid characters in filename.');
    }     
    # Check if the download succeeded
    download($file) or error('An unknown error has occured.');  
    #################
    ## SUBROUTINES ##
    ################# 
    # download the file
    sub download {
       my $file = $_[0] or return(0); 
       # Uncomment the next line only for debugging the script 
       #open(my $DLFILE, '<', "$path_to_files/$file") or die "Can't open file '$path_to_files/$file' : $!"; 
       # Comment the next line if you uncomment the above line 
       open(my $DLFILE, '<', "$path_to_files/$file") or return(0); 
       # This prints the download headers with the file size included
       # so you get a progress bar in the dialog box that displays during file downlaods. 
       print $q->header(-type            => 'application/x-download',
                        -attachment      => $file,
                        'Content-length' => -s "$path_to_files/$file",
       ); 
       binmode $DLFILE;
       print while <$DLFILE>;
       undef ($DLFILE);
       return(1);
    } 
    # This is a very generic error page. You should make a better one.
    sub error {
       print $q->header(-type=>'text/html'),
             $q->start_html(-title=>'Error'),
             $q->h3("Error: $_[0]"),
             $q->end_html;
       log_error($_[0]) if $log;
       exit(0);
    } 
    # Log the error to a file
    sub log_error {
       my $error = $_[0]; 
       # Uncomment the next line only for debugging the script
       #open (my $log, ">>", $error_log) or die "Can't open error log: $!"; 
       # Comment the next line if you uncomment the above line
       open (my $log, ">>", $error_log) or return(0); 
       flock $log,2;
       my $params = join(':::', map{"$_=$IN{$_}"} keys %IN) || 'no params';
       print $log '"', join('","',time, 
                          scalar localtime(),
                          $ENV{'REMOTE_ADDR'},
                          $ENV{'SERVER_NAME'},
                          $ENV{'HTTP_HOST'},
                          $ENV{'HTTP_REFERER'},
                          $ENV{'HTTP_USER_AGENT'},
                          $ENV{'SCRIPT_NAME'},
                          $ENV{'REQUEST_METHOD'},
                          $params,
                          $error),
                          "\"\n";
    }

    From: https://bytes.com/topic/perl/insights/857373-how-make-file-download-script-perl

    展开全文
  • HowTo如何制作一个文字冒险游戏-里篇(2)逐条解析脚本文件-附件资源
  • Linux,Unix,MacOS上如何制作命令脚本可执行文件 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:programmers deserve love 前言 我经常遇到这样的情况...

    Linux,Unix,MacOS上如何制作命令脚本可执行文件


    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    原文链接programmers deserve love



    前言

    我经常遇到这样的情况,完成某项任务的时候要机械性地在terminal/shell里输入一系列的命令,每次完成的时候输入的命令几乎一样,唯独一些参数不同。如果某个命令或者脚本软件长时间不用的话,会忘掉用法,每次都去查的话又很麻烦。这种时候,我倾向于自己写一个脚本文件,再想做同样的操作的话,只需要一行命令执行这个脚本文件,通过自己编写的对话式脚本给的提示,输入相对应的参数,再一回车就ok了。

    案例

    每次在本地的git仓库更改内容,都要输入三条以上的命令才能上传到github上,每次的命令几乎一样,还容易忘记具体用法。我就以github的上传更新为例写一个脚本。

    通常做法

    直接上命令行(本地文档名为test)

    $ cd test
    
    $ git add .
        
    $ git commit -m "2019-09-10-22" #带引号的信息是本次commit的专有信息,每次都不同。
    
    $ git push -u origin master
    

    每次都是这几条命令,唯一变得只有引号部分的commit信息。

    脚本文件

    git add .
    echo -e "\x1B[1;36m add a commit message \x1B[0m"
    read msg
    git commit -m "$msg"
    git push -u origin master
    
    

    Point:

    • 文件名后缀:.sh
    • echo -e "" -e把字段里的反斜杠解释为esc键,\x1B[1;36m \x1B[0m可以把中间的字段变成蓝色字输出。对终端输出彩色字感兴趣的可以点这里
    • read msg这里终端会等待用户输入,回车之后这个输入会被赋值给变量msg。
    • $msg == add a commit message

    效果

    图片被意大利炮轰到了这里

    备注

    使用的时候要正确输入脚本文件的路径,如果在和脚本的同文档下,则需在文件名前加./再执行。 eg:./test.sh
    写好的脚本不能立马运行,需要在脚本所在文档下的终端里输入chmod 777 test.sh,脚本才能起效。

    展开全文
  • <p>I am an absolute novice in Golang but I want to modify a Go build script to build a file locally only instead of publishing it to GitHub. <p><a href=... <p>How to proceed? </div>
  • 按键精灵2014——简单游戏脚本免费制作开发工具,按键精灵论坛配有易学易懂的简单脚本开发教程,学习游戏脚本开发必备软件,教你怎么开发脚本,如何快速制作脚本。还有丰富的免费游戏脚本下载~ 工具/材料: 按键...

    简介:

    按键精灵2014——简单游戏脚本免费制作开发工具,按键精灵论坛配有易学易懂的简单脚本开发教程,学习游戏脚本开发必备软件,教你怎么开发脚本,如何快速制作脚本。还有丰富的免费游戏脚本下载~

    工具/材料:

    按键精灵2014

    1、脚本:脚本是按键精灵一系列可以反复执行的命令。通过一些判断条件,可以让命令具有一定的智能效果的集合。

    2、脚本文件:按键精灵的脚本文件俗称为“Q”文件,它以一定的数据格式存储了按键精灵执行时需要的脚本信息。在磁盘中它以".Q"为后缀,并且保存在按键精灵目录上的QMS

    cript目录里。

    3、脚本文件的结构

    脚本分为几个部分,分别是:[General] -- 通用的设置部分。[Repeat]  -- 设置脚本循环的部分(目前没什么用处,只是为了兼容按键3.0)。[Attachment]  -- 脚本附件,大家看到的是乱码,不要担心,其实和我们邮件附件的原理一模一样。 [Script]  --  脚本命令,所有脚本命令都在这里。

    按键精灵系列产品商业小精灵,登录商业小精灵官网http://new.xiaojl.com/即可了解相详情。

     

    简单易学的按键精灵2014下载地址:http://www.anjian.com/download.htm

    展开全文
  • 作为一个文字冒险游戏,自然不能只有一条脚本,这时候,我们一般将写在文本文件中的内容全部加载,然后在逐条执行。 当一个角色说完话时,总要点击什么一下才能进行下一句。而在显示图片,播放声音,设置变量等时候...

    作为一个文字冒险游戏,自然不能只有一条脚本,这时候,我们一般将写在文本文件中的内容全部加载,然后在逐条执行。

    当一个角色说完话时,总要点击什么一下才能进行下一句。而在显示图片,播放声音,设置变量等时候,我们又希望能够直接执行下一句脚本。在遇到跳转,标签之类的语句,或者注释的时候,又希望在游戏过程中直接跳过,这就需要在分拣脚本类型的时候对它们区别对待。

     

    假设我们指定游戏开始的时候会加载一个名叫main.txt的文件作为第一个脚本。

          req= new URLRequest("scenario/main.txt");//加载路径
          loader.load(req);
          loader.addEventListener(Event.COMPLETE,TXTcompleteHandler);

    加载好之后,我们在一个TXTcompleteHandler函数里对脚本进行处理。由于得到的是一个长长的字符串,我们需要按规律把它拆分了再使用。

          var arr = new Array  ;//用来储存所有语句的数组
          arr= sourceStr.split("\n");//首先通过查找换行符把长串分割

    按照交互小说的写作习惯,用户通常会将剧情拆分成多个分值或片段,为了让文本看起来更清晰,在编写脚本的时候如果连一长串的回车都不能输的话,那恐怕就是一件太惨无人道的事情了。所以在获得一串脚本的时候,里面通常都会包含很多空行、注释这类无效的内容,虽然我们有足够的内存可以用,但也没必要留着它们,这时就需要做一些预处理的工作。



    将空行和注释等对于引擎来说没有用的内容去掉,把从文本文件中加载的数据现在变成一个干净的脚本数组。

          vari = 0;
          for(i = 0; i < arr.length; i++)
          {
               arr[i]= trimspace(arr[i]);
               if(arr[i].length <= 1 || arr[i].indexOf("//") == 0)
               {
                     arr.splice(i,1);
                     i--;
               }
          }


    在制作文字游戏的时候,难免要使用一些条件,跳转等功能,这时总不能每次都在一大堆脚本中查找一遍吧,所以在预处理的时候,要把每个标签和它所对应的行号用一个二维数组或者字典存起来。假设松鼠把标签语句设计成这样:

    [label Labelname]

            Labelname:标签名,仅在当前脚本文件中起作用。

    为了保证游戏流程的正常进行,不能在同一脚本中使用相同的标签名,如果用了的话,只有第一个会起作用。

            vargotoArr = new Array  ;//用来存跳转标签和行数的数组
            for(i = 0; i < arr.length; i++)
            {
                  //检查当前语句是不是标签类型
                  arr[i]= arr[i].substring(arr[i].indexOf("["),arr[i].indexOf("]")+ 1);
                  varstag = arr[i].substring(1,arr[i].indexOf(" "));
                  //如果是的话,就给它建立索引,取标签名和它所在的行号作为数组存起来
                  if(stag == "label")
                  {
                        varlabelname = arr[i].substring(arr[i].indexOf(" ") +1,arr[i].indexOf("]"));
                        varar = [trimspace(labelname),i];
                        gotoArr.push(ar);
                  }
            }


     



    在完成了这些处理之后,终于可以开始逐条处理脚本中的内容了。





    由于在游戏中,我们可能会需要在整个脚本中前后跳转,所以当然不能直接将已经执行过的脚本删掉,所以,要先用一个索引来表明脚本现在执行到哪句。

    var ti = 0;

    在需要执行到某一句的时候,直接对索引的数值进行更改。

    例如在执行对话脚本的时候,点击一次屏幕索引+1,遇到跳转语句的时候,在标签数组中找到标签名再给索引赋对应的值,在遇到显示图形的语句时,执行后直接给索引+1。在修改了索引后,就可以调用解析脚本语句的方法对新的语句进行分拣处理了。



    扩展阅读:

    文字冒险游戏的制作,系列分为表/里两个部分,分别介绍引擎的制作和游戏本身的制作过程。由于当年穷酸的开发者买不起测试手机,于是选择了过气网红flash作为平台,所以这系列文章计划从原理和设计的方面来讲,尽量不牵扯太多语言问题_(┐「ε:)_希望能得到喜欢

    在git上查看基于adobe air的整个项目

    在blogger提前观看还没来得及写中文版的表篇

    示例游戏:

    变形金刚同人:逆转执法官2 
    忍者神龟同人:mntgg 


    展开全文
  • 如何制作Android源码编译脚本

    万次阅读 2018-03-01 17:20:48
    可根据不同项目修改编译脚本,保存为.sh文件执行即可! #!/bin/bash source java_env_7 function init_modom_src_code(){ python ./common/tools/sectools/sectools.py secimage -m ./ -p 8909 -g venus -sa ...
  • 以cocos2d-x-2.2.2和cocostudio1.2.0.1版本为例 第一步,使用cocostudio的UI编辑器编辑好UI。 第二步,将编辑好的UI文件导出到工程的resources目录下面...第三步,在lua文件中加载json文件,只需一句话(红色部分)!
  • 初谈制作注册表REG脚本文件(下)

    千次阅读 2012-01-05 13:26:10
    四、如何修改注册表REG脚本文件 用REG文件修改注册表,应该对键值项有所了解,尤其是默认键值项的相关知识,为此下面先作个简单的介绍,供参考!  ①在注册中,对每一个主键或子键,系统只允许一个默认键值项,...
  • 在kaldi-trunk提供的例子voxforge中有一个online-demo 直接使用就可以完成样例的在线解码并得到一...在修改run.sh脚本过程中遇到了很多问题,主要是对shell脚本操作不熟悉 其中有一个步骤是需要制作corpus中的wav的sc
  • 打开CMD,切换到脚本所在的目录 打包命令 Pyinstaller -F -w -i chengzi.ico py_word.py 执行完毕会发现当前目录多了几个文件夹,打开其中名为dist的文件夹。 给大家解释一下其中Pyinstaller的参数,其中-F参数...
  • 安装文件所在路径&quot; Global $domain = &quot;域&quot; Global $admin = &quot;用户名&quot; Global $passwd = &quot;密码&quot; ;检查是否安装 If RegRead(&quot;hklm
  • 如何制作initrd.img文件

    2014-01-01 10:41:00
    2008-11-12 16:02:37    initrd.img文件是redhat,mandrake等linux发布使用的内存镜像文件。镜像中是一个微型系统。... 了解initrd.img文件制作和修改方法,可以用来制作自己的安装光盘和L...
  • 最近在看 Nginx开发从入门到精通,只有网页版的,看起来不是很方便,于是想把它做成电子版的pdf,网页有现成的接口,几行代码就搞定了,把每页的内容下载下来,然后输出到一个文件里面,由于内容是markdown格式,很...
  • 很多刚刚接触服务器的小白科研档跟我一样,自己设定了一堆abaqus作业命令,本来在window服务器下可以运行,但是,毕竟自己的电脑计算...因此我制作如何在linux服务器中批量运行脚本文件详细步骤,希望对大家有用。
  • Linux入门之如何利用rpm命令创建完整的rpm文件概述rpm命令rpm包制作流程写目标脚本rpm制作前的准备工作软件准备脚本编译rpm软件包制作 概述 在Linux下进行脚本开发,以及系统维护大多少不了rpm命令的身影。常见的yum...
  • 多个Makefile文件编译,Makefile多目标编译和多层次编译 README Makefile多目标编译 Makefile多层次编译 a文件夹 b文件夹 include文件夹 obj文件夹 多个Makefile文件编译 相关截图 make文件夹 ...
  • 批处理制作教程 批处理文件是无格式的文本文件,它包含一条或多条命令。它的文件扩展名为 .bat 或 .cmd。在命令提示下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe按照该文件中各个命令出现...
  • 这是一个文件处理程序:您输入文件夹路径和文件名(带有扩展名),脚本会为您删除它或打开文件。 它可以在任何子文件夹中找到文件,因此这对于非常特殊的情况非常有用,在这种情况下,您有无限个文件夹,并且您需要...
  • 它可以制作组织文件所需的所有完整文件夹树。 该脚本还包括用于图形设计的 Bootstrap 框架和其他框架 WebStarter 是 Andrea Marchetti 的产物( ) 如何使用 WebStarter 将脚本路径添加到您的环境变量 使用命令 ...
  •  updater-script是我们升级时所具体使用到的脚本文件,它主要用以控制升级流程的主要逻辑。具体位置位于更新包中/META-INFO/com/google/Android/目录下,在我们制作升级包的时候产生。 updater-script生成: ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 842
精华内容 336
关键字:

如何制作脚本文件