Comments

Log in with itch.io to leave a comment.

Viewing most recent comments 61 to 80 of 80 · Previous page · First page

I'm sort of interested in messing around with this and creating an APK, just curious if this is portable to mobile or if it's relatively easy with the given asset pack. Thanks for your help.

(1 edit) (+1)

I haven't tried (I don't own any of the GMS2 mobile export targets) but as far as I'm aware the engine doesn't use any Windows-specific functions.

I think the biggest stumbling block would be lack of touchscreen support... if you go with the "virtual gameboy buttons" approach a lot of the mobile emulators used to play Pokémon games seems to have picked (where there's a D-pad and A / B / Start / Select buttons on the screen and the rest doesn't respond to touching) this is probably not a huge issue, but if you want full touch support for menus, you're going to need to add that yourself.

On the plus side, all GUI elements are defined with basically the same logic and are put in a single array, so on a touch event (i.e., Global Mouse Pressed) you can basically loop through all elements in the currently active menu and see if any of them are in the target zone:


Thank you very much Yal for your response. I purchased this kit today to look into it. I was wondering if I could private message you a few questions on how to use this, and also had an idea on making a tutorial for others (unless there is one somewhere that I missed?).

Feel free to ask any questions you might have here (if they're public, this means anyone that uses the engine can benefit from the answers).

Hello Yal,

Thank you for your response. I think ultimately I need to brush up on my GML and a few common uses in GM that I'm unfamiliar with. 

I was trying to redesign the map, I was hoping to make a test level to travel around and experiment with but became easily lost in either GM or how things were placed. I understand the Overworld room and such, but much of it wasn't apparent to me.  

I feel that my issues are only due to unfamiliarity with GM 2, and being really unfamiliar in general. Honestly, this was maybe a bit too ambitious for me and I'll have to revisit this once I've spent more time with other tutorials perhaps.  My questions, even public, I feel are basic understanding that I don't yet have. 

For example, if I rebuilt a map using the tiles provided. I don't know how to find the code that says after the visit with Professor to start in my test world instead. 

Anyway, thank you for your time and thank you very much for this engine. I don't think I'm ready for this, but definitely something I will hang on to for further reference when I'm ready to take this on.  Appreciate it!

As you wish! Making an RPG is complex business, and it probably pays off to familiarize yourself some more with GMS2 before jumping in at the deep end. The engine isn't going anywhere, so you can come back whenever you feel ready! ^__^

To answer your last few questions:

A lot of map objects - doors, NPCs, items - has their variables set via the new-in-GMS2 GUI variable system (double-click a trainer NPC and then click the "variables" button on the details window that pops up for an example).

The code that warps you to the starting map at the end of the intro is in script cc_intro_startgame (cc is "cutscene command"). You can get some examples of how to make cutscenes by checking out any cis_* script ("cutscene initialization script")

(1 edit)

So I'm having a bit of trouble finding out how to make a monster evolve with the item evotype. How exactly does it work? Is it like the evolution stones in pokemon where you use them? Or do you need the monster to hold the item while it levels up? (I tried messing around trying to get both of these methods to work, but failed)

What should I be setting for type, validflags, use_script and use_arg for an evolution item in init_items?

(2 edits)

I think I might've never implemented that and forgotten to remove the constant... but here's what I'd do.

  • Scripts --> Data Mangling --> Item Use Effect, create a new "itemuse_evolve" script. You can use itemuse_healHP as a guideline.
  • If in battle (check if room == rm_battle), the script does nothing and creates a message that you can't evolve a monster mid-battle. (With msh_itemuse_show_party_effects)
  • Otherwise, get the global.active_monster_party[monamp,amp_MONID] and store in a variable "species" - that's the species of the monster we're trying to use the item on.
  • Check all the global.monster_evolution_type / global.monster_evolution_arg belonging to this species, and schedule an evolution if we can find an item evolution that uses this particular item:
foundone = false;
for(var c = 0; c < global.monster_data[species,mond_TOTALEVOLUTIONS]; c++){ 
  if(global.monster_evolution_type[species,c] == evotype_ITEM && global.monster_evolution_arg[ species,c] == my_item){
    ds_queue_enqueue(global.pending_evolutions_queue,[monamp,global.monster_evolution_mon[ species,c]]);
    inventory_lose_item(my_item,1); //Don't forget to consume the item
    room_goto_fade_dontdestroy(rm_evolution,60);
    foundone = true;
    break;//We don't need to loop through more evolutions
  }
}
if(!foundone){//Doesn't trigger an evolution for this species
  msh_itemuse_show_party_effects("It wouldn't have any effect.")
}
  • Now you can define the item in init_items so that it uses the  use_script itemuse_evolution, use_arg NONE, is of type itemtype_CONSUMABLE,  has valid flags itemvalidflag_FIELD, and it should just magically work.
  • Oh, yeah - and you should also store the player's coordinates before changing rooms like when they enter a battle. You can copy the code from cc_battlestart_trainer (the "load_" variables)

Sorry for the inconvenience, I hope this helps.

(2 edits)

How would you achieve an item sorting mechanism to manually rearrange items in the inventory? Any "easy" way under the engine conditions? 

(+1)

For swapping two items, it's a bit complicated. I'm thinking it'd be easiest to duplicate inventory_lose_item into a new script called inventory_swap_item(itemID1, itemID2) and modify it so that it loops through the inventory twice, once for each item; once you have the two inventory slots, you just swap the ID/QTY data of those two slots using a temp variable.

Easy so far, but the tricky bit is GETTING the two item IDs you want to swap. If you want the Pokémon-style "press select" approach, I'm thinking you'd have some code in the script_step of the inventory menu (spawned by mev_pause_items / mev_battle_item) which checks for the 'select' button, and if so, memorizes the currently selected item (see mev_pause_items_select for an idea how to do that) spawns a new identical inventory menu (i.e. like in mev_pause_items / mev_battle_item) but uses NONE for its menu event script (the argument to msh_spawn_inventory) and another step script, which, if Select is pressed, memorizes the newly selected item, and if it's different from the first selected item, swaps the two items. In either case, it destroys itself, leaving you with the original inventory menu - but it should be updated to match the new sorting order, so you need to rebuild it. mev_pause_items_use_actually_use has a code snippet that rebuilds the item menu after the inventory potentially has changed, so apply that to the original inventory menu (easiest if you set the "daddy" variable of the "find the second item" inventory copy to the original inventory menu's id - just remember you'd loop over daddy instead of daddy's daddy when copying the code)

And of course, you might want a custom draw script for the "find the second item" menu that draws the inventory AND an extra marker for the first item, to notify the player that they're in a "rearrange the menu" state.


Side note: for multiple sorting options (e.g. A-Z, latest, etc) I'm thinking the easiest way would be modifying the msh_spawn_inventory_fill_list_category script, which builds a ds_list of all items of that "page" (items are actually stored in one big list internally instead of being divided into separate pages) - you could change that to a priority queue instead and have priorities based on the currently active sort mode.

mev_pause_items_use_actually_use has a code snippet that rebuilds the item menu after the inventory potentially has changed; copy that and use it to rebuild the menu whenever the player presses the "change sort mode" button. You could put this button check in the script_step of the affected menus, and note that you would apply the changes to the menu itself, not it's daddy's daddy, so remove the outer with loop.

(+1)

Thats actually really helpful and points me into the right direction. Many thanks for the detailed answer.

(2 edits)

This is definitely a noob question but I'm trying to add my own stuff, new types, new moves, new monsters, but whenever I am adding the line of code to either init_types, init_moves or init_monsters, the text for the new thing (type/move/monster) is blue instead of red like the other things and there's a yellow warning saying for example "variable type_DRAGON only used once" and the game does not Run when I try to test it. (and yes, they are in the exact same format as the type/move/monster, I copy pasted the line under the previous lines and just changed the stuff in them)

Is there somewhere else that I also need to define the new types/moves/monsters in order to get them to work or is there some other fundamental step that I am missing?

The types, monster IDs and so on are colored red because they're constants. You can add them in the init_constants script. This is where the type constants are defined, for instance:

(You can define constants anywhere in GMS2 but it felt easier to have them all in one place for easy access)

Keep two things in mind: each constant of each enumeration needs to have an unique value (e.g. type_DRAGON should have value 8), and you should update the MAX constant to be one higher than the highest constant (e.g. after adding the dragon type, TYPE_MAX should now be 9) so the loops that goes through some things won't skip the newly added data. 

(+1)

Alright, thanks. I can't wait to play around with this.

Hey Yal, thank you for your great work. i am a total noob in gms2 but with this it is easy to make a basic pokemon game. But i have one question: How can i use different battler sprites in front and back position and not only a mirrored sprite? For example, when the front name (enemy) has the name spr_001 and the back (your monster) spr_001_b? I think about to buy more assets from you, because you are a genius ;)

The easiest way would be to modify monster_get_battlesprite to return different sprites depending on whether the AMP ID is an enemy monster or not (right now it always returns the monster data mond_SPRITE_BATTLE column), player monsters would use a new mond_SPRITE_BATTLE_BACK sprite instead.

You can tell if an AMP ID is an enemy by checking if it's >= AMP_FIRST_ENEMY. If it's not, it's a player AMP ID. (If you're curious, AMP = Active Monster Party, the database of currently loaded monsters - player party, player boxes, and enemy party)

To add this new sprite data, you'd need to modify init_monster so that it takes three sprite arguments instead of two (currently it takes battle and map sprites, you'd want battle, battle_back and map), then update init_monsters (with an "s" at the end) so that it initializes the monsters with those three sprites instead of the current two.

thank you for your answer. have you got discord? i dont want to disturb you but i am new in game maker studio 2. i dont want to paste parts of your code here. maybe you can help me there. i can not run it.

Can't run it? What version of game maker are you using? There's separate GMS2.2 and GMS2.3 versions of the source file, so make sure you used the correct version (if you're on 2.3, the 2.3 source file contains some small changes/bugfixes from the 2.2 version that were necessary to make it compile )

(+1)

oh it run perfectly. only after i tried to change monster_get_battlesprite, init_monster and init_monsters. there is an error (bug) in create_setup project. but thats my vault. i have to learn how to write GML. i have GMS2.3 from Steam Desktop.

(1 edit) (+1)

Hi Yal, I'm a pretty big fan of yours, I've seen you so many times on here and on the gamemaker forums over the years.

I was wondering if you had some insight on the best way to customize this?

I'm wanting to learn from your engine and eventually make my own version of it from scratch, but for now I'm just attempting to get my proof of concept working using this.

I would like to use my own project and import your monster battling/collection system into it if possible, but the amount of scripts it has is a little overwhelming. I wouldn't know what to bring and what not to bring, yet at the same time, I find it somewhat difficult to import my project into this one and get everything working correctly.

Please let me know if you have any advice, thank you!

Edit: Hey so I decided to go from scratch and look towards you engine for occasional guidance.. Wish me luck!

Thanks for the kind words! ^__^

obj_battlecontrol is the heart of the engine, I think its state machine contains almost half the code in the entire engine... but it's not quite enough to import it alone since it also communicates with the menus, the monster/move/party databases, and battle monsters and effects are their own objects.

There's a lot of dependencies between the different things in the engine, but I think something like this would be a good starting point if you want the entire battle system:

  • Everything in the "Battle" and "Menu" objects folders
  • The "Menu" objects have dependencies to the Menu Events, UI, and Drawing script folders
  • The "Battle" objects have dependencies to the Battle, Data Mangling and Effects script folders
  • There's a lot of misc dependencies to the "Maths n String Handling" scripts (in particular tsprintf is used everywhere)

Importing all of these would be a good starting point, and then test-playing to see if you get any "unknown function was called" errors - then you can make a judgment call if you'd want to import that script or replace the call with one of your existing ones (like the sound effect / music scripts - you probably have your own setup for that if you're partway through a large project).

Good luck! Feel free to ask any questions you're stuck on here, I try to check my Itchio notifications at least once per day.

(+1)

Wow, thank you so much Yal! I think I will do this so that I can have a project with only the battling present, so that I can reference it easily. Thanks again!

Hi, Yal! I just bought the engine and it's looking awesome! I was wondering if there was a way to integrate turn-based cooldowns on abilities instead of of PP cost? Kind of like the pet battles in World of Warcraft. Thanks for all your hard work! 

The easiest way would probably be to have PP regenerate by 1 every turn, and change the check whether the move has more than zero PP to check that it's entirely full. (Also you could reword the PP display when selecting the next attack so that it displays the number as either "ready" or as "X turns left", where X is max PP - current PP, e.g. how many more turns it takes for it to regenerate to full again)

Refilling PP probably would be easiest to implement in obj_battlecontrol's step event, state = ctst_ACTIONSELECT, substate = 0. (That's the start of the turn). Also, you'd probably want to add a case in the room transition when winning / losing a battle to refill all PP to max.

PP display GUI elements are set up in mev_battle_attack (starting at line 41) and mev_pause_monsters_status (starting at line 50).

The enemy PP check is at line 400 of the battle control's step event (state = ctst_ACTIONSELECT, substate = bcontrolstate_ACTIONSELECT_ENEMY). Player's PP check is mev_battle_attack at line 8.

(1 edit)

Hey yal, I'm adding in a move speed stat for each move, with the intention of using it to multiply the user's speed so I can create a sort of move priority (with most moves having a move speed of 1 so it doesn't have any effect, but a quick attack-like move having a speed of 2 so the users speed is doubled when using it for who goes first calculations) 

I'm just wondering if you know where is best to put it? at the moment I have changed line 421 in the battle control step event to:

(monster_get_spd(action_monster.amp_id)*global.move_data[a_comm,mvd_MOVESPEED])

but I get an error since a_comm isnt defined yet. I think this is because the engine doesn't actually check speed. on a turn by turn basis, right? So what I'm doing wouldn't be possible (at least the way I'm doing it). Any help would be much appreciated


Edit: just to let you know I have sorted the constants and everything else for move speed, as well as the init_move changes that were needed.

(1 edit)

The ID of the move the enemy monster(s) picked is in the variable mv, which is defined at that point... so just change a_comm to mv and it should work as you intended. Speed is only checked when actions are slated / enqueued, they're sorted in a priority queue using the speed as priority and executed in that order.

It might be cleaner to add your speed variable to the case 30 block a bit further down, since that's where slated actions get finalized. There's a block here that lowers effective speed by -75% if the monster is paralyzed, and you could add in a new block that checks if the action type (battleaction_COMM_TYPE element of the array) is an attack, and if so, multiplies the SPEEDPRIO element with the move's speed. It shouldn't matter where you put this as long as it's before the "Finally, enqueue the action" bit, but it's probably safest to put it after the ailment block.

(+1)

Thanks again, and actually that's a really good point. I suppose I need to consider how I wasn't paralysis to effect the overall priority, if it comes in after the move speed priority or before etc. Lots to think about. thanks again yal!

Hey Yal, is there any way to make a buff effect the user of the move whilst damaging the opponent? ie, you hit the opponent for x damage, then your speed gets buffed by 2?

There's no built-in "buff user" special effect type, so you'd need to add a custom one. The current buff special effect is handled in obj_battlecontrol's Step event at line 735-743, you'd copy that block to a new case in the switch statement that begins at line 780 (where effects that affect the user are handled). Just replacing the movespfx_BUFF constant in your new copy with the new constant, and changing all instances of the target variable trg to a_user in the new copy should be enough to make the code work.

Once all that is in place, just set your move's special effect to your new movespfx_BUFFUSER (and include the stat and buff tier like the existing buffs/debuffs) and you're good to go!

(+1)

Oh maybe I'm not as stupid as I thought, cos I tried something super similar and couldn't get it to work, but I also made a custom barbs script for self buffin so it was a bit messier I suppose. Thanks for this Yal!

Hi Yal

Thanks for this engine. I'm steadily working my way back to using Gamemaker  thanks to it. 

Please assist with these 2 queries:

  1. There seems to be a bug that freezes the game when you enter the menu to rename monster at the shrine but cancel without going through with it.
  2. How would I go about setting it so that the player uses "back-sprites" instead of inverted enemy sprites?

The freeze seems to be because the menu is destroyed with the default cancel, which doesn't advance the cutscene you're in. can_destroy is turned off just to prevent this by default, but you could add it in as a separate destroy script as a failsafe:

In msh_spawn_namingmenu at line 10, insert a new line:

script_destroy = csc_proceed;

Also insert the same line at line 3 in cc_shrinerename.

Now the menus should proceed the cutscene even if destroyed early.


For back sprites, there's a macro mond_SPRITE_BATTLE in init_constants. You'll want to add a new mond_SPRITE_BACK macro with an unique value, go to init_monster and add a new line after line 5:

global.monster_data[argument0,mond_SPRITE_BACK]    = argument2[2];

Now go to init_monsters and add the back sprite to the array of sprites that get passed in for all monsters.

To actually read the battle sprite, I think the cleanest approach is to edit monster_get_battlesprite. Check if the AMP-ID passed in is in the "enemy" region ( >= AMP_FIRST_ENEMY), and if so return the mond_SPRITE_BATTLE sprite, otherwise return the mond_SPRITE_BACK sprite.

Thanks for the clear response. It helped get the freeze issue fixed but please note that applying the code to msh_spawn_namingmenu crashes the game as it affects the first naming menu.

I applied the fix in cc_shrinerename only. Problem solved.


Can you give me more guidance on the back sprite? For example how exactly do I

Check if the AMP-ID passed in is in the "enemy" region ( >= AMP_FIRST_ENEMY), and if so return the mond_SPRITE_BATTLE sprite, otherwise return the mond_SPRITE_BACK sprite.

(1 edit)

You'd do it like this:

if(argument0 >= AMP_FIRST_ENEMY){
  return global.monster_data[amp_read_var(argument0,amp_MONID),mond_SPRITE_BATTLE]
}
else{
  return global.monster_data[amp_read_var(argument0,amp_MONID),mond_SPRITE_BACK]
}


The other thing I was vague about was where to add the back sprites. The init_monsters script has this place where we add an array of sprites for each monster:


Edit this and add a third "back" sprite after the map sprite. (Or before, if you prefer that, but then you'll need to make sure to adjust the changes I suggested for init_monster (without an "s" at the end) accordingly)

(1 edit) (+1)

Hi Yal

Thanks again for extra info. Seems to have worked

Hey Yal... I'm so sorry to ask another question.

How does amp_has_monster work?

I'm using it to gauge what starter they selected in the following way, but no matter what starter I choose it returns the first option (I,e if I choose plaugsprout, they still summon Draquatic)


Thanks, and sorry again


if amp_has_monster(monster_DRACHNID) {
return [[monster_DRAQUATIC, 15, NONE, move_TACKLE, move_BOOMBUBBLE, move_DIVERGE,]]
}

if amp_has_monster(monster_PLAUGSPOUT) {
return [[monster_DRACHNID, 15, NONE, move_TACKLE, move_FIREWEB, move_DIVERGE,]]
}

if amp_has_monster(monster_DRAQUATIC) {
return [[monster_PLAUGSPOUT, 15, NONE, move_TACKLE, move_LEAFSHOT, move_DIVERGE,]]
}

amp_has_monster just checks whether that AMP slot isn't empty. There's no script to check whether the player has a specific monster, so you'd need to make a new script with content along these lines:

///amp_player_owns_monster(monID)
//Returns true if the player owns at least 1 monster of the given species, false otherwise.
for(var c = AMP_FIRST_ACTIVE; c < AMP_FIRST_ACTIVE + PARTYSIZE_ACTIVE + PARTYSIZE_BOXED; c++){
    if(global.active_monster_party[c,amp_MONID] == argument0){
        return true;
    }
}
return false
Using that script instead of amp_has_monster should give the result you want :)

thanks pally :) Trying to make someone with a tram reactive to what you pick. I guess another method could be to attach a flag to whatever starter is picked?

Thing about being able to check if the user has a monster tho is like you could have an artist who goes 'oh I want to paint a picture of monster_a, could you show me one?' and then if you have it you get a reward or something :)


Thanks fer yer 'elp!

Yeah, setting a flag in the menu event for selecting the starter would be the more robust option, since it will also work even if the player would release or trade away their starter, for instance - and you'd also not have to deal with extra cases for the starter's evolutions!

true true! in this case, it's for the first person the trainer fights in the game, so they probably couldn't trade it etc, but you're defo right long-term

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.

(+1)

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)

(+1)

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)

(+1)

Thanks again :) and woo hoo! My idiocy was useful!

(+1)

Fixed version is up! Thanks for the involuntary debug testing :3

(1 edit)

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

(1 edit)

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 evo ttranscendences! 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! 

(2 edits) (+1)

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

(+1)

LOL re item evolutions: I just found the script for them and it's just '//todo' XD

(1 edit)

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!

(+1)

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.

(+1)

thanks for all this, will probably pick it up in the morning :) cheers

(+1)

If you have any more questions about how to use it, you know where to find me :3

(+1)

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.

(+1)

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

(+1)

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!

(+2)

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

Deleted 4 years ago

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

(+1)

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.

(+2)

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).

(+1)

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

(+2)

Ah! Another submission from you. Well done Yal!

(+1)

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...)

Viewing most recent comments 61 to 80 of 80 · Previous page · First page