Comments

Log in with itch.io to leave a comment.

Viewing most recent comments 1 to 9 of 89 · Next page · Last page

Hey,

I have been working to get evolution items into the game. I have them working, for the most part. You can select it from the items menu, and then use it on a monster, who will evolve if they have an item based evolution that matches the used item. However, once the evolution ends and the room fades out, the game crashes and I'm not quite sure how to fix it. Here is the crash message:

############################################################################################
ERROR in action number 1
of  Step Event0 for object obj_roomchangefade:
room_goto argument 1 invalid reference to (room) - requested -12341 max is 8
 at gml_Object_obj_roomchangefade_Step_0 (line 7) -                      room_goto(my_room)
############################################################################################
gml_Object_obj_roomchangefade_Step_0 (line 7)

Here is the code of the evolution item:

///itemuse_evolution(amp_id,EvoItem)
function itemuse_evolution(argument0, argument1) {
    var monamp = argument0;
    var monid = global.active_monster_party[argument0,amp_MONID];
    var nevo = NONE;
    for(c = 0; c < global.monster_data[monid,mond_TOTALEVOLUTIONS]; c++)
    {
        if(global.monster_evolution_type[monid,c] == evotype_ITEM)
        {
            show_debug_message("Evolution type equals item")
            if(global.monster_evolution_arg[ monid,c] == argument1)
            {
                nevo = global.monster_evolution_mon[ monid,c]
                inventory_lose_item(my_item,1)
                ds_queue_enqueue(global.pending_evolutions_queue,[monamp,nevo])
                room_goto_fade_dontdestroy(rm_evolution,60)
                break;
            }
        }
    }
    if (nevo == NONE)
    {
        msh_itemuse_show_party_effects("It wouldn't have any effect.")
    }
}


I feel like I must be missing something about the room_goto_fade_dontdestroy function, but I don't know what. Any help would be appreciated. If you need any more details, let me know.

I tried to edit it can you share a video link to where I can just edit the source code, all of it, I search online can't find a code edit video for game maker

Here's the official GameMaker tutorial series on the code editor. (I recommend using GML Code since Visual doesn't really make things easier, just prettier to look at.)

(+1)

Thank God Oh I needed this so badly, I love the Pokemon engine you made, in fact I truly think it should get more coverage so many people are desprate for one & your is right here. I will definitely watch this

@Yal 🤔 So by “League Master”, is that another way of saying “Gym Leader”?

Since there's only one boss in the demo Fielder might as well be the champion. 😉

[total-mhp-atk-def-mag-res-spd] What does total mean? I get all the others but Idk why total is there

Total is the actual number of stat points, it gets subdivided proportionally over the stats (so the mhp-atk-def-mag-res-spd values are relative - e.g. if ATK is twice as high as DEF, the final stat will also be twice as high, but the actual value that gets stored in the end is TOTAL x ATK/(sum of all 6 stats), not ATK as-is).

The reason for why it's this convoluted is so it's easy to balance monsters - if two monsters has the same stat total, they should theoretically have the same power. (You can see this in Pokémon where there's tiers like "pseudolegendary" (600 stat total), the games never draw attention to this but competitive play communities does and that's where I got the idea originally)

Hello,

With the current logic in a battle with 2v2, if you select to attack 1 monster with both of your monsters and if the first attack kills the selected monster, the attack from the next monster will 'miss' and say 'there is no target'. 

Is there a simple way to update this logic so that if another monster is still alive on the enemy side it attacks that monster instead of missing? Kind of like a 'check for other alive enemies first before missing' function.

Thanks

The part which applies the move is the part (starting at line 671) which begins:

//Apply to all target(s) individually
for(var c = 0; c < array_length(a_targ); c++){

Currently it doesn't do anything special to detect targets not existing, it checks if the number of hits is 0 and the number of misses is also 0 to conclude that there was no target after the fact. (Done immediately after this loop)

So what I'd do is insert a check before this loop, which checks if the original target remains, otherwise gets a random one based on the move (using the function enemies use to pick random targets):

found_targets = 0;
for(var c = 0; c < array_length(a_targ); c++){
     var trg = a_targ[c];
     if(battle_is_alive(trg)){
         found_targets++
     } 
}
if(found_targets == 0){
     a_targ = battle_get_random_targets(a_user, a_comm); 
}
(+1)

Perfect thanks! Works like a charm :D

Hello! 

I was wondering if I could discuss a commission based on this engine? Please email me at squidbatgamesllc@gmail.com if you'd like to discuss this in more detail.

Hello!

I don't really do commissions, I'm afraid - I barely have time to bring my own ideas to life :P But if you're stuck on anything with the engine, leave a question in the comments and I'll reply to it within 24 hours.

(1 edit)

Hi Yal, thank you so much for making this engine, making my childhood dream of making a monster collector game possible! 
Recently I discovered a bug where when interacting with anything that opens a dialogue box (npcs, signs, chests, etc), it instantly reactivates once the dialogue is complete. The only way to 'get out' of an interaction is to hold down an arrow key that turns the player away immediately after the interaction ends.
I am still a beginner at coding, so I'm sorry if this seems like a silly question. I have tried messing around with deactivation alarms and checking the interaction scripts, but nothing worked. 
One thing I did notice is that in the free demo version of the game there's no such issue. Could it be my GMS version? Currently, I am using the newest Version 2024.06.2.162

(3 edits) (+1)

I tried it out and also can see it, so something has changed with GM's processing order that causes this (it was always a bug but it just didn't happen before for some reason, lol - presumably the player was always handled before the dialogue boxes but now it's handled after and thus retriggers the interaction immediately after it closes)

It's easy to fix at least, just update the "Interacting" block of obj_player's step event like so:

//Interacting
if(interaction_cooldown){
     interaction_cooldown--
}
else{
     if(k_a && !p_a){
         var o = collision_circle(
             x + lengthdir_x(TILESIZE,drawdir) - TILESIZE*0.5,
             y + lengthdir_y(TILESIZE,drawdir),
             12,
             parent_interactible,false,true
         )
         if(o > 0 && instance_exists(o)){
             interaction_cooldown = 5
             with(o){
                 if(object_index == obj_npc || object_is_ancestor(object_index,obj_npc)){
                     drawdir = (other.drawdir + 180) mod 360
                 }
                 if(interact_script != NONE){
                     script_execute(interact_script)
                 }
             }
         }
     }
}

Then just initialize interaction_cooldown to 0 in the Create event and everything should work as expected.

Thank you for the solution! 

Hey, I've been looking to create a monster collection game, and this looks like it might be a great base to start with, but I had some questions. I'm planning on using a simplified grid battle format, so battles would take place across a 4x3 grid. Is this something that would be implementable without absolutely tearing the code base apart? There are a fair number of other changes I would be making to the traditional battle system as well, including creatures being able to potentially learn more than four moves, moves that can be powered up, and more, but I think the grid is the biggest change. Is this engine flexible enough to handle those sorts of large system changes, or would I be better off starting from scratch (or with a different engine)? Either way, this seems like a great engine, it's really cool to see something like it created to help others.

(1 edit)

Yeah, all of the grid stuff will need to be custom-made, because there's no concept of positioning and ranges in the engine currently.

What I'm thinking will need to change:

  • obj_battlemonster currently just has its position as a visual thing, it will need to be able to move around... but more importantly they need to keep track of their current grid cell (because that's ultimately what matters, their x/y position is just a representation of that)
    • obj_battlemonstercircle is just a visual object representing the ground currently, but could probably be repurposed into grid squares; you'd give them variables for which grid cell x/y they represent and then be able to use them for reference for where to place monsters + maybe let them keep track of which cells are occupied or not. And then rather than always creating two, you'd create enough for the entire grid.
  • battle_get_valid_targets needs to take positioning and range into account, and in turn move data needs some new stats to store those (which would be added to init_moves/init_move).
    • Additionally, mev_battle_attack and bcontrolstate_ACTIONSELECT_ENEMY should be updated to do nothing if there's no valid moves to use instead of enqueueing the desperation attack (unless there's a target in range)
      • bcontrolstate_ACTIONSELECT_ENEMY additionally will need to select a new "move" action sometimes, e.g. when there's no targets in range. (And presumably you'll need to add a new action to the player action selection menu as well for moving, see bcontrolstate_ACTIONSELECT_PLAYER)
    • mev_battle_attack_select currently creates a menu to select targets when there's multiple targets and a move targets a single target; you could keep this menu but have it also discriminate by range and positioning. If you're OK with it just listing targets that should essentially be the only thing you need to do, but if you want it to highlight the grid cell you're targetting it gets a bit more involved - creating a GGUI region with no background sprite which covers the entire grid, then placing highlight regions so that they line up with individual grid cells. (Check out msh_terminal_load_page's section "Middle main: Box contents" for an example of how to make a grid menu, but the TLDR is that you want one "ggui_menu_region" for each cell, after ggui_menu_preallocate'ing a grid with as many cells as your battle grid). These cells's menu event field would be filled in with NONE if there's no valid target there, mev_battle_attack_select_target if there is.
    • Likewise, you'd do basically the same thing for selecting a cell to move to, except you have NONE if a cell is occupied and a new mev_battle_move_confirm_destination event if it's not + within your move range. (You'd probably want to add sprite elements to each cell which are just a red/green rectangle which represents if it's valid or not)
  • Currently obj_battlemonster remains even if the monster is KO'd and just is invisible, you'd probably want some extra logic to move them out of the grid when they're not replaced with backup so that a dead monster can't impede pathfinding and be selected as a valid target. Just setting their grid cells to a big negative number (like NONE) might be enough, as long as you don't try actually accessing the grid data if the position is NONE.
(+1)

Thanks so much for all the info! Looks like it should be manageable and a good place to get started.

Hey, can I ask what you changed inside of  tsprintf, for  your 2.3x fix please?   I had to import an older version in.  This is what I currently have, thank you: 

///tsprintf(format,...)

function tsprintf() {

//Trivial String Print Format

//Replaces each % percent sign with an argument, then returns the string.

//Inteded to make writing debug printouts less painful.

var c;

for(c = 1;c < argument_count;c++){

    argument[0] = string_replace(argument[0],"%",string(argument[c]));

}

return argument[0];

}

The change was to not modify argument0 directly, but to use a helper variable to hold it (I don't remember what the compilation error was but presumably argument is read-only after 2.3)

The current version looks like this:

///tsprintf(format,...)
function tsprintf() {
     //Trivial String Print Format
     //Replaces each % percent sign with an argument, then returns the string.
     //Inteded to make writing debug printouts less painful.
     var c, s = argument[0];
     for(c = 1;c < argument_count;c++){
         s = string_replace(s,"%",string(argument[c]));
     }
     return s;
}

Thank you very much for the reply, I really appreciate it. Hey what generation of Pokemon would this be like, Gen 2?

There's enough differences that there's not a 1:1 mapping (partially for legal reasons). If I had to narrow it down I'd probably say "gen 3" because there's support for 2v2 battles (and horde battles) which weren't around in the GBC days.

(+1)

Oh that makes sense. Thanks again for making this, it's an awesome engine!

Viewing most recent comments 1 to 9 of 89 · Next page · Last page