Hey Yal. I'm back again, I am so so sorry for disturbing you but I got this thing bugging me and I can't figure it out. Basically, when my player object is beneath objects, it draws the head on the very top layer (I assume as part of how they are drawn in tall grass?) only problem is, I can't find where this is set to draw as the draw event contains only, as far as I can tell, the general drawing of the player sprite. I was figuring if I could locate the code that draws the head separately, I could add a:
if (place_meeting(x,y,obj_tallgrass_32) or place_meeting(x,y,obj_tallgrass_64) {
(the code that draws the head here)
}
so that when the player is below something say, a bridge on a higher layer, you don't see the head of the player. fake 3d, if you will!
Any help would be great, and hopefully it's not something obvious I've missed like a real dumbo the elephant.
Yeah, there's a reason why you find no special code for this in the player object: it's actually the grass that handles it. Basically, the grass is in front of the player normally, but each grass object draws the top of the player after drawing itself if the player currently is colliding with it. (Basically, I use the "painter's algorithm" to make part of the player be above the grass... by just drawing it on top of the grass)
(For some reason I use dynamic rendering masks for this - I just realized that just drawing the upper half of the player's sprite with draw_sprite_part would've probably done the same thing but with much simpler code... x3)
On closer inspection, I just realized that this is a bug! The grass' drawing code uses || instead of && when doing the collision check, so essentially the player's status will always count as "in my particular patch of grass" and trigger the additional head drawing. Changing the the collision check ||s to && in obj_tallgrass_32's draw event (lines 13-16) should fix this. (obj_tallgrass_64 inherits everything from _32 so you shouldn't need to change that)
Hey Yal, I picked the engine up about a week ago and have been working my way through the code to understand it. Just gotten stuck on where / how you define at what level monsters 'transcend' and if there is an script to remove a monster from the player, eg so you could do one of those in-game trades with an npc where you remove the players monster then generate a new one based on whatever they're meant to get in return? Thank you so much :)
Evolutions transcendences are defined at Scripts-->Data Mangling-->Database Setup-->Init Monsters, if you scroll to the right a whole bit you'll see this data:
(Basically it's an array of 3-member arrays, which represent the way to evolve, what thing triggers the evolution, and what monster to evolve to. For level evolutions, the trigger is the level to evolve at, for item evolutions it'd be the item ID, and so on... I'm unsure if I ever made item evolutions)
amp_clear_monster deletes a monster from the Active Monster Party (which is the big array that has all the monsters the player owns, including the storage boxes). Then you could use amp_generate_monster to create a new monster on the same AMP-ID, so it takes the exact slot the traded monster occupied. (Actually, you could just amp_generate_monster onto that slot directly, it clears the data with amp_clear_monster first). Once the monster is generated, you can manually apply unique quirks you want the traded monster to have (e.g. special moves or held items).
To get the AMP-ID of the monster to trade, I'd spawn a menu using msh_spawn_monster_list (which spawns a list of the monsters in the active party) which has a new "trade offer" menu event... it'd check if the monster in that slot matches what the NPC wants (that data would be stored in some global variables in the cutscene initialization script with the conversation) and if so, asks you a "ok?" question with msh_areyousure, and its OK script initiates the trade (sets the appropriate "trade done" flag, loads a different room with the trade animation, and then goes back).
If you need to familiarize yourself with how to carry data around, starting from mev_pause_monsters and looking into how the menus read party data further down the line should give you a good starting point in figuring out how to handle the AMP data (and the menu system in general).
Thank you so much Yal, it's amazing how intuitive your engine is, and how quick your support is! I can't believe I didn't scroll far enough to find the evottranscendences! I'm such a dolt! I thought of one last question, I'm so sorry to keep asking, but is there any way to set evolution moves? ie, a move it learns as soon as it evolves into charachne? Thanks again and so sorry for the questions!
Usually my support isn't that quick, I only check my itchio messages once per day... you just got lucky and posted that thing just a couple minutes before I happened to log in, gg :P
For evolution moves, it's going to be a bit messier since I didn't consider it when making the engine, but here's my idea:
In obj_evolutioncontrol, at line 73, add some extra code that checks if the newly evolved species (targevo) has any innate moves learned at level NONE. (Those are the moves they always know regardless of level). If there's any, attempt to learn them. The code of obj_battlecontrol's step event case 32 which handles newly learned moves (around line 1010) should be a good starting point for this new code (alongside with the code that sets the movelearn queue around line 997). It might be easier to add a new state to the evolution control's step event than trying to cram all this into case 20 where it waits for the menu objects to be done, just like how battle control uses one state to populate a queue and another state to read the next entry from the queue until it's empty.
With this system in place, you can define new moves learned on-evolution by adding innate moves to the evolved monsters which are learned on level NONE.
If you think the "level NONE" thing is a bit hacky and you want to fully separate always-known moves from on-evolution moves, add a new constant ON_EVO which is a value higher than your max level (e.g. 1000) and check for moves learned on that level in the evolution control instead of moves learned at level NONE. These moves can't be learned through levelling up, since the monster can't reach past the max level, so only the special case in the evolution control will do anything with the data.
Hey! I just have a few questions to ask before buying. Hope it's ok:
How easy is it to change the resolution of the engine? Is their much tied to the resolution already or will there only be a few things I'd need to edit after changing it (I'm just thinking in my limited experience with GM that things like character speed would need to change, as well as any measuring etc) ?
How easy is it to change the animations for attacks, and the battle transitions etc?
Also, is there a grid movement system, and if not, do you think it'd be hard to add in?
Changing resolution should be fairly trivial, the battle controller sets things up based on the room size and most menus are defined in terms of two constants VIEW_W / VIEW_H. You'll need to manually change room sizes / viewports of every room in the game, but there's just a handful of rooms so it's hopefully not too much work.
Overworld character speed is defined in pixels per step, but it's just one variable you need to change in the player's create event. You might potentially also want to change the TILESIZE constant if you change the tileset size (this will have some ripple effects like grid sizes in existing rooms also having a different size, but I've never really tried changing a tileset size so I'm not 100% sure how much of that is automated)
Attack animations uses any object you want (typically a child of the effect parent), the battle flow waits until all effects are gone before proceeding. There's a convenience script fx_deferred_projectile which lets you spawn a standard projectile which runs another script on-hit (which works for a wide range of attacks) but you can add as intricate effects as you want if you feel like it.
The movement system isn't grid-based, but it shouldn't be too hard to add in. You'd basically turn the overworld player into a state machine with two states (idle and walking): in idle state, if any movement key is pressed, if whatever's one tile in that direction is OK to stand on: switch to walking state, start a countdown of TILESIZE, and start moving in that direction. In walking state, reduce the countdown, and when it hits zero, stop moving and switch back to idle state.
While googling for some ideas to make a pokemon database, I came across this. And while I mostly understand arrays and such, I can't fully grasp them yet. Thank you for this code, I plan to build off it, or start from scratch after learning from yours to be used commercially. Your work looks fantastic. Thanks Yal.
Considering the sale ended 12 days ago, I feel like it would be unfair to everyone that has bought it in the meantime if I made a temporary discount just for you, even if you happen to be one of my most loyal customers. The monster collector engine release sale also lasted 1 week, instead of just 3 days which I usually use for release sales. There will be more Itchio sales, and I always join in when there is one, so just check back regularly and chances are you'll catch the next sale. (Itchio sends out e-mail notifications if you've got those turned on - I think it's possible to turn it up to max to get notifications whenever anyone you follow posts a new project, sale or a devlog on top of just the big site-wide announcements, too... if you do that, you'll never miss a sale again!)
You should also probably take some time to actually make a game with all those engines you bought too... Making 5 games at once tends to get pretty exhausting. :P
Monster storage system basically uses the gen3 system where you pick up monsters and move them around between boxes and the party. (Monsters caught when your party is full automatically is sent to storage). There's no item storage system, but you have infinite inventory space so that shouldn't matter (it's just more convenient now when you instantly have access to every item you own anyway).
I'm pretty sure it's already in the description, but I guess I could give it more emphasis... the storage system wasn't all that much work to add in (most of the effort went into coding the menu for operating it), since the database is so optimized... but I guess that doesn't mean I can't tout it as a feature :P
Thanks! ^__^ The "Dexit" debacle (and overall decline in quality in recent Pokémon games) made me think "meh, I could do this better"... so I figured I might as well actually do it :P
I probably didn't actually do it better, but this is just a small example project showing how it's done... most of the bulk of the work was setting up an easy-to-use database system, from my experiences that's the hardest part for an inexperienced user to get right, and if you get it wrong it can make it a real pain to work on the project later on. (Got some first-hand experience with that...)
← Return to asset pack
Comments
Log in with itch.io to leave a comment.
Hey Yal. I'm back again, I am so so sorry for disturbing you but I got this thing bugging me and I can't figure it out. Basically, when my player object is beneath objects, it draws the head on the very top layer (I assume as part of how they are drawn in tall grass?) only problem is, I can't find where this is set to draw as the draw event contains only, as far as I can tell, the general drawing of the player sprite. I was figuring if I could locate the code that draws the head separately, I could add a:
if (place_meeting(x,y,obj_tallgrass_32) or place_meeting(x,y,obj_tallgrass_64) {
(the code that draws the head here)
}
so that when the player is below something say, a bridge on a higher layer, you don't see the head of the player. fake 3d, if you will!
Any help would be great, and hopefully it's not something obvious I've missed like a real dumbo the elephant.
Cheers Gov.
here's a pic, for clarity and what nots.
Yeah, there's a reason why you find no special code for this in the player object: it's actually the grass that handles it. Basically, the grass is in front of the player normally, but each grass object draws the top of the player after drawing itself if the player currently is colliding with it. (Basically, I use the "painter's algorithm" to make part of the player be above the grass... by just drawing it on top of the grass)
(For some reason I use dynamic rendering masks for this - I just realized that just drawing the upper half of the player's sprite with draw_sprite_part would've probably done the same thing but with much simpler code... x3)
On closer inspection, I just realized that this is a bug! The grass' drawing code uses || instead of && when doing the collision check, so essentially the player's status will always count as "in my particular patch of grass" and trigger the additional head drawing. Changing the the collision check ||s to && in obj_tallgrass_32's draw event (lines 13-16) should fix this. (obj_tallgrass_64 inherits everything from _32 so you shouldn't need to change that)
Thanks again :) and woo hoo! My idiocy was useful!
Fixed version is up! Thanks for the involuntary debug testing :3
Hey Yal, I picked the engine up about a week ago and have been working my way through the code to understand it. Just gotten stuck on where / how you define at what level monsters 'transcend' and if there is an script to remove a monster from the player, eg so you could do one of those in-game trades with an npc where you remove the players monster then generate a new one based on whatever they're meant to get in return? Thank you so much :)
Evolutionstranscendences are defined at Scripts-->Data Mangling-->Database Setup-->Init Monsters, if you scroll to the right a whole bit you'll see this data:(Basically it's an array of 3-member arrays, which represent the way to evolve, what thing triggers the evolution, and what monster to evolve to. For level evolutions, the trigger is the level to evolve at, for item evolutions it'd be the item ID, and so on... I'm unsure if I ever made item evolutions)
amp_clear_monster deletes a monster from the Active Monster Party (which is the big array that has all the monsters the player owns, including the storage boxes). Then you could use amp_generate_monster to create a new monster on the same AMP-ID, so it takes the exact slot the traded monster occupied. (Actually, you could just amp_generate_monster onto that slot directly, it clears the data with amp_clear_monster first). Once the monster is generated, you can manually apply unique quirks you want the traded monster to have (e.g. special moves or held items).
To get the AMP-ID of the monster to trade, I'd spawn a menu using msh_spawn_monster_list (which spawns a list of the monsters in the active party) which has a new "trade offer" menu event... it'd check if the monster in that slot matches what the NPC wants (that data would be stored in some global variables in the cutscene initialization script with the conversation) and if so, asks you a "ok?" question with msh_areyousure, and its OK script initiates the trade (sets the appropriate "trade done" flag, loads a different room with the trade animation, and then goes back).
If you need to familiarize yourself with how to carry data around, starting from mev_pause_monsters and looking into how the menus read party data further down the line should give you a good starting point in figuring out how to handle the AMP data (and the menu system in general).
Thank you so much Yal, it's amazing how intuitive your engine is, and how quick your support is! I can't believe I didn't scroll far enough to find the
evottranscendences! I'm such a dolt! I thought of one last question, I'm so sorry to keep asking, but is there any way to set evolution moves? ie, a move it learns as soon as it evolves into charachne? Thanks again and so sorry for the questions!Usually my support isn't that quick, I only check my itchio messages once per day... you just got lucky and posted that thing just a couple minutes before I happened to log in, gg :P
For evolution moves, it's going to be a bit messier since I didn't consider it when making the engine, but here's my idea:
In obj_evolutioncontrol, at line 73, add some extra code that checks if the newly evolved species (targevo) has any innate moves learned at level NONE. (Those are the moves they always know regardless of level). If there's any, attempt to learn them. The code of obj_battlecontrol's step event case 32 which handles newly learned moves (around line 1010) should be a good starting point for this new code (alongside with the code that sets the movelearn queue around line 997). It might be easier to add a new state to the evolution control's step event than trying to cram all this into case 20 where it waits for the menu objects to be done, just like how battle control uses one state to populate a queue and another state to read the next entry from the queue until it's empty.
With this system in place, you can define new moves learned on-evolution by adding innate moves to the evolved monsters which are learned on level NONE.
If you think the "level NONE" thing is a bit hacky and you want to fully separate always-known moves from on-evolution moves, add a new constant ON_EVO which is a value higher than your max level (e.g. 1000) and check for moves learned on that level in the evolution control instead of moves learned at level NONE. These moves can't be learned through levelling up, since the monster can't reach past the max level, so only the special case in the evolution control will do anything with the data.
Thank you again! Have a good day :)
LOL re item evolutions: I just found the script for them and it's just '//todo' XD
Hey! I just have a few questions to ask before buying. Hope it's ok:
How easy is it to change the resolution of the engine? Is their much tied to the resolution already or will there only be a few things I'd need to edit after changing it (I'm just thinking in my limited experience with GM that things like character speed would need to change, as well as any measuring etc) ?
How easy is it to change the animations for attacks, and the battle transitions etc?
Also, is there a grid movement system, and if not, do you think it'd be hard to add in?
thank you so much this looks amazing!
Changing resolution should be fairly trivial, the battle controller sets things up based on the room size and most menus are defined in terms of two constants VIEW_W / VIEW_H. You'll need to manually change room sizes / viewports of every room in the game, but there's just a handful of rooms so it's hopefully not too much work.
Overworld character speed is defined in pixels per step, but it's just one variable you need to change in the player's create event. You might potentially also want to change the TILESIZE constant if you change the tileset size (this will have some ripple effects like grid sizes in existing rooms also having a different size, but I've never really tried changing a tileset size so I'm not 100% sure how much of that is automated)
Attack animations uses any object you want (typically a child of the effect parent), the battle flow waits until all effects are gone before proceeding. There's a convenience script fx_deferred_projectile which lets you spawn a standard projectile which runs another script on-hit (which works for a wide range of attacks) but you can add as intricate effects as you want if you feel like it.
The movement system isn't grid-based, but it shouldn't be too hard to add in. You'd basically turn the overworld player into a state machine with two states (idle and walking): in idle state, if any movement key is pressed, if whatever's one tile in that direction is OK to stand on: switch to walking state, start a countdown of TILESIZE, and start moving in that direction. In walking state, reduce the countdown, and when it hits zero, stop moving and switch back to idle state.
thanks for all this, will probably pick it up in the morning :) cheers
If you have any more questions about how to use it, you know where to find me :3
While googling for some ideas to make a pokemon database, I came across this. And while I mostly understand arrays and such, I can't fully grasp them yet. Thank you for this code, I plan to build off it, or start from scratch after learning from yours to be used commercially. Your work looks fantastic. Thanks Yal.
Thank you for the patronage and kind words! I'll be looking forward to hearing about great things from you once you get your game out there :)
Every time I look you up there's a top-of-the-line asset to be found. I would have bought this day one had I known.
You can't keep getting away with this!
Thanks for the kind words! ^__^
I'm slowly but surely running out of things I haven't done already, but I'll keep making new asset packs until GM is perfect :P
Considering the sale ended 12 days ago, I feel like it would be unfair to everyone that has bought it in the meantime if I made a temporary discount just for you, even if you happen to be one of my most loyal customers. The monster collector engine release sale also lasted 1 week, instead of just 3 days which I usually use for release sales. There will be more Itchio sales, and I always join in when there is one, so just check back regularly and chances are you'll catch the next sale. (Itchio sends out e-mail notifications if you've got those turned on - I think it's possible to turn it up to max to get notifications whenever anyone you follow posts a new project, sale or a devlog on top of just the big site-wide announcements, too... if you do that, you'll never miss a sale again!)
You should also probably take some time to actually make a game with all those engines you bought too... Making 5 games at once tends to get pretty exhausting. :P
Bought it right away, this asset is absolutely insane and safes so much time with the backbone for this kind of RPGs.
Is there a storage system (can't take a look at the code before tomorrow) included?
Keep up the good work, you are really one of my favourite GM devs.
Thanks, glad you like it! ^__^
Monster storage system basically uses the gen3 system where you pick up monsters and move them around between boxes and the party. (Monsters caught when your party is full automatically is sent to storage). There's no item storage system, but you have infinite inventory space so that shouldn't matter (it's just more convenient now when you instantly have access to every item you own anyway).
Thank you, missed that shrine as I played the demo. Its even more impressive now, the storage system works like a charm.
(you should mention that in the description, as this is a killer feature)
Good luck with your sales, its totally worth the price.
I'm pretty sure it's already in the description, but I guess I could give it more emphasis... the storage system wasn't all that much work to add in (most of the effort went into coding the menu for operating it), since the database is so optimized... but I guess that doesn't mean I can't tout it as a feature :P
Ah! Another submission from you. Well done Yal!
Thanks! ^__^ The "Dexit" debacle (and overall decline in quality in recent Pokémon games) made me think "meh, I could do this better"... so I figured I might as well actually do it :P
I probably didn't actually do it better, but this is just a small example project showing how it's done... most of the bulk of the work was setting up an easy-to-use database system, from my experiences that's the hardest part for an inexperienced user to get right, and if you get it wrong it can make it a real pain to work on the project later on. (Got some first-hand experience with that...)