Status
Not open for further replies.

Astfgl66

Veteran
Veteran
Joined
Jan 5, 2016
Messages
734
Reaction score
605
First Language
French
Primarily Uses

QTEWindow


CO6Zqjg.png


 


 


Hello everyone!


This plugins aims to allow you to create QTE's on the map scene or on the battle scene.


Inately via common events but using other plugins such as action sequences, as a condition to skill cast.


UPDATE:  BETA 3


New way to draw the QTE Inputs and a ton of In combat functions.


NEW TERMS OF USE, see the appropriate section.


What is new?

  • As you can see in the screenshot above, a new display mode for the inputs, for that complete ocarnia experience! It's available for all three modes.

The ocarina call is now: $gameMap.setOcarina(sound,display) If sound is true it will play the music, if display is true it will display like if it was on a music sheet.

  • A bunch of in combat functions to simplify things for the game maker. Made to use with action sequences. All of those REQUIRE Yanfly's battle core to use.

 -  $gameMap.castSkillMatch(user,target,failActionId):


This will take the result from a QTE window that was called and make the user cast the skill that matches the sequence completely.


Ex: Spark has the <qteSeq:["ok,"ok,"down","down"] notetag. If the input was ok ok down down it will make the actor cast spark.


If the QTE was a failure, it will cast the skill defined in failActionId, or notif it doesn't exist.


 - $gameMap.castSequence(user,target,actionAr)


For this command, actionAr is an array of actions that will match to the input: [up,down,left,right,ok,cancel]


Let's take spark again as an example, and provide actionAr = [30,31,32,33,34,35]


It will make the actor cast skills 34,34,31,31 in that precise sequence.


 - $gameMap.castSandSM(user,target,actionAr,failActionId)


This call combines the two above. So it would cast skills 34,34,31,31,Spark in that order.


 - $gameMap.trySequence(user,target,minInputs*,maxInputs*)


This ine is a little trickier. It will cast every possible combination in the sequence provided.


With spark's sequence (okokdowndown) it would casts the spells that have the following <qteSeq:> notetags in order:

  1. ok, ok, down ,down 
  2. okok, okdown, downdown
  3. okokdown, okdowndown
  4. okokdowndown

minInput and maxInput allow you to ignore steps. If minInputs = 2, it will start at the 2nd line, and if maxInputs = 3, it will stop after the 3rd line.

  • Generate random sequences for your normal qtes: $gameMap.randomSequence(length)

This will create a sequence of the length specified. If you add any button after length as argument it will remove that button from the allowed pool.


ex: $gameMap.randomSequence(5,"up") will create a sequence of 5 buttons without any "up" input.


Download links updated, and help files updated too.


What is working right now:

  • Creation of QTE on the Map scene.

QTEs are timed upon creation, and will result in a failure if the timer expires


If the option is set, QTEs will result in failure after a single wrong input.

  • QTEs recording player input

If a QTE recording player input matches the sequence in a notetag from an actor's learned skill it will cast that skill.


If it doesn't, it will cast the skill Id defined in the parameters (7:wait by default)

  • Rythmic QTEs
  • Compatibility with yanfly battle engine.
  • Ocarina mode!
  • Battle functions


Screenshots and examples:

Ocarina mode example:


JHENxcQ.png



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:

  • Create the QTE arguments detail:


Spoiler



Free input QTE,


maximum input number = 6,


cancel key = menu,


duration = 500 frames,


sequence doesn't matter 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, with 6 lines
  • 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..


The following example of in battle use were tested using Yanfly's core engine, yanfly's battle core and yanfly's action sequence pack 1.


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



<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:



<qteSeq:["ok","ok","down","down"]>




Setting up skills to cast the sequence, both the sequence and match and to try the sequence is done the same way. It has diminished from 6/7 lines to just 2!


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



<setup action>
eval: $gameMap.QTE(["normal"],300,["ok","up","down","left"],true)
if eval:$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
*/


tKiFvuC.png



Rythmic QTE call and looks:


afOaXKA.png



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


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



<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
*/


tpyc3Xt.png



Demo Icon Set:


4ezjq9x.jpg







Download: http://pastebin.com/zd63sDuD


Skill Possibilities Window Add on : http://pastebin.com/kfhPR3Jy


Terms of use:  See inside the 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.
//
// For information, time spent developping this + addons: 30hours.
// Please don't actually edit this plugin until a 1.0 version is released.




Setup:

  • Download the Plugin file, put it inside a .js file, name it QTEWindow
  • Download the Icon file and replace your current Icon File (in /img/system), or you won't see anything when calling the QTE window.
  • Setup the parameters. Everything is explained inside the plugin help file and the parameters description



Usage:


This isn't very easy to use, please read the instructions carefully.

* ===================================================================
* 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
*
*/



What I want from you testers:


Test it, try to break it and tell me what happens.


Tell me of compatibility issues. You never know, I might solve them if I have time.


Also, tell me if you don't understand the instructions and I'll try to make them clearer.


FAQ:

  • Does this work with items?

It currently doesn't.


What is Planned:

  • Reactive QTEs: for example a QTE when the actor is the target of an attack to determine if he can block or not. Discontinued, can be handled via action sequences.
  • Free input QTEs: permit the user to enter any combination of input, check his skills to see if the input entered matches one of the skills and cast the appropriate skill. DONE
  • Rythmic QTEs: make the window progress at its own rate, user must input when icon is on the cursor, any input when not in cursur or if innapropriate results in failure. DONE
  • Show remaining time to input (gauge or number). DONE
  • More Customization (being able to set the width and height on a per window basis instead of a parameter, for example or setting the opacity of the window). DONE
  • Put success or failure for QTEs on the battle log window. DONE
  • Actually stop the animation from casting before the qte is completed. Discontinued, can be handled via action sequences.
  • Make the user be able to switch between icons or picture for the input images. I'm debating this one, if you have an opininion, or you feel it's absolutely necessary, tell me.
  • As an end goal, in the distant future, once everything else works, I maybe will try to make it compatible with yanfly's action sequences. DONE



What will NOT happen:

  • Anything dealing with TouchInput (so no swiping motion recognition, etc...). I won't make this smartphone compatible in the foreseeable future.



Credits:

  • Astfgl66
  • Yanfly
 
Last edited by a moderator:

Astfgl66

Veteran
Veteran
Joined
Jan 5, 2016
Messages
734
Reaction score
605
First Language
French
Primarily Uses
I'm bumping this to say that it's officially entered beta. You can read the changelog in the OP.


I'm testing it more thoroughly now, mainly the use with yanfly's battle plugins, because as far as I know the QTEs themselves work.


I'm looking for customization feedback:

  • What parameters would you like to see?
  • Do you have an idea about how to better represent the buttons in the rythmic QTE?
  • I think it's a bit cumbersome to use. I'm thinking of making the QTE window persistent, so you'd only have to set the options once. What would you prefer?



I'm still looking at how to simplify the execution of the free input QTEs to match the skills using the action sequences.


This is done, it no longer requires a comon event. I just had to post it to come up with an idea that works minutes later despite trying for quite some time before... Updated example in the OP.


Edit: If someone's interested, I could make a tutorial using this plugin (and yanfly's) to make an ability similar to zell's duel in ff8  http://finalfantasy.wikia.com/wiki/Duel.


For those that don't know ff8: It gives you a time frame, and a list of input to cast certain actions. You cast as many actions you can during that time frame, time is consumed only when inputting commands. There are also finisher moves that will end the combo even if it has time remaining.


Edit2 : Well this has grown by quite a lot since I said I would give it a week, and I added quite a new amount of things... I'm giving it till the 21st to hopefully collect feedback/desires.
 
Last edited by a moderator:

Kes

Veteran
Veteran
Joined
Aug 3, 2012
Messages
22,853
Reaction score
12,388
First Language
English
Primarily Uses
RMMZ
This thread is being closed, at OP's request. If for some reason you would like this thread re-opened, please report this post and leave a message why. Thank you.
 
Status
Not open for further replies.

Latest Threads

Latest Profile Posts

Wheel of Attacks.png

MORE GAMBLING THEMED ATTACKS!

I AM UNABLE TO STOP!
Is it ok to repost stuff that i've posted to threads in the status feed?
If so, here's art of Shiloh, the main protagonist of the game i'm making:20220807_181702.jpg
They are meant to be ambiguous in gender, like Frisk from Undertale or Gogo from FFVI. I haven't decided what their age will be yet. Any ideas?
Please comment what you think about the art and design!
ScreenShot_8_10_2022_7_15_21.png
Looks like Mike's got a new party member in Robbi...

Calf survival story with a happy ending.
well here's that concept art!
WIN_20220812_16_53_56_Pro (2).jpg
Whaddya think? Name suggestions?

Forum statistics

Threads
124,461
Messages
1,163,829
Members
163,279
Latest member
ussifif
Top