设为首页收藏本站同能贴吧 切换语言 繁体中文
开启辅助访问 切换到窄版
扫描二维码关注官方公众号
返回列表
+ 发新帖
查看: 83|回复: 0

[转载发布] Quick Time Events (R2 26/11)

[复制链接]
累计送礼:
0 个
累计收礼:
1 个
  • TA的每日心情
    开心
    2026-7-12 04:10
  • 签到天数: 209 天

    连续签到: 2 天

    [LV.7]常住居民III

    7927

    主题

    864

    回帖

    3万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    7
    卡币
    29861
    OK点
    16
    推广点
    0
    同能卷
    50
    积分
    38682

    灌水之王

    发表于 10 小时前 | 显示全部楼层 |阅读模式
    QTE Window








    Hi everyone!
            This plugins aims to allow you to create QTE's on the map scene or on the battle scene.
            Inately via events but using other plugins such as action sequences, as a condition to skill cast.

    Version RC2:
            Some code modification transparent to the user, a small bug fix. You can also now choose whether to display messages on the battle log window or not via parameters.


    Features:

    • Create and display QTEs on the map scene or on the battle scene.
    • Three QTE modes: Normal (you have a time frame to complete all inputs), Free (records player input) and Rythm (the player must complete each input in it's own time frame).
    • Ocarina mode: reminiscent from Legend of Zelda Ocarina of time. Each input will make a sound, also allows the display of each input like on a music sheet. Notes are pre set to be the ocarina ones, but you can change the sounds themselves or where each icon is placed in the parameters.
    • With yanfly's core engine and battle engine core: a set of functions aimed at using QTEs as a condition for skill cast, or to match player input to a skill notetag and to cast the skill if the inputs match.
    • 6 Recognized inputs (made with keyboard and controller in mind): Up, Down, Left, Right, Ok, Cancel.

    Screenshots and examples:

    SpoilerThe examples below all use yanfly's action sequences plugin.

    1 : Setting up a skill requiring a QTE as a skill cost:

    SpoilerSkill Notetag

    <setup action>
    eval: $gameMap.QTE(["normal"],300,["ok","up","down","left"],true)
    ifeval:$gameMap.getQTEResult()==="failure"
    break action
    end

    </setup action>
    /*
    line 1: creating the QTE
    line 2: get the result
    line 3: if QTE failed abort action
    */

    Result:









    Rythmic QTE call and looks:

    Spoiler






    Example: a use of a rythmic QTE to make a spell deal a critical hit if you complete it.

    SpoilerThis example requires yanfly's damage core and critical core.

    Skill notetag:
    <whole action>
    if(user instanceof Game_Actor)
    eval: $gameMap.QTE(["rythm",2],0,[["no",Math.floor(Math.random()*50)+20],["ok",50]],true)
    if($gameMap.getQTEResult()==="success")
      force critical
    end
    end

    </whole action>
    /*
    line 1: if the user is an actor
    line 2: create the rythmic QTE
    line 3: if the QTE is a success
    line 4: force a critical hit
    */


    Result:








    Setting up a skill that will ask for player input, and then will cast the spell that matches the sequence:

    SpoilerSkill notetag:
    <setup action>
    eval: $gameMap.QTE(["free",4,"cancel"],300,[],true)
    eval: $gameMap.castSkillMatch(user,target,7)
    </
    setup action>

    My suggestion is to make a QTE casting skill that targets allies and another that targets enemies, and tell the player to use either one depending on what target type he wants.
    Because if you try and target enemy n*1 in your troop with a spell that targets allies only, you'll end up healing the first party member instead.
    You'll have to define the sequence to check in each spell notebox that you want to be able to cast this way.

    Example:

    If spark's notetag is:

    <qteSeq:["ok","ok","down","down"]>
    And the sequence entered in the above free mode QTE is ok ok down down, it will make the user cast spark.



    Ocarina mode example:

    Spoiler

    To replicate those effects: first you have to set up an actor with the skills themselves (so in that case, create the skills, make them into a class and set an actor to that class).
    In my case I created a dummy actor (n*5) that will only serve the purpose of holding the songs as skills.
    Then I inside those new skills I created the notetages, for example saria's song notetag is <qteSeq:["down","right","left","down","right","left"]>.
    Line by line explanation:
    Spoiler

    • Create the QTE arguments detail:
    • Hide contents
    • Free input QTE,
    • maximum input number = 6,
    • cancel key = menu,
    • duration = 500 frames,
    • sequence doesn't matter for free mode QTEs so I set it to [],
    • visible = true,
    • x = 0,
    •   y = 100,
    • opacity = 255,
    • width = 4 but this doesn't matter in the case of free input QTEs. I put it here to show that for those QTEs it will automatically set it to the number of maximum inputs.






    • Set the ocarina mode. If you want to activate the new ocarina display the call has to be $gameMap.setOcarina(true,true).
    • Create the skills possibilty window (SPW) referencing actor 5, max inputs = 6, no minimum inputs.
    • Set the SPW coordinates
    • Set the SPW width and height (set it to 500 width and 4 lines height)
    • Set how much space for the text and how much for the icons (200 for the text, 300 for the icons)
    • New script block. This is imperative or else you won't be able to get the QTE result
    • Get the skills matchs from the sequence entered (it gives their id)
    • Get the skill name from the skill match, and set it inside variable 3
    • Remove SPW
    • Display variable 3 that will contain the name of the skill that matched the player input, or nothing if there was no match.
    This will play the ocarina sound as you input commands, and display the song name if you input properly.
    With some additional conditionals you can make it play a failure sound (by checking if $gameMap.getSkillMatch(5) === "no match found"), or play the full song if it recognized one just like in OOT..




    Ocarina display example:

    Spoiler



    Song names belong to Legend of Zelda Ocarina of time. They were used only to show what the ocarina display was intended for.







    Title Image Example:

    Spoiler<setup action>
    eval: $gameMap.createSPW(user._actorId,4,1)
    eval: $gameMap.setSPWSize(300,3)
    eval: $gameMap.QTE(["free",4,"cancel"],300,[],true)
    eval: $gameMap.removeSPW()
    eval: $gameMap.trySequence(user,target,3)
    </setup action>

    The sequence entered in the title image is [ok up down left], fire is [ok up down] and heal is [ok up down left].
    By trying the sequence the actor will cast fire (on target enemy) and then heal (on party member index = enemy index).
    If I had used castSkillMatch it would have only cast Heal.
    If I had used castSequencce it would have tried to cast the skills with sequences ok up down left in order.




    Demo Icon Set:

    Spoiler





    Download:

    Skill Possibilities Window Add on :

    Terms of use: See inside the QTEWindow js file for reference. Pasted here:
                            // TERMS OF USE:
    // Free to use both commercially and non commercially.
    // For commercial games, you must provide me with a free copy of the game.
    // For non commercial games, tell me about it! I'd love to see what you were able
    // to do with my plugin.
    // Credits required, in a visible place:
    // any of Astfgl/ Pierre MATEO/ Pierre MATEO (Astfgl)
    // Edits allowed, with the caveat that you must keep the edited product under the
    // same license and you must clearly indicate it is an edit, and what part you
    // did edit.
    // You must keep this header intact.               
    Click to expand...


    Setup:

    • Download the Plugin file, put it inside a .js file, name it QTEWindow. If you want the addon, download the file and name it QTEAddonSPW.
    • By default this plugin uses empty spaces on the icon file for its display. I have edited the icon file and added suitable icons myself at these spaces. You can either do the same or modify the plugin parameters to look for other icon numbers. In the example screenshot you can find my modified icon file if you want to use it.
    • Setup the parameters. Everything is explained inside the plugin help file and the parameters description
    Usage:
    Pasted below is the plugin's help file.

    Spoiler* ===================================================================
    * PLUGIN SETUP:
    * Set the parameters before use, notably the icon indexes or the
    * inputs won't show.
    * If you want to use the ocarina mode, you'll have to specify
    * the file names in the ocarina sounds parameter.
    * If you want accurate note display you'll have to modify the note
    * position array too, 36 is one full space, 18 a half space, 3 is
    * just for correct spacing.
    *
    * ===================================================================
    * SUGGESTED PLUGINS FOR BATTLE USE:
    * Yanfly Core Engine, Battle Engine Core, Action sequence 1
    * This is for battle use through action sequences. You can call the QTE
    * using common events or another plugin providing action sequences if you want.
    * I just haven't tried it. I make almost no battle modifications though
    * so another plugin should work too.
    *
    * Look at the examples in the thread for ideas on how to use them in action
    * sequences.
    *
    * ==================================================================
    * How to call a QTE:
    * $gameMap.QTE(mode,duration,sequence,visible,x*,y*,opacity*,
    * width*,height*,wrongInput*,showTime*)
    *
    * =================
    * NORMAL QTE
    * mode = ["normal"]
    * duration = duration wanted in frames
    * sequence = sequence (see at the end of the help file how to provide sequences)
    * visible = whether you want to show the qte window or not, true or false
    *
    * All the following parameters marked with an * are not required, but the window
    * will use them instead of the plugin parameters if they are present.
    * x = x position of the qte window
    * y = y position of the qte window
    * opacity = opacity of the back of the qte window, not the icons
    * or time remaining gaug
    * width = the width as in number of icons you want to show at once
    * height = the height in pixels
    * wrongInput = whether a wrong input will end the QTE as a failure or not,
    * can be true or false
    * showTime = the mode to show time, "number", "gauge", "both" or "no"
    *
    * ex: $gameMap.QTE(["normal"],300,["ok","up","left"],true)
    *
    *==================
    * To set one QTE window option in particular:
    *
    * $gameMap.setQTEpos(x,y) = sets the x and y position of the QTE window.
    * $gameMap.setQTEdim(width,height) = sets the width and height of the QTE window
    * $gameMap.setQTEfail(boolean) = either true or false, whether a wrong
    * Input makes the QTE stops as a failure.
    * $gameMap.setQTEopacity(number) from 0 transparent to 255 opaque,
    * the opacity of the QTE window, not the contents.
    * $gameMap.setQTEtime(mode) sets which mode to display time, same options
    * as the parameter.
    * $gameMap.setQTEsound(bool) true or false, whether to play sounds or not.
    * Note that this will only stop the system sounds from playing, the ocarina
    * sounds will be played if applicable.
    * $gameMap.setOcarina(bool,bool2) if bool = true each input will play the sound
    * defined in the parameters, if bool2 = true it will switch the display mode
    * of the sequence to look like a music sheet.
    * ================
    *
    * Every QTE window option is reset at the end of each action in battle.
    * On the map, the QTE window is reset each time the map is entered,
    * like going in the menuand then back.
    * This goes for all QTE modes.
    * Reset all QTE options: $gameMap.clearQTE();
    *
    * ===============
    * FREE QTE a QTE that registers player input
    * The script call is the same as above, however the mode argument differs
    * mode = ["free",maxInput,cancelButton]
    * maxInput = the maximum numberof recorded keys
    * cancelButton = a button to end the input.
    * If you have several skills with different sequence length
    * set the maxInput to the maximum sequence length. Ie fire is up up down,
    * spark up up up up, set max Input to 4.
    * If you want to cast spark just press up 4 times, because maxInput is reached
    * the qte will end automatically. But if you want to cast Fire you'll gave to
    * press up up down and then cancelButton.
    * It will ignore the sequence argument, so just put [].
    *
    * ex: $gameMap.QTE(["free",4,"cancel"],300,[],true). This will produce a
    * QTE window asking for 4 inputs, ending when running out of time or
    * on the first "cancel" button press.
    *================
    *
    * RYTHMIC QTE: ie a qte progressing by itself and you need to press each
    * button in its timeframe
    * The sequence is setup like this:
    * [[button,duration],[button2,duration2],...,[buttonN,durationN]]
    * In addition to the inputs below you can use "no", and it will wait and
    * return a failure if any button is pressed during the wait.
    * The mode argument is also changed mode = ["rythm",increment*]
    * Increment is not mandatory, it is by how much at each frame the duration
    * will diminish.
    * If not set it will use 1.
    * Ex: duration = 300 frame, increment 1 -> actual duration 300 frame
    * duration = 300 frames, increment 5 -> actual duration 60 frames. It will make
    * the qte move faster.
    * Call example:
    * var seq = [["ok",100],["no",50],["up",100],["down",100]]
    * $gameMap.QTE(["rythm",5],300,seq,true);
    *
    *
    * ========================================================
    * How to get a QTE result: $gameMap.getQTEResult()
    *
    * =================
    * Important:
    * Please note that due to the way this works you have to use the
    * getQTEResult() script call in another script event command, not in
    * the same as the one where you launch the qte or it won't work.
    *
    * =================
    * The result function has 4 possibilities:
    * pending: qte not started
    * start: qte currently running
    * success: qte ended succesfully
    * failure: qte ended in failure
    *
    * ex: $gameMap.getQTEResult() === "success" in a condition script will return true
    * if the QTE was a success, and false for any other option.
    *
    * ================
    * In case of a free QTE the result function will return the sequence.
    * To get the skills that match the sequence entered, use the call:
    * $gameMap.getSkillMatch(actorId)
    * This will look through all skills of the actor, and if any of the
    * sequences in their note <qteSeq:> matches that of the skill, will return
    * their id.
    *
    * ex: $gameMap.getSkillMatch(1) will look through actor 1 skills.
    *
    * If you want to return the name of a skill from a match, use
    * $gameMap.getSkillNameFromMatch(skillId)
    *
    * ex: $gameMap.getSkillNameFromMatch($getSkillMatch(1))
    * That call will try to match the qte result to a skill id, and return their
    * name. Assign it to a variable and you can display it.
    *
    * ============================================================
    * DEFINING SEQUENCES:
    * ============================================================
    *
    * Normal mode :
    * Provide sequences as an array
    * ["button1", button2",...,"buttonN"].
    *
    *
    * Free mode:
    * The defined sequence doesn't matter just use [].
    *
    *
    * Rythm mode:
    * Provide sequences as an array:
    * [[button,duration],[button2,duration2],...[buttonN,durationN]]
    * You can use "no" instead of a button if you want to make a pause
    * in the QTE.
    *
    * ============================================================
    * Use a free input QTE to cast a spell for each input:
    * $gameMap.castSequence(user,target,actionAr)
    * IMPORTANT This command won't work without yanfly's battle engine
    * core and will crash your game if used without.
    * The user and target must be the objects themselves, not the ID
    * or index.
    * ActionAr is the array of action to match the input in that order:
    * [up,down,left,right,ok,cancel]
    *
    * ex: eval: $gameMap.castSequence(user,target,[30,31,32,33,34,35])
    * For an input: up down left right ok
    * This will make the user cast skills 30,31,32,33,34 in succession
    *
    * You can use v(id) inside the action array, to refer to the value
    * of variable id, so you are able to modify the combos in game.
    *
    * ============================================================
    * Use a free input QTE to cast a skill that matches its sequence.
    * $gameMap.castSkillMatch(user,target,failActionId)
    * This will make the user cast the matching action on target,
    * if there was no match it will instead make it cast failActionId.
    * If failActionId is 0, it won't do anything instead.
    *
    * ============================================================
    * Cast both the sequence and the skill match:
    * $gameMap.castSandSM(user,target,actionAr,failActionId)
    * This will first go through the actions via the cast sequence
    * command and then attempt to cast a match from that sequence.
    * The arguments are the same as the functions described above.
    *
    * =============================================================
    * Cast every skill match found within the sequence:
    * $gameMap.trySequence(user,target,minInputs*,maxInputs*)
    * Okay, this one is a bit complicated, let's take an example:
    * the free QTE result is ["ok","ok","down","down"]
    * Let's say min and max Inputs aren't given as instructions.
    * It will cast the skills the actor know with the notetags
    * <qteSeq:["ok"]> and <qteSeq:["down"]> in that order:
    * ok, ok, down, down.
    * Then it will move to look for matches in 2 length.
    * So it will cast the spells okok, okdown and downdown
    * Then do it for 3:
    * okokdown, okdowndown
    * Then do it for 4:
    * okokdowndown
    * If the actor doesn't have any skills that match those notetags
    * it simply will ignore them.
    * What do min Input and max Input do: they will start or end
    * the process at those number.
    * So if min inputs was 2 , it wouldn't have cast the skills
    * that matched only 1 input. And if max Inputs was 3 it wouldn't
    * have cast the final sequence of 4.
    *
    * =============================================================
    * MAKE A RANDOM SEQUENCE
    * ONLY FOR NORMAL MODE
    * Use $gameMap.randomSequence(length)
    * It will generate a random QTE sequence of that length, using
    * all inputs available, except those you put after length
    * example: $gameMap.randomSequence(5,"up") will return a 5
    * input long sequence that doesn't contain the up key.
    * $gameMap.randomSequence(5,"up","down") will do the same
    * but without the down key too.
    * example:
    * $gameMap.QTE(["normal",0],500,$gameMap.randomSequence(5),true)
    *
    *
    *
    *
    *
    * ===========================================================
    * KEY LIST
    * ===========================================================
    * You can find the list of keys here:
    *   0: 'ok',        // A
    *   1: 'cancel',    // B Used as cancel key in examples.
    *   2: 'shift',     // X Not supported
    *   3: 'menu',      // Y Not supported
    *   4: 'pageup',    // LB Not suppoted
    *   5: 'pagedown',  // RB Not supported
    *   12: 'up',       // D-pad up
    *   13: 'down',     // D-pad down
    *   14: 'left',     // D-pad left
    *   15: 'right',    // D-pad right
    *
    */




    FAQ:

    • Does this work with items?
            It doesn't.

    • Is it planned to make this smartphone compatible?
            I will not make this plugin compatible with touch input, or the mouse. Keyboard and controller only.

    • My input doesn't show!
            That's not a question. Please be sure you have setup the plugin parameters correctly and/or the plugin file names are correct. Check the setup section.

    • Is there a way  to change the note display in rythmic QTEs?
            Right now there isn't. It's not very pretty but it's functional. Feel free to request customization options on that point.


    Credits:

    • Astfgl66
    • Yanfly (Core engine, Battle Engine Core, Action sequences, and more)
    Edit: Old forum broke the formatting, hopefully this should be much better.


    本贴来自国际rpgmaker官方论坛作者:Astfgl66处,因国际论坛即将永久关站,为了存档多年珍贵资料,署名转载到本论坛存档,由于官方帖子为英文原帖,需要中文翻译请点击论坛顶部切换语言为中文就可以将帖子翻译成中文浏览,方便大家随时查看,原文地址:https://forums.rpgmakerweb.com/threads/quick-time-events-r2-26-11.71268/

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x
    天天去同能,天天有童年!
    回复 送礼论坛版权

    使用道具 举报

    文明发言,和谐互动
    文明发言,和谐互动
    高级模式
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    简体中文
    繁體中文
    English(英语)
    日本語(日语)
    Deutsch(德语)
    Русский язык(俄语)
    بالعربية(阿拉伯语)
    Türkçe(土耳其语)
    Português(葡萄牙语)
    ภาษาไทย(泰国语)
    한어(朝鲜语/韩语)
    Français(法语)
    关闭

    幸运抽奖

    社区每日抽奖来袭,快来试试你是欧皇还是非酋~

    立即查看

    聊天机器人
    Loading...

    QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

    GMT+8, 2026-7-31 21:42 , Processed in 0.121181 second(s), 53 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

    快速回复 返回顶部 返回列表