Need help with puzzle

dreamfall887

Sun Spirit
Veteran
Joined
Aug 20, 2015
Messages
271
Reaction score
587
First Language
English
Primarily Uses
RMVXA
Hello everyone!

I have been having trouble trying to figure out how to do a puzzle for a dungeon in my game.

The player encounters a dragon guarding a door.
Puzzle1.png
The dragon won't allow player to pass through door, unless the player bring 5 sacrifices to it.
Puzzle6.png Puzzle7.png
The player then has to lure the monsters in front of dragon.
Puzzle3.png
One the monster is in front of dragon, the dragon will consume it.
Puzzle2.png Puzzle4.png
Once the dragon has consumed 5 monsters, the door will open.
Puzzle5.png

Can someone explain to me, how I would make a puzzle like this?

Thank you :smile:
 

Heirukichi

Veteran
Veteran
Joined
Sep 24, 2015
Messages
1,421
Reaction score
596
First Language
Italian
Primarily Uses
RMVXA
The short answer is: increase a variable each time a monster is consumed and then use a conditional branch to check that variable. If its value is 5 then move your door and increase the variable again (it is equal to 6 now). Have a second page in your door thad does not display any graphics but still transfers the player and set "your variable greater than or equal to 6" as a condition for that page.

That was the short answer. The long one depends on what the player has to do to lure an enemy there so I cannot really give you a more detailed answer.
 

standardplayer

Keeper of Kitties
Veteran
Joined
Apr 6, 2016
Messages
698
Reaction score
3,450
First Language
English
Primarily Uses
N/A
Yeah we're gonna need more detail, because there are so many ways to pull that off, but coming up with a fun, creative and whenever possible, unique way is what matters most.

How @Heirukichi described is likely going to be part of what you do no matter what.

Tell us how you see it playing out as the Player, and it will be easier to help describe how to go about eventing it.
 

dreamfall887

Sun Spirit
Veteran
Joined
Aug 20, 2015
Messages
271
Reaction score
587
First Language
English
Primarily Uses
RMVXA
@Heirukichi
I was thinking of doing it like this:
Once the player gets close enough to the enemy, the enemy will start following them. The enemy will stop following if the player get too far away.
 

Heirukichi

Veteran
Veteran
Joined
Sep 24, 2015
Messages
1,421
Reaction score
596
First Language
Italian
Primarily Uses
RMVXA
So basically you need something to calculate proximity. One possible way to do this is to have a second page on each enemy event with autonomous movement that follows the player. The trigger for that second page would be self switch A on.

Once you set up this you need something that actually turns that switch on when needed. This can be done using a parallel process event. Just have a parallel process event in either your map or your common events and put the following in it.
Code:
following_enemies = [id1, id2, id3, id4]
following_enemies.each do |id|
  ev = $game_map.events[id]
  prox = ($game_player.x - ev.x).abs + ($game_player.y - ev.y).abs
  $game_self_switches[[$game_map.map_id, id, 'A']] = ((prox < certain_distance) ? true : false)
end
Change id1, id2, id3, id4 with the id of your movable events (you can add new ones separating them with commas, add as many as you want) and change certain_distance to be the actual distance (in squares) at which one event starts following the player.

DO NOT CHANGE anything else, not even id. Just change those ids inside "following_enemies" and that certain_distance.
At the end of this event you should put a wait command so that it does not run every frame. The player will unlikely occupy a new position each frame.
 

dreamfall887

Sun Spirit
Veteran
Joined
Aug 20, 2015
Messages
271
Reaction score
587
First Language
English
Primarily Uses
RMVXA
@Heirukichi
Could you post a screenshot to show me what you mean? I'm a little confused on how to set it up.
 

Heirukichi

Veteran
Veteran
Joined
Sep 24, 2015
Messages
1,421
Reaction score
596
First Language
Italian
Primarily Uses
RMVXA
Here is a screenshot that shows you all the important parts of your monster event.
EventID.png
As you can see my event ID is 1. Now let's assume that in my map I have event from 1 to 5 acting as those monsters. I then decide that events should start moving once the player enters a range of 2 tiles (that can be any combination of 2 tiles: horizontal, vertical, horizontal + vertical, etc). The script call to the common event would look like this:
Code:
following_enemies = [1, 2, 3, 4, 5]
following_enemies.each do |id|
  ev = $game_map.events[id]
  prox = ($game_player.x - ev.x).abs + ($game_player.y - ev.y).abs
  $game_self_switches[[$game_map.map_id, id, 'A']] = ((prox < 3) ? true : false)
end
as you can see the array contains my events ID (1, 2, 3, 4, 5) while I changed certain_distance to 3 because when it is less than 3 (which means 2) events start chasing the player.
 

dreamfall887

Sun Spirit
Veteran
Joined
Aug 20, 2015
Messages
271
Reaction score
587
First Language
English
Primarily Uses
RMVXA
@Heirukichi
Okay the monsters are following me now. :)
I know I have to use variables to keep track of how many monsters the dragon has to consume, but how do I make it so that when the monster is in front of dragon, the dragon will breath fire on it and the monster disappears?
 

Heirukichi

Veteran
Veteran
Joined
Sep 24, 2015
Messages
1,421
Reaction score
596
First Language
Italian
Primarily Uses
RMVXA
You can check that in the same common event you use to let events start following the player. Check if there is an event in front of your dragon and if there is turn a self switch B on. Then set up your event so that your 3rd page (a new one) has "Self switch B is ON" as trigger condition. That 3rd page can be an autorun event or anything else. If you want to display the flame animation I'd recommend using an autorun event so that you can actually put commands there.

In the following example I am still using 1, 2, 3, 4 and 5 as event IDs and 3 as minimum distance to not trigger events. My dragon event (in the following example) is Event 6 (so its ID is 6). Change it to be your actual dragon event id.
Code:
following_enemies = [1, 2, 3, 4, 5]
dragon = $game_map.events[6] # change this
following_enemies.each do |id|
  ev = $game_map.events[id]
  prox = ($game_player.x - ev.x).abs + ($game_player.y - ev.y).abs
  $game_self_switches[[$game_map.map_id, id, 'B']] = ((dragon.x == ev.x) && ((ev.y - dragon.y) == 1))
  $game_self_switches[[$game_map.map_id, id, 'A']] = ((prox < 3) ? true : false)
end

In the example I am calculating is the event is BELOW the dragon (that means same x coordinate and a difference of 1 in y coordinate). I picked that one because in your screenshot the dragon is up while the event disappear upon walking in the square right below it. If you decide to move the relative position for the sacrifice then you have to change that accordingly.

For this reason after your event animation ends do not forget to either move your event somewhere else after triggering a blank page with the "Through" condition checked (using a self switch would be ideal) or erase it using "Erase Event". The first option means that leaving the room and entering it again will have no impact on the number of events, the second option means you reset your event to its last active page (the one used to trigger the sacrifice) upon entering the room again. Keep in mind that using erase event might lead to complications such as
  • having to reset your counter variable;
  • having to reset all your self switches.
An event that is moving to a square is already considered to be on that square. This means two things: 1) if you do not time things properly the 3rd page triggers during movement, 2) if your timing is off you might start your sacrifice animation when the event is still moving.
To prevent such things just start your 3rd page autorun event (I am saying autorun because it is the best way in my opinion) with this code:
Code:
Fiber.yield while $game_map.events[@event_id].moving?
This prevents the engine from running everything that follows that command until the event stops its movement.
 

dreamfall887

Sun Spirit
Veteran
Joined
Aug 20, 2015
Messages
271
Reaction score
587
First Language
English
Primarily Uses
RMVXA
@Heirukichi
I apologise for the late reply. I've been busy this week.
Thank you for helping me. :smile:
 

Users Who Are Viewing This Thread (Users: 0, Guests: 1)

Latest Threads

Latest Posts

Latest Profile Posts

Couple hours of work. Might use in my game as a secret find or something. Not sure. Fancy though no? :D
Holy stink, where have I been? Well, I started my temporary job this week. So less time to spend on game design... :(
Cartoonier cloud cover that better fits the art style, as well as (slightly) improved blending/fading... fading clouds when there are larger patterns is still somewhat abrupt for some reason.
Do you Find Tilesetting or Looking for Tilesets/Plugins more fun? Personally I like making my tileset for my Game (Cretaceous Park TM) xD
How many parameters is 'too many'??

Forum statistics

Threads
105,862
Messages
1,017,049
Members
137,570
Latest member
fgfhdfg
Top