Comments

Log in with itch.io to leave a comment.

Viewing most recent comments 21 to 60 of 80 · Next page · Previous page · First page · Last page

Hello - me yet again with another question coupe of questions. 

1) What would be your advice for setting up multi hit attacks e.g fury swipes, double slap

2) What would be the best way to make a move that gets more powerful if used in succession e.g rollout, fury cutter

(1 edit)

2) Is the easiest... since you've got access to the user's object instance you could add two local variables to obj_battlemonster, the last move used and how many times it has been used in a row; the times-in-a-row counter would be incremented by 1 if you use the same move as last time, otherwise reset. (You might also wanna reset it on switching, if you use an item, fail to act due to ailments, etc). You'd add a new "stronger if used in succession" flag to the move data and compute_damage would take the times-in-a-row counter into account if the move has the flag set.

1) Probably also is easier with new movedata fields; min/max number of hits. (Two separate fields if you want to allow moves to have a random number of hits - then you'd pick a random number between these with irandom_range. Moves that always hit the same number of times would have the min and max values be the same)

Where to insert this is a bit trickier, you could slate multiple actions but that duplicates messages and would run ailment checks multiple times. Another idea could be to make a separate "multi-hit deployer" object which is spawned after the regular damage/side effects block when the current attack has multiple hits; it would be a child of parent_battleturn so the turn doesn't automatically proceed, and would have a copy of the user/target data, the index of the move being used, and a counter of how many more hits it should cause. Whenever there's only one parent_battleturn left (remember, we're one too so the counter won't hit zero), it would run a copy of the damage/side effects code (ideally you might wanna break that out into a script to make it easier to keep adding new things in the future rather than actually duplicating it in two places ?) using the user/targets/move data it got a copy of, decrementing its hit counter each time, and if all targets are dead or the hit counter reaches 0, it destroys itself.

Hey, thank you so much for this engine:) I am learning a lot from it, all your stuff here on itch.io looks totally awesome! I also read through all the questions here to learn even more about the engine!

Also, as an advice for other mac users considering buying this:  This code worked fine on my mac, but to get it running you have to open and save it at least once in windows. Thats at least how it was for me!

For now, I have two questions: 

1: I would like to implement a minigame when the enemy attacks, kind of like Undertale. Depending on how many times the opponent hits during the minigame it would cause the player damage.  Is there a way to implement something like this?

2: Next to four attack moves I would like to also give the player four dialog options, giving the player the opportunity to either fight or talk their way to success during battle. Any Idea how I could implement this in an easy way?

Thank you so much in advance!

(+1)

Intriguing; I know GM is a bit weird with cross-compiling setups but I've never heard of anything like that. I guess some project paths won't get updated automatically unless you save on Windows and it was still using the ones from my computer...?

Anyway, onto your questions:

1) The attack is applied inside the loop in obj_battlecontrol's step event at line 672 (after the "//Apply to all target(s) individually" comment). The variable trg is set to each target individually; for your use-case I guess you would want to check whether that is a player or enemy character and do different things (it's the ID of a battlemonster object so just check its side variable) - for enemies you can keep the current system, but for players you'd branch out and create a minigame object instead, and it is responsible for applying damage, side effects etc depending on the minigame result. If it's a child of parent_battleturn the RPG turn flow should automatically wait until it destroys itself with no further action from your side.

(Basically add an if statement that checks if trg.side == side_PLAYER, if so create the minigame; then put the entire existing code into the else block)

If you want different minigames for different attacks, the easiest would probably be to extend the move data (see init_moves / init_move) and add a new field for "minigame spawn script" which is run when the move is performed, creating the appropriate minigame object(s) and setting parameters for damage etc.

2) I'm thinking the easiest way would be to give each enemy monster species an array of dialogue-options / script pairs, and then you start a cutscene where you immediately deploy a cc_question that uses it - basically what cis_shrine does, but you'd use a monster-species-specific variable for the menu alternatives rather than a hardcoded array; each of the scripts that are run when you pick an alternative would either display dialogue, enqueue extra attacks, or alter a "progress" variable in the affected enemy (or whatever else you want the dialogue system to be able to do)

For this system to work, there's a couple things you need to do:

  • There's two places where obj_battlecontrol's step event checks that there are no parent_battleturn instances; those checks need to be extended to also check that there's no obj_cutscenecontrol.
  • The monster data needs to be extended with a new field, the array of their dialogue options. You'd just store this as-is. (Game Maker didn't support arrays inside arrays when I made this engine so things like moves are broken up in the engine right now, but that's not a limitation anymore)
  • You'd need to add the "talk" option to the turn menu, its setup code's currently located in obj_battlecontrol's step event on line 359.
  • Figuring out who to talk to - so you can load their dialogue data into that dynamic cutscene - might require you to select a target, check out the code in mev_battle_attack_select for an example of how to do this.
(+1)

Yeah my guess was that mac needed the code saved in the most recent IDE to get it working. Anyways it works fine now!


Thanks a lot for the detailed advice, I will give it a shot!:)

(1 edit)

Hi me yet again,

When viewing a monsters status from the menu, is there any way to make it so that if you press say the up / down or left / right keys, it'll change to the next monster instead of having to back out each time and select a new monster?

Thanks

It's gonna be a bit complicated but I think this should work:

  1. in mev_pause_monsters_status, assign a new script to the script_step variable of the new menu that is created.
  2. This new script should check for left/right presses and if so do some stuff; we'll get to that in a little bit. Note that the menu objects already get_keys() every step so you only need to check the input status variables - if(k_l && !p_l) to check for a left press, etc.
  3. In mev_pause_monsters_status there's a giant block of code that creates the entire status menu. Break that out (everything inside the with loop) into a new script which takes two arguments monsamp and monid, these are the variables we use to read the selected monster's data - changing them to script arguments lets us reuse this blob of code without having to change it.
  4. In the new script, additionally add a new line of code at the top (before the call to ggui_menu_preallocate) which should be ggui_frames = 0; (this lets us reset the menu completely - if you haven't noticed it already the frames are containers for all other GUI elements and resetting the frame counter like this will override the old data with new data without the system noticing)
  5. In the now-empty with statement in mev_pause_monsters_status, add a call to that new script that just passes in monsamp and monid as the arguments, and additionally my_monster = other.my_monster so that we pass in the status menu's reference to the party.
  6. Now we can fill in those left/right events: they should first update my_monster (add or subtract 1; if below AMP_FIRST_ACTIVE or above-or-equal to AMP_FIRST_ACTIVE+PARTYSIZE_ACTIVE, add/subtract PARTYSIZE_ACTIVE to loop back to the other end of this valid range; repeat the operation if the monster in that AMP slot is empty), then recompute monsamp/monid as currently done in mev_pause_monster_status, and then finally call the menu-setup script with those values.

You can of course extend this to terminals as well, though you'd need a modified version of the left/right check step script that also knows that box the monster is in, and loops the cursor around its range.

(+1)

Great thanks for this, I'll give it whirl and see how I get on!

(2 edits)

Hello,

Maybe this is already asked but i can't find it.
Can you use your own art for the engine?

And i am learning to program / make something for myself and i think this can help me to understand more how to make a monster catching game

Thankyou

Yes, the engine is just a Game Maker project so you can replace anything you want!

(2 edits)

Hi there again. Three new questions

1) What does the total stat do inside the monster setup stat array?

2) Can a move have multiple special effects? Example Dragon Dance, raise Atk and Speed?

3) Where is the stat increases upon level up dictated?

(1 edit) (+1)

1) Stat total is the actual total stat distribution for the monster; the values inputted for the individual stats are scaled up so that their sum will equal this value. (This means you don't need to do the math to ensure all monsters of a particular tier are balanced, and the values for each stat only need to make sense relative to each other).

2) Not currently. There's a couple of ways to fix this, I think the easiest would be to rework how special effects work: currently, it's an array that must have 4 fields (or be empty) and they're unpacked into 4 separate scalar fields in the move data structure in init_move. (Chance, type, detail and severity). But you could just store the special effects array as-is when initializing the move; this lets you have as many fields in the array as you want. Specifically, you'd wanna have zero or more sub-arrays, each of which is a 4-element array with the same data special effects have now. When applying side effects (obj_battlecontrol's Step event, after the two comments "Side effects (target)" and "Side effects (user)", you'd loop over the outer of these nested arrays, and do the side-effect checks that currently exist for each element in that array (which would be a chance-type-detail-severity tuple). So for instance Dragon Dance would have the data

[
   [100,movespfx_BUFF,stat_ATK,1],
   [100,movespfx_BUFF,stat_SPD,1]
]

And to reiterate, this is an array with two elements; they just so happen to both be arrays with 4 elements.

3) Stats are always computed from the base stats, IVs, EVs and the monster's level. The final stats aren't stored anywhere, and stat points aren't added at any time. Check out monster_get_stat and the scripts it calls for the details.

Ah I see. Thank you, that makes sense. I'll check out those scripts and see what I can do there, thanks again. Another (hopefully easy one)

1) Is there a move / effect already set up to recover some HP relative to the attack i.e absorb or giga drain for example.

There is not; I think it would be pretty easy to implement though. Make a new "drain" side effect that applies to the target. When computing target side effects you already have access to the dmgdata variable (which among other things contains the actual damage dealt to the current target prior to applying side effects), and a_user, the battlemonster instance using the move, so it's pretty simple to apply a heal to the move's user using this information.

(1 edit)

Great, that's simple enough. Last question for now lol, where is the IV information held for each Mon? Is it held against each Mon or is it computed somehow? And does the way EVs and IVs work in this framework an exact copy or or there some differences?

IV and EV data are stored in the AMP data for that monster (AMP = Active Monster Party, the monster individuals that are in your / the enemy's party, contrasted to the general notion of each species). So, held for each mon.

They work a bit differently in this engine, both to make them legally distinct and make monster stats grow faster so you don't need to grind levels to beat the demo. If you wanna make them more Pokémon-like, all the stat calculations are in the stat-computing scripts we talked about a couple days ago - just change them there and it will affect all the monster stats in the game.

(1 edit)

New question. Once I've selected a move and it brings up the menu for selecting a 'target to attack' from the menu, where can I grab the monster id of the proposed target (the one highlighted in the menu) as in, the monster the player is thinking of attacking before it's confirmed? 

I'm implementing a battle cursor so that it highlights the enemy visually but I can only find the initial creation of the menu listing all the targets, not what the current proposed target is going to be based on this menu. If I'm going about it the wrong way feel free to correct me.

(2 edits)

The script mev_battle_attack_select will build this menu (listing only the targets that are valid depending on the move), and it creates an array "my_target" in the menu instance, which the menu later uses to slate the action when you confirm. Each entry in this array is the instance ID of a battle monster object, so you could just copy it (after it's been completely built) to your cursor object and then get positions etc by going through the instance IDs.

Now, your main question is how to keep this in sync with what you're selecting in the menu. It's pretty simple: script_step. Menu objects will execute this script after their regular menu-handing behavior if it's not NONE. (There's a whole bunch of these customizable behavior scripts for more complicated menus - check parent_menu's create event - but most of the time we only change script_draw)

Make a script that tells the battle cursor what the currently highlighted item in the menu is, and in mev_battle_attack_select, set the script_step variable in the menu to this script. (Heck, you could forgo the array-in-cursor entirely and just tell it to focus on an instance ID by having the menu check the array... that's probably easier?)

Also, you could use this to make the cursor automatically get destroyed when the menu is closed: in its create event and in this script, set an alarm to 2 steps. When the alarm happens, instance_destroy(). As long as the target menu exists, it will keep resetting the alarm before it can trigger, but when it's destroyed (after you confirm the target or cancel out), the alarm will run out and also destroy the target cursor.

(1 edit)

Excellent thank you for the in depth reply, I'll have a look into what you've suggested. For my next question, is there an easy way to add the 'box' functionality into the main menu instead of accessing it from a specific place etc?

Yeah, I belive just adding the menu option to the main menu should do it.

Open up the script cc_terminal and copy the code from there, except the csc_proceed() line, and then just paste it into a new script "mev_pause_boxes", then go to obj_player's Step event to find the code where the pause menu is created when you press the pause button - add a new line here that adds that new mev_pause_boxes option.

(+1)

Awesome thanks I'll try it out, appreciate the quick and professional support especially considering the sheer volume of my questions, sorry about that 😅

No problem at all!

(1 edit)

Me again lol. Another few questions which may or may not already been included, if they have if you could point me to those move examples that would be great.

1) Is there a way for a move to increase the damage of certain move types e.g like weather effects - Rain - increase water and electric moves?

2) Is there the ability for multi-turn moves where you charge on one turn and attack on the next i.e Solar Beam

3) Is there the ability for moves such as Protect where all damage is negated?

4) Is there the ability to force a move to go first e.g Quick attack

5) Is there the ability to force a critical hit?

6) Is there a way to force an attack to never miss i.e Swift

6) Is easy, just set the accuracy field to a really big number (all buff moves currently have 999 accuracy so they basically can't miss, though you might wanna go even further just to be sure).

1) There's no weather system currently. I'd probably implement this as a pair of global variables (weather type and remaining duration). At the end of every turn, count down the duration, and if it reaches zero, reset to "no weather" and display a message. Altering damage for certain types would be done in the script named compute_damage: simply check if e.g. it's raining and you use a water or electric move, and if so, change the multiplier variable accordingly. Effects like sandstorms/hailstorms dealing damage could be put in the same place ailment damage happens.

2) The easiest way to do this would be to implement a new Side Effect, I guess: the move itself does nothing, but has a 100% chance to add a "readied move" status which makes you skip the next turn's action assignment, and automatically enqueue the readied move (similar to how Sleep/Paralysis works), which would be special normally-unlearnable moves that unleashes the actual attack. These could be instance-variables in the battlemonster objects instead of something you store in the AMP data, similar to the buff array.

4) This is pretty straightforward, currently moves are added to a priority queue (with action_slate) using purely the monster's speed as the sorting factor. You'd add a new field to move data for "priority", which would be 0 for most moves but 1 for moves that strikes first; add a large number which will exceed the max possible monster speed stat (like 1000) times the selected move's priority value to the sorting factor when slating a move. (Also note you could give some moves negative priority to always happen last once this system is in place)

You'll probably need to increase BATTLEACTION_SPEEDBONUS_ITEM to 10,000 and BATTLEACTION_SPEEDBONUS_SWITCH to 100,000 while doing this, so high-priority moves can't happen before an item use or switch.

3) This would be a combination of the solutions to #2 and #4: give the protect move a high priority value (I think Pokémon gives protective moves 6 priority while Fake Out has 3, Extremespeed 2 and all other first-strike moves 1?) and make it apply a special 1-turn side effect (which is cleared when the turn ends) which just overrides the accuracy check ("if(random(100) <= acc-eva){" in obj_battlecontrol's Step event) - i.e., you check for the "protected" status (another instance variable for battlemonster objects) and if true, you enqueue a priority action that displays a message that the move failed due to protection rather than doing the regular hit chance check.

5) Currently there aren't even critical hits in the game, so I guess the easiest way to do this would be to add a "crit%" field to the move data and do a separate crit roll in compute_damage, returning an additional value, true/false depending on if it was a crit or not - this would affect the message and potentially sounds/visual effects... you'd also update the damage value accordingly, since crits could ignore defense... so you'd need to do this check early on. I think the easiest place to do this would be right before the "read level" segment: do a crit roll based on the new field (global.move_data[move,mvd_CRITCHANCE]) and if true, set def_buff to min(def_buff,1) and multiply atk_stat by 2. (And to make a crit guaranteed, set the crit chance to a number greater than 100)

Awesome, thanks for the in detail response there, the support you're giving is top notch. 

As an aside, do you have any plan to implement any new features to the framework at any point, or is what is offered now the final product from you? More curious than anything, what you've already provided is an amazing product for games like this to get off to a great start so I'm very happy with the purchase :)

I consider it done and final - the way Game Maker projects works, it would be really hard for people to just import the new features into their existing games, anyway, so I'd actively give people a problem if I messed around with it too much. If a new GM change completely breaks it, I'll release bugfixes, though. (array_length_1d is used all over the engine but has been deprecated, for instance, so that might become an issue at some point... easy to fix once you know about it, but I don't wanna force my paying customers to go through that just because I'm lazy!)

(+1)

Okay, I understand and it makes complete sense. Thanks.

(+1)

I just want to leave a big thank you. My last comment was from 2 years ago when I bought this and I've learned so much from the code. I don't use it for any (active) project, but I learned a lot about viable database structures. Keep up the good work

(+1)

Glad it could be of some use! ^__^

I see all of these engines as learning tools (after all, once you get better at coding any pre-existing code tends to feel restrictive and annoying to deal with) but I don't usually get to see people learning so much they can leave the proverbial nest and spread their wings! Thanks for coming back and telling me about it, it warms my heart :)

(4 edits)

Is there a script / function that I can easily call which adds a mon to the party? I'd also like to set it up so 2v2 is the standard, how do I go about that?

Not 100% sure what you mean with "add a mon to the party", is it a new mon or one from a box?

If the former, check out how mev_intro_starterselect_confirm does it: first get the first free AMP (=Active Monster Party) slot in the player party region, then generate a new monster there. The latter (swap out a pre-existing monster) is a bit trickier but there's code for this in mev_terminal_interact.

For multi battles, the important thing is setting the two variables global.player_side_monsters and global.enemy_side_monsters to the amount you want on each side (in your case both would be 2). Check out the scripts cc_battlestart_trainer and player_step_fill for trainer and random encounters respectively.

A new mon, like at the start of the game instead of the selector or a gift from an NPC for example, something like GetNewMon(monster) and it'd just go off and add it to the party if it can or a box if not, but I'll look into what you've said and go from there.  And I'll look into the global vars, appreciate the response. Great framework tho, I've had to do some bits for it to work at a smaller res but that was simple enough once I'd read through the code a bit.

Another question, I'd like to give items in the inventory little icons. I was thinking that I could just add this info into the init_item and then add some code to draw the icon sprite within the inventory menu, any reason this wouldn't work?

The code when a monster is caught should do basically what you want, then (find the first free slot in the party or box structure, and then copy the monster data from the enemy section to there).

And yeah, your line of thinking for item icons is exactly what I'd recommend! Just make sure to use a "scrollable sprite" type when coding the new menu element, so it fetches data relative to the current cursor position - basic "sprite" would essentially hard-code the sprite. (All the name strings in the inventory does this too)

(2 edits)

Awesome thank you. Another couple of questions:

1)  where is the flashing white cursor code located? I can't for the life of me find that. 

2) Is there a 'delete file' feature already created or any other save file management implemented aside from saving and loading? (like overwrite or multiple saves from the same file etc)

Also, if there is a better means for me to ask questions/seek support then let me know :)

Itchio messages are my preferred method of communication, it's nice when the questions (and answers!) are located next to the game for assets in particular and I check my messages at least once every day (unless something really serious gets in the way).

1) The flashing white rectangle that's overlayed on top of the highlighted menu option? It's in the script ggui_draw. It's actually drawing a rectangle with vector drawing instead of drawing an asset.



2) No. I'm kinda scared of implementing stuff like this because I always worry they'll go wrong and delete someone's progress, so I prefer leaving the responsibility to the player's operating system.

Hi, this looks really good and I've played the demo for a bit and I just had a few questions for if certain functionality is included and if it isn't is there plans for it or would the engine be extensible enough to include it with some work my side.

- item to teach a move to a monster

- more than 4 moves per monster

- Abilities, special effects that each monster possesses (passive skills basically)

Thank you

None of those are included by default, but since this is just a Game Maker project it wouldn't be impossible to include them.

  • More than 4 moves per monster would be relatively easy, just add a few more fields in the monster data structure and increase MONSTER_MAX_NUMBER_OF_MOVES accordingly. The biggest effort here would be to resize menus so more moves will fit visually.
  • Item to teach a monster a new move would be a bit more work (needing some custom menus) but ultimately you should be able to leverage the existing code for learning a move by levelling up here. You probably want some data structure for which monster can learn which moves, too (a big reason I didn't include this was because I figured it was too much work setting up a system like that which would still work for every user's use-cases).
  • Passive skills would need to be added to the monster species data, but ultimately would be similar to held items (check obj_battlecontrol's step event and look for all calls to the function "battle_item_might_affect_this" - you'd basically do the same type of checks, but for passive abilities). I.e., the skill has a trigger condition like "on damage" or "after your turn", and you check if the affect monster's passive skill has that trigger; if so, you invoke its effect script. (And then the script decides if anything happens - an ability like Flash Fire or Spiky Body only triggers its effect on certain types of moves but you would run the script every time the monster takes damage anyway and let it decide based on current attack data and such)
(+1)

Ah I see. Thanks very much for getting back to me so soon, going to give this a whirl over the weekend 👍

(1 edit)

You can make good top-down racing engine. If all your engines are like this, we will be happy to buy the ones that are potentially useful to us. It will speed up our work on new titles. In the end, there will be little of them, but at the beginning it will be a great help.

(8 edits)

Hello. I have question. You can write in turn, as you have arranged these icons in the program?

-Poison - I understand...

-Bleeding - I understand...

-Blindness - I understand...

-Immolation - when someone is on fire? Good?

-Strain - I do not understand this! When is someone tired? 

Or maybe stunned?

-Flinching - when is someone scared? Good?

-Paralysis - I understand...

???


This icons will be good?

I don't understand 5... "Strain". Could you explain to me? Because the translator translates it strange.

(+1)

Strain = lose extra MP when doing a move. (I got the idea from Shin Megami Tensei). It's basically the "Spite" move from Pokémon, but as an ailment.

(1 edit) (+1)

Like "Resentment" i think?

You think icon ZZZ is good for this?


or better this?

There will be a game when we finish ;)

https://husaria-games.itch.io/pixel-monsters

(+1)

Second icon is more readable IMO, but it's your game :P

(7 edits)

Yal... I have problem with add more monsters. I added 32 but in Monsterpedia (new name of my ...pedia) I have only 19 when I take this monster #macro monster_ORANGE_FOX 18 from start. When I take this monster for start #macro monster_FROG 22 i have 23. And when take this #macro monster_RABBIT 31 i have all 32. This 3 monsters these are the ones I choose at the beginning (NEW GAME). 

Only shows me in MONSTERPEDIA these monsters before the one on the list + his.

EXAMPLE:

When I take #macro monster_HORSE 3 (number 3) I have in MONSTERPEDIA only 4 monsters: 

#macro monster_HYENA 0

#macro monster_TIGER 1

#macro monster_GOAT 2

#macro monster_HORSE 3

Where is problem? :(


I make something like this:

On start Im take #macro monster_HYENA 0 (I have only HYENA in MOSTERPEDIA). I go fight. First monster with whom I fought it is #macro monster_BADGER 7. When I finish I have in MONSTERPEDIA 8 monsters (6 with "???" and HYENA and BADGER. Off course this "???" are a previous numbers of monsters before BADGER. And I go fight with another #macro monster_ELEPHANT 9. Now I have 10 monsters in MONSTERPEDIA. 7 with "???" (unknown) and 3 met by me. 

These "???" these are the ones in front of the elephant. It should not immediately display a list of all that are added as unknown, ie with the characters "???"?Because he only adds when I get to know (the one I meet) and everything in front of him then (MACRO is about numbering), of course, those before the known (apart from those known) are marked with "???" that is, marked as unknown. 

But it doesn't make sense. I think this is some kind of error or I am doing something wrong.

I changed your names to my monsters names. I checked everything 5 times. I missed nothing. 

Nothing else I touched except the graphics.


And I check your demo. You have this same bug in it.



-------------------------------------------------------------

//Starters

#macro monster_HYENA 0

#macro monster_TIGER 1

#macro monster_GOAT 2

#macro monster_HORSE 3

#macro monster_SNAKE 4

#macro monster_COW 5

#macro monster_LION 6

#macro monster_BADGER 7

#macro monster_DONKEY 8

#macro monster_ELEPHANT 9

#macro monster_HIPPO 10

#macro monster_RHINO 11

#macro monster_DOG 12

#macro monster_CAMEL 13

#macro monster_POLAR_BEAR 14

#macro monster_CAT 15

#macro monster_OSTRICH 16

#macro monster_MOOSE 17

#macro monster_ORANGE_FOX 18

#macro monster_PIG 19

#macro monster_SHEEP 20

#macro monster_KANGAROO 21

#macro monster_FROG 22

#macro monster_GIANT_SNAIL 23

#macro monster_HEDGEHOG 24

#macro monster_PANDA 25

#macro monster_PLATYPUS 26

#macro monster_POLAR_FOX 27

#macro monster_SKUNK 28

#macro monster_SQUIRREL 29

#macro monster_TORTOISE 30

#macro monster_RABBIT 31

//Gotta enslave them all!

#macro MONSTER_MAX 300

#endregion


--------------------------------------------------------------

///cc_intro_startermonsterselect()

function cc_intro_startermonsterselect() {

var mon, mons, xx, ww;

mons = 3

mon[0] = monster_FROG

mon[1] = monster_ORANGE_FOX

mon[2] = monster_HORSE

ww = 1/mons

with(instance_create_depth(x,y,depth-1,obj_gguimenu)){

ggui_frame(VIEW_W*0.1,VIEW_W*0.35,VIEW_W*0.8,VIEW_H*0.25,NONE)//Yeah, we can do invisible frames!

ggui_menu_preallocate(mons,1)

ggui_element_text_settings(font_mainmsg,c_black,1,0)

for(var c = 0; c < mons; c++){

my_monster[c] = mon[c]

xx = (c + 0.5)*ww

ggui_element_sprite(xx,1.00,global.monster_data[mon[c],mond_SPRITE_BATTLE],0)

ggui_element_text(  xx,1.05,global.monster_data[mon[c],mond_NAME])

ggui_menu_region(c,0,mev_intro_starterselect,xx - 0.5*ww,1 - ggui_frame_get_coord_y(128),xx + 0.5*ww,1)

}

menu_can_destroy = false

}

}

(1 edit) (+1)

Only monsters you have seen get added to the list, it ends with the last monster you have registered:

If you want the entire list to be visible immediately, you could remove this loop and set maxmon to the value MONSTER_MAX-1 instead.

I was wondering do you plan to make a Yu-Gi-Oh type engine, card collection I think if you modified this one it might work into it

No plans, sorry. (The hardest part with making a collectible card game is making all the rules, and that's a very per-game-specific thing that's hard to make a general system for)

Understood

Deleted 1 year ago

I'm just checking the update has the entire source code correct because I need to modify it, & you need to make some tutorials either a video with text or PDF so I can understand how to use it better thanks 👍

Yeah every update has the entire source code (it's the entire GameMaker:Studio project file)

(1 edit)

Hey Yal, I'm wondering if you could help me on what to do for making moves that can do the following:

-Metronome like effect, completely random move

-A random move from a specific type (Example: Channel, uses a random Ghost type move)

I'd also like to make one that deals a random status effect, a random move from a list of specific moves, and a random stat lower or raise, but those ones I could probably figure out on my own once I know how to make those two. Also, I guess the metronome like move would need a blacklist so you don't pull out a boss-only move or something.

The answer to all of them basically boils down to "make a list of all moves and then pick a random entry from the list"... for very narrow categories you could build these lists manually, but for large lists (e.g. Metronome specifically) you could do this automatically: loop over all moves (after you've defined them in init_moves) and add the move ID to the list if it's valid (you could check validity using a new "valid for metronome" property, or your own list of invalid moves)

Now for the tricky part, when to do the table lookup and how to work it into the move system... I think this would be the easiest way:

  • Make the move target the user (movetarg_USER), be of movecat_SUPPORT category, have no damage, but a 100% chance to trigger a special effect
  • The special effect is of a new movespfx_METRONOME type, the "detail" field could be a reference to which random list of moves to pull from
  • When the side effect is rolled (battlecontrol step event, line 778 onwards ("Side effects (user)"), you action_enqueue_prio the new move you pick from the list (thus making it be performed immediately instead of being scheduled based on the Speed stat). You can use battle_get_random_targets() to get a random valid target for the move, see the bcontrolstate_ACTIONSELECT_ENEMY section at line 393 onwards where it selects moves from the AI.

Hey Yal, thanks a lot for this engine !

I'm actually trying to change how the battles works, but as a beginner I'm a bit lost on how the moves works.

Instead of the menu I would like to assign each attacks to one button, and the monster taking the damage if they were touched by an hitbox, but I don't really understand how to call for these moves. I guess it's about the amp_moves but I don't really know how. 

sorry for the specific question ^^

Move IDs are stored in global.active_monster_party[amp_id,amp_MOVE1] through global.active_monster_party[amp_id,amp_MOVE4] and then move data is stored in the global.move_data array.  So after you get a move ID from amp_MOVE1...amp_MOVE4 you can look up global.move_data using the ID you looked up and the move data constants (they begin with the prefix "mvd_")

Deleted 2 years ago
Deleted 1 year ago

Game Maker has support for networking, but I've never managed to get online multiplayer to work myself so I'm afraid I can't offer much help here.

Engine-wise I'm thinking you'd have the other player act like an AI player, and then their moves are based on what the player selects, with netcode synchronizing player inputs... you'll also need to make the RNG shared so things like variable damage and chance-based effects will be the same for both players.

(1 edit)

I have several questions

1. how do I change what ev's a monster gives?

2. how do I make items that make specific monsters learn a move like tms?

3. is there a way to make monsters give less exp when deafeated?

4. I tried making battles 2v2 but right now if the player only has one the game crashes, and I couldn't get the enemy to have 2 without crashing

5.  is there a wat to make a certain encounter with a monster have the monster have set ivs?

6. right now I can't find a way to view the move descriptions

7. how would I exclude some monsters from the monsterepeda?

8. I found a bug: after you run from a monster if you press the main button a bunch it will take you to the spot where the player character is in the room

9. how would I make a monster that evolves into 1 of 2 monster randomly?

10. is STAB implemented? and if not how can I put it in?

1. There's a stat for this in init_monsters, search for "mond_EVBONUS_STAT".

2. This is a bit tricky, but the basic steps would be:

    - Create a new itemtype + usescript (check out init_items for the context for what these means) and add the new items to init_items

    - The usescript first checks if the monster is compatible (if you want to have a check like this) and then does something similar to mev_monster_learnmove_spawnmenu (check out obj_battlecontrol's step event at line 1022 to see how it handles whether the monster has empty move slots and can learn moves immediately).

3. EXP calculations are done in obj_battlemonster's step event, line 94. Currently it's based on the monster's levelup EXP but you could add a new stat to the monster data for this for instance, or just lower the factor from 0.1 to something lower.

4. What's the crash error message? Player monster slots should start as KO'd if there's not enough monsters left that can fight, and you need to generate enough enemy monsters to fill all their slots. Check player_step_fill line 33 for how horde battles are generated currently.

5. Check out obj_npc_trainer's User Event 0, line 11 onwards it generates monsters. You could do something similar with a new "set encounter" object which generates new monsters and then overrides anything you want to change. (I assume you want to use this for legendaries so it'd also set the battle mode to wild instead of trainer)

6. It's currently only used in the learn new move menu (mev_monster_learnmove_spawnmenu), I guess I forgot to put it in when making the pause menu...

7. The easiest way would be like this:

    - Add a new constant before MONSTER_MAX named MONSTER_PEDIA_MAX which has a lower value

    - Go to mev_pause_moncyclopedia and change the first loop to end at MONSTER_PEDIA_MAX-1 instead of MONSTER_MAX

    - Give all excluded monsters an ID number between MONSTER_PEDIA_MAX and MONSTER_MAX

8. I don't understand your explanation.

9. I think something like this could work:

    - Create a new evolution type "evotype_RANDOM"

    - Every monster that has this evolution type has an ARRAY of evolution monsters (third slot in the evolution data)

    - amp_earn_exp checks for levelup evolutions, after line 40 add a new case that checks for evotype_RANDOM, and if the level requirement is met, sets evo to: global.monster_evolution_mon[ monid][c][irandom(array_length(global.monster_evolution_mon[ monid][c])-1)]

10. Yes, it's computed in the script compute_damage, line 50.

(1 edit) (+1)

Man do you know How amazing you are?

This is perfect 

(1 edit)

How do I change the capture rate of each individual monster? and how to change how much exp each monster gives?  also, how do I make battles have more monsters?

  1. Check out itemuse_catch, which computes the catch rate for a given stone. Currently it's the same for all monsters, but you could add a new "catch rate" stat for each species (see init_monsters / init_monster), and then get the species data using the AMP_ID. (i.e.,  something like global.monster_data[global.active_monster_party[amp_id,amp_MONID],mond_CATCHRATE] )
  2. Currently EXP is computed in obj_battlemonster's step event, case 30 (bmonsterstate_DIE), using the same formula as levelup EXP (script monster_get_next_level_exp), which in turn is based on the monster's EXP group. Easiest way to influence this is adding more EXP groups, but if you want full control you could add an "EXP loot" stat just like the catch rate, and use that. (You probably want something that scales with the level, but of course it depends on how you want your game to work)
  3. Check out the variables global.player_side_monsters / global.enemy_side_monsters (set them to the number of monsters you want each side to have before you start the battle - currently this is done in the script player_step_fill)
(1 edit)

Is there by chance already a system to exclude encountering monsters that are currently in your party? I seen the possibility of doing something within the ects_placeholder function, but with out doing a bunch of if statements?

(1 edit)

There's no built-in system, but it should be easy enough to set up.

In obj_player's collision event with obj_encounterzoneselector, after line 8 insert some new code:

for(var b = 0; b < array_length(global.encounter_valid_monsters); b++){
  for(var c = AMP_FIRST_ACTIVE; c < AMP_FIRST_ACTIVE + PARTYSIZE_ACTIVE; c++){
    if(global.active_monster_party[c,amp_MONID] == global.encounter_valid_monsters[b]){
      array_delete(global.encounter_valid_monsters,b,1)
      b-- //Deleting shifted everything back one step so re-check
      break;
    }
  }
}

(this is completely untested so use with care)

the encounter_valid_monsters array is common to all ects_* (EnCounter Table Setup) scripts so modifying it directly like this means it should work everywhere in the game.

Thank you. So far after testing it's worked perfectly. One more thing. What would best way to go about have a "Release Monster" from party in status menu? Thanks again for the help.

Call amp_clear_monster() on its AMP ID to reset a monster's data (AMP = Active Monster Party is the list of "currently loaded" monsters, e.g. party, boxes and enemies). 

Sorry to bother you again, but still learning. I'm struggling on updating the monster part list. Maybe you can point me in the right direction on what I'm missing. This is what I have:

function mev_pause_monsters_release_confirm() {     with(instance_create_depth(x,y,depth-1,obj_gguimenu)){         daddy = other.id         message_spawn(tsprintf(                 "You released %.",                 amp_get_monster_name(other.my_monster)))         amp_clear_monster(other.my_monster)         with(daddy.daddy){             if(object_index == obj_terminalmenu){                 msh_terminal_update()             } else {                 msh_spawn_monster_list()             }         }         instance_destroy(daddy)         instance_destroy(daddy.daddy)     } }

It looks pretty reasonable, but you both update and delete daddy.daddy... I think you meant this? (destroying the "are you sure?" menu and the "what do you want to do?" menu)

instance_destroy()
instance_destroy(daddy)

(also of course you need to set my_monster to the AMP_ID (index in the Active Monster Party array) of the monster you want to delete when you create the menu that eventually runs mev_pause_monsters_release_confirm() , so the variable has a valid value... I presume you're doing this?)

Well after further testing it does break after you catch all the possible monsters for that zone.

(+1)

One way to fix that is to add some code setting the step range really high if the list of monsters is empty:

if(array_length(global.encounter_valid_monsters) < 1){
  global.encounter_step_range     = [9999, 9999]
  global.steps_to_next_encounter  = 9999
}

For additional stability, go to player_step_fill and add an if statement around line 10 to not count up encounter steps if the limit is 9999:

if(global.steps_to_next_encounter < 9999){
  encounter_steps++
}

Thank you very much for all your help. That worked and was a much easier solution then what I was thinking.

Hey, how would I go about adding abilities to the game, for example stuff like Water Absorb that heals you when hit with a certain type of attack?

Easiest way would probably be to add a new argument to init_monster which is supposed to contain an array with at least four elements; trigger constant, trigger function, name string, and description string (the last two are optional but you probably want them for the status screen later), and then go through init_monsters and make sure every monster gets an ability. (Of course you need to define new "mond_" constants for these new data points and increase MONSTER_DATA_MAX accordingly, on top of adding the trigger constants and making some scripts)

The idea is that you add triggers wherever an ability could affect something: every turn, on damage, when first entering battle, etc. Check if the monster in question has the matching trigger constant, and if so, run its script. For your Water Absorb (and Flash Fire, Lightningrod, etc) example specifically, check out obj_damageapply's Alarm 0 event, near the bottom:


You'd basically want a check like this, but for the monster's ability instead of its item. (And since it might potentially cancel out damage, you want it at the TOP of the event instead - the "water absorb" ability effect script would set my_dmg to a negative value before it's applied, so it becomes healing)

Side note: if you want monsters to potentially have different abilities, you should also add ability slots to the "amp_" (Active Monster Party) system, and make amp_generate_monster pick a random ability out of the available choices from the species data (and of course, you look up AMP data instead of MOND data when you check if the ability applies). If you're gonna reuse abilities a lot you'd probably want to make a whole ability data array and have references to that instead of storing the entire trigger+script+name+description per-monster. But one step at a time!

Maybe a bit of a weirdly specific question, but I was thinking of pokemon like Spinda, where their markings are essentially randomly placed. Usually I would do this with a clipping mask and a random x and y coordinate when drawing the sprite, but I was curious if you knew off the top of your head if this would work? I would probably need to add the X and Y variable to the individual monster, and use that?

I think the easiest way to do things like this would be to expand global.monster_data and add a "draw script" field. Whenever the monster is drawn, invoke this script instead of just draw_sprite/draw_sprite_ext (you can find all cases where a monster is drawn by doing a project-wide search for the "mond_SPRITE_BATTLE" constant). For monsters that don't need any special drawing, you'd add a default script that just draws the sprite like normal.

This is gonna be a bit tricky since a lot of the drawing is in menus (shrine terminals, status screen etc) so you'd probably need to add a new type of GGUI element that contains both a sprite and a script to draw it with (right now monsters are drawn in menus by creating a sprite element containing their sprite).

For the random markings themselves, the easiest way would be to use random_set_seed() and construct the seed from something that's unique to the monster and won't change - e.g. some sort of hash of their IVs (or you could give them a new "ID number" field set to like, irandom(9999999) when generated with amp_generate_monster() if you think that's easier), then generate the random coordinates to draw with, and finally randomize() to reset the RNG again. This way, the random numbers will always be the same for the monster, but you don't need to store them in any way.

Thanks so much for all your super in depth answers, it's always helpful!

Curious because I couldn't see any built in function for it, what would be the easiest way to change text speed temporarily? To give the effect of someone speaking slowly, for instance.

Secondly, I don't see an easy way to do this in your code anywhere, so I was curious about "gift" monsters. I.E. an event that just straight-up gives one specific monster upon talking to someone.

Thanks again so much for your responses.

(1 edit)

Gift monster ID's easier, so let's start with that.

Try amp_get_new_party_id to get the ID of the first empty slot in the party. If NONE, there's no empty slot - either abandon the gift procedure and tell the player they need to make some room in the party, or amp_get_new_box_id to get the first empty slot in the storage system instead. When you've got an empty slot, use amp_generate_monster to actually create a monster. (And optionally, give it a held item, special moves and so on - check out all the fun stuff in Scripts --> Data Mangling --> Active Monster Party). Also call msh_recompute_seencaught, in case the player didn't have this monster dex-ed yet.

(You can see an example of this stuff in action if you check mev_intro_starterselect_confirm.)


Now for text speed: There's two places where text speed is used, both in the message_handle script.

Line 17:

for(var c = 0; c < 2 + 2*k_a; c++){ //(main speed control - this many letters are typed per game step)

and line 23:

message_cooldown += 10; //(temporary pause on detecting the "|" character)


Depending on what needs you have, you could change either of those to put in some more speed control. I.e. instead of typing 2 + 2*k_a letters per step, you could type global.text_speed*(1 + k_a) letters, where the text speed variable defaults to 2 but there's a new "cc_textspeed" cutscene command script (see Scripts --> Cutscene System --> Cutscene Commands) which lets you change it at will. (I.e. change it to 1 to type more slowly, or change it to 99999 to reveal text instantly (but | characters can still be used to add dramatic breaks))

And of course, if you just want to add dramatic breaks or show someone enunciating a word extra clearly, there's no need for extra code - you could just sprinkle in some |s - one between each letter |l|i|k|e| |t|h|i|s, or a bunch at once when someone's...||| catching their breath.

(+1)

Ahhhh thank you! Somehow I COMPLETELY missed the AMP scripts in data mangling, so I was just going around in circles for a few hours.

Curious if there's any breeding mechanic built in, or if it would be relatively easy to add one?

There's no breeding mechanic built in. It probably wouldn't be TOO hard to add one, but still pretty involved:

  • Set up "egg groups" and assign monster species to them. Not sure what's the best way here, but since you won't check them very often you don't need to worry about performance.
  • Add a daycare (or somesuch) where you can deposit monsters. Easiest way would be to functionally add a new storage box, which can't be accessed from the shrine PCs. Every time the player takes a step, you could loop over every monster in this box and give them EXP (if you wanna copy Pokémon wholesale), but you'd also tick up some daycare counters every time you reach a step threshold (256 or something)
  • When monsters of a matching egg group are in the daycare, each Egg Tick you'd roll a random number to see if it's time to create an egg. 
  • I think the easiest way would be to have an "egg flag" in the AMP data, which is true for eggs and false for other monsters. If the egg flag is true, the monster is considered fainted (so it can't be sent out) and checking its status will give you a special screen with the hatching info. The moment you generate an egg in the daycare, you actually generate the lowest evolution of the mother (and put it in another slot in the Daycare Box - or if you want to be able to generate more than one egg at a time, you might want to have a special Egg Box instead), and then just sets its egg flag to true. (You could also manually overwrite data for things like inheriting IVs, Egg Moves and so on)
  • If the player has any eggs in the party, you'd reduce the hatch counter for every egg in the party every Egg Tick, and if an egg hits zero, abort the loop and go to a hatching sequence (which you'd handle similar to how the monster evolution works now: set the load position, change rooms, go back to the room you were in when it ends).

Is there a way to make a sign display the players name?

(1 edit)

Yeah, just include the value of global.player_name in the message.

Easiest way would probably be to make a new type of signpost (a child of the obj_signpost so it "just works" with the existing interaction code) whose interact_script is cis_npc_polyliner and then give it a new expression-typed variable "my_messages". For each sign you place you'd then give it a messages value like:

[tsprintf("This is %'s house!",global.player_name)]

(So it contains an array of strings, with only 1 value - this is different from just a regular string, since cis_npc_polyliner loops over the array of messages, so don't forget the []'s around it)

(The reason the default signpost doesn't work is that it has a string-type variable, so it'll just include the variable / tsprintf call as text instead of running the code. You could of course change it to expression-type in the base sign instead, but that breaks all existing signposts unless you manually add quotation marks around their text...)

(+1)

Your the best thank you.

i get this when i do what you sugested. 

Instance Code in Room: rm_overworld_5 at line 1 : invalid token '

Undefined variable 'This' referenced in room rm_overworld in instance inst_16EAE0C0's variable 'my_message'

Undefined variable 'is' referenced in room rm_overworld in instance inst_16EAE0C0's variable 'my_message'

Did you:

  1. turn it into an Expression variable?
  2. put quotes (") around the text?
  3. put square brackets ([ at the start, ] at the end) around the resulting string?

The error message makes it sound like it's trying to interpret plaintext (the stuff that's supposed to be in a string) as an expression so it sounds like you missed the quotes.

I copied exzactly what you had typed. Maby i missed where i need to change to an expresion var

It should look like this:

Hello! Really looking forward to purchase this; however, i would like to know the platforms that this can run on? (Just PC? Or perhaps mobile, HTML5?) Thank you!

There's no OS-specific functions used, but I haven't tried it on anything other than PC. (I only have a PC license of Game Maker)

Ok i might be dumb but i cant find the silly macro function fike :)

It's named "init_constants", should be right at the top of the Scripts folder.

(+1)

Thank you. Always hard to learn aome one else code style the first time.

Could you explain how you have the imputs set up. I would like to add wasd controlls and controller. I also noticed that when you go diagnal you move faster so im trying to fix that.

  • Keybinds are defined in Scripts-->UI-->init_input
  • Local input variables are set up in Scripts-->UI-->init_keys
  • Local input variables are updated in Scripts-->UI-->get_keys

So to change the default keys, you'd update init_input. To add alternate input like a controller, update get_keys.

E.g. instead of:

k_u = keyboard_check(global.input_key[input_U])

you might want something like:

k_u = keyboard_check(global.input_key[input_U]) || gamepad_button_check(global.active_gamepad,global.input_pad[input_U])

(and so on for all other inputs)

Player movement is handled in Objects-->obj_player-->Step event. I think it's easiest if you add 4 new cases for up+left, up+right, down+left, down+right (which moves diagonally instead of just along x or y) and then use "else if" between all cases instead of just "if" so only one case can happen at once. (If you want to add diagonal sprites this approach will help too)

(+1)

Thank you.

Hello,

I try to make the gamepad work, but i got some problems with it.
I hope you can help me out what i doing wrong.

What i did is the same like the keyboard check but then with the gamepad_button check.

like:

k_u = keyboard_check(global.input_key[input_U]) 
k_d = keyboard_check(global.input_key[input_D])

k_u gamepad_button_check(global.active_gamepad,global.input_pad[input_U])

k_d
gamepad_button_check(global.active_gamepad,global.input_pad[input_D])

ect.

Have i to change another script for make it work or doesn't work this like i did?

Thankyou.

Do you run the k_u = gamepad code after the keyboard code, always? Because then you'll overwrite the keyboard values with the gamepad values (a variable can only have one value at a time)

If you want to support using both a keyboard and a gamepad at once, try OR'ing them together:

k_u = keyboard_check(global.input_key[input_U]) || gamepad_button_check(global.active_gamepad,global.input_pad[input_U])
(1 edit)

Okay i see. If i start the debugger i see that the global.input_key got a array (9560E80), but the global.active_game,global.input_pad a unable to evaluate.

This is the error i got: 

ERROR in

action number 1

of Create Event

for object parent_menu:

trying to index a variable which is not an array

 at gml_Script_get_keys (line 17) -    k_u = keyboard_check(global.input_key[input_U]) ||gamepad_button_check(global.active_gamepad,global.input_pad[input_U])

############################################################################################

gml_Script_get_keys (line 17)

gml_Object_parent_menu_Create_0 (line 4) - get_keys()//Get once so that held keys won't instantly trigger press-but-not-held

gml_Object_obj_gguimenu_Create_0 (line 2)

gml_Object_obj_titlescreen_Create_0 (line 2)

What is the best way to make the gamepad works? Thankyou for your answer.

My guess is that global.input_pad is not initialized to a value before you try reading it - did you add it to init_input? You'll need to define a gamepad input for every action (U/D/L/R/A/B/C/ST/SL).

Hello, i purchased this recently but i can't start the project it says:

___________________________________________

############################################################################################

ERROR in

action number 1

of Create Event

for object SETUP:

Pop :: Execution Error - Variable set failed argument - read only variable?

 at gml_Script_tsprintf (line 8) -            argument[0] = string_replace(argument[0],"%",string(argument[c]));

############################################################################################

gml_Script_tsprintf (line 8)

gml_Script_init_player_data (line 32) -               global.monster_box_name[c] = tsprintf("Spirit Realm %",c+1)

gml_Object_SETUP_Create_0 (line 13) - init_player_data()


might be the new Update? well.. doesn't really matter if Version 2 or 3 i keep getting this and can't fix it myself 

pls help

It seems like "argument" is read-only now, you can fix it by updating the script like this:


(+1)

Thank you for the Update, haven't gotten the time yet to look into it before but it works now perfectly! 

(+1)

I just bought this and it is by far the best purchase I've ever made for GMS2! Thank you for all the work you've done and for giving us the ability to buy it! I've been wanting an engine like this for so long but could never find one, but now I'll finally be able to make a great game! lol Thank you!

Thanks, glad you like the engine! Looking forward to see what you'll make with it! ^__^

One of my first (failed) GM projects back in the early 2000s was making a game in this style, but it just failed miserably... it felt great to finally be good enough at coding to tackle it :P

Well you did a great job with this! honestly it's worth more than what you're selling it for lol but it is always really nice to have it be affordable! I've been working on it with any free time I get and I was wondering, where would I go to change a monsters moves? I wasn't able to find it lol

Open the script init_monsters and scroll to the right a bit, and you'll find this block of code:


Edit that :)

(Moves are pairs [LearnLevel, MoveID] and a learn level of NONE means the monster always starts with it known)

(+1)

Okay thank you so much! You've done a lot to help everyone!

Hello! I was wondering if this would also compile under the most current version of GMS2 on Mac? I'd love to purchase and look at the logic you're using for reference.

(1 edit)

I have absolutely no idea, I don't have a mac and I don't have any intention of getting one any time soon. But none of the functions I've used are Windows-specific so it probably should just automagically work thanks to the GM sandboxing? (I'm really careful with those edge cases that breaks compatibility these days)

The one thing that could be an issue is the special rendering trick used to make you sink halfway through tall grass, but you could work around that by using draw_sprite_part and only draw half the player when you're in tall grass.

(-1)


I do not understand what is the difference between IV and EV.

(1 edit)
  • IV = Individual Value, an unique potential for the monster that's generated on creation and never changes
  • EV = Experience Value, experience for that stat (which goes up over time as it's fighting)

The Demo wont work I press New Game Nothing

Did you press Enter? The game uses Z / X for the accept/cancel buttons.

Deleted 3 years ago

It Works Z I thought it was enter also I was wondering is there anyway I can email you, I was wondering if you ever planned on releasing your games on console I would honored if I can help & I have a proposal I want to discus with you, also is there any way to make the demo bigger screen wise

Hi Yal!

Two questions for you:

1. Any thoughts on how to restrict the types of stones to certain types. E.G. need fire stone to catch fire type creature?

2. How can we implement our own custom menus? From my search through the source, it looks to use some Draw GUI functions. I'm assuming I'd need to get rid of pretty much all menu options and develop my own menu from scratch with custom created images?

Thanks so much for everything. This project has really helped me develop my game over the past few months!

(1 edit)

Glad the project has been useful to somebody! ^__^

For #1, the easiest option would be to have the stone type matchup affect catch rate directly. In init_items, change the argument for all monster stones to an array with two elements: catch rate, and a new type affinity parameter. Then in itemuse_catch, change line 13 from "argument1" to "argument1[0]" (reading the catch rate from the array) and add a new parameter for the catch rate as a multiplier for the final catch rate. For instance maybe you could write a function that, given an AMP ID and a type, returns either 1.00 if the monster has that type, or 0.05 (or even zero) if it doesn't, and then have the type parameter just be the elemental type that stone works on. (Or the factor could be based on something else entirely...)

Blocking the player from using the stone entirely if the monster doesn't have the type gets a slight bit more complicated, I think the easiest incision point would be in mev_battle_item_select. After you get the list of valid targets "targets" at line 6, go through the list and remove all targets whose type the stone doesn't work on, using whatever logic you are planning: hardcoded whitelists, type checks, level checks etc. (The selected item is in "my_item" at this point so you can access its data). Keep in mind, the list is an array and not a ds_list.

For #2, the GGUI code is so deeply ingrained in the menu functionality that it's probably going to be pretty difficult to replace it entirely. What exactly are you planning to do? It's made to be as generic as possible (with elements like frames and sprites that can use any assets you want) so it should be possible to script more or less anything with it. You can also add new element types by editing ggui_draw.

Okay, actually I'm just an executive hired programmer. I was hired to work with your job. She's amazing in many places.
I was able to figure out how to do so to sort out all the monsters and much more .However, how could I do a batch-wide evolution check? I tried two ways, but it didn't work.

(1 edit)

To evolve monsters, you need to take the following steps:

1) Store the player's current position (not necessary, but if you want them to be exactly where they were when you come back after the evolution, you should do this)

with(obj_player){
        global.load_x            = x
        global.load_y            = y
        global.load_room        = room
        global.load_direction    = drawdir
}

2) Put the monster in the evolution queue:

ds_queue_enqueue(global.pending_evolutions_queue,[monamp,species]);

monamp = AMP index of monster to evolve - when you do a batch operation, you should loop over the AMP indexes you want to affect (e.g. entire player's party is from 0 to PARTYSIZE_ACTIVE; party + boxes is from 0 to PARTYSIZE_ACTIVE + PARTYSIZE_BOXED)

species = monster species to evolve into (the global array global.monster_evolution_mon has all the defined evolutions, but you can force a monster to evolve into any other species if you want)


3) Finally, go to the evolution room:

room_goto_fade_dontdestroy(rm_evolution,60);

Thanks, it works.

How can I translate the prefix "amp"?  I have a poor command of English culture, so it may not be obvious to me)

(1 edit)

AMP = Active Monster Party (aka, monsters that are currently loaded into the player party, an enemy party, or a storage box - it's different from the data about a monster species in general)

Hi Yal,

Is there a maximum size for monster battle sprites?

Thanks!

Nope, you can go as high as you want. The menus resize the sprites so they'll fit in the allotted space, but it doesn't happen in battle.

That's what I needed to know. Thank you!

Hi Yal,

I am an adult gamer who works in IT and am dabbling in game creation. I have some changes I would like made for the game I am developing using this product. For example, the ability to set when certain creatures come out based on the time of day in-game. I would detail out the mechanics of how I would want it to work. You would provide me an estimate for each change I want made, and I would pay you half up-front via PayPal and half after each change is completed.

You may incorporate these changes into the product you have here on this page if you so want or provide me a set a scripts with the changes included, knowing that this code branch will not be maintained by you.

Please let me know if you are interested or not.

I'm not really interested. My day job keeps me in need of time more than money, and I'm already fully busy with my next new and exciting project. But if you have any questions about how to implement a new mechanic, feel free to ask it right here - I check my itchio notifications daily and try to answer every question!

Hi Yal,

Thank you for your reply! I'll let you know if I need help with certain mechanics.

Hope you have a good one!

Hi Yal, this looks amazing! It's exactly what I was looking for! My only question (for now) is can I have different sprites for different genders? Or will I have to create separate monsters to do that?

It should be relatively easy to add in... there's a question from a few weeks ago about having separate sprites for the front and back that goes more in-depth, but here's the cliff notes version:

  • monster_get_battlesprite is used to get the monster sprites, this uses the AMP ID of the monster to read sprites from so you could read its gender and then return different results if the species has separate male and female sprites.
  • These sprites would need to be added in init_monster (instead of just a map and battle sprite, you could have map + battle male + battle female, or even separate male and female map sprites), and of course this also means you need to modify init_monsters so that it gives the correct number of sprite arguments in each init_monster call.

To avoid having separate handling for monsters with and without gender differences (which makes things complicated...), I'd just have them always have separate male and female sprites in the code, but add the same sprite twice if there's no gender differences.

Deleted 3 years ago

Hi Yal,

I'm having some trouble with this. It's probably my newb-ness. I'm trying to follow the example code that you gave in the previous comment, but I'm stuck. I think my problem is that I don't know where to put amp_GENDER to call it in monster_get_battlesprite. I'm declaring amp_GENDER in the init_constants. I want it to be 0=male and 1=female.


Could you help me with this? I apologize if I'm being dense.

(1 edit)

So first of all, amp_GENDER would be an array index so it's only going to have a single value by itself... you should put it at this spot in init_constants:

Set it to the value of AMP_MAX (which is the first unused value for the AMP array index), then increase AMP_MAX by 1. While you're editing the init_constants script, also add in two new gender macros gender_MALE and gender_FEMALE (set to 0 and 1 as you wanted)

Next, go to amp_generate_monster (which sets up a newly spawned monster's AMP data) and add a new line like this:

global.active_monster_party[argument0,amp_GENDER] = choose(gender_MALE,gender_FEMALE)

This should make a newly spawned monster have a 50% chance to be male and a 50% chance to be female.

Finally, in monster_get_battlesprite, you'd get the gender via amp_read_var(argument0,amp_GENDER) and then have an if statement: if gender is equal to gender_MALE, return global.monster_data[amp_read_var(argument0,amp_MONID),mond_SPRITE_BATTLE_MALE], otherwise return global.monster_data[amp_read_var(argument0,amp_MONID),mond_SPRITE_BATTLE_FEMALE].

(Changing the battle sprite index in the monster data array so there's more than one was the stuff I told you about last time, and with this change we use both those new sprites)

(1 edit)

Awesome, I got it working! I noticed, though, that it doesn't show the gender sprite when I look at my monster in the menu. Is there something I can change, for example in msh_spawn_monster_list, that will fix this?

Oh yeah, nice catch! Line 23 reads the sprite directly:

var spr = global.monster_data[global.active_monster_party[mon,amp_MONID],mond_SPRITE_BATTLE];

Changing this to

var spr = monster_get_battlesprite(mon);

should do the trick.


I did a quick search to see if there's any more direct reads that needs to be updated, there's a handful of other places where the sprite is read directly instead of using the monster_get_battlesprite script... searching for the string ",mond_SPRITE_BATTLE" (with the comma, but without quotes) should give you all the results so you can just click on them to instantly jump to the line that needs to be updated. You can ignore the starter select / nickname scripts and the moncyclopedia, but you probably want the shrine / terminal scripts, the evolution control, and normal nicknaming updated to use monster_get_battlesprite.

Viewing most recent comments 21 to 60 of 80 · Next page · Previous page · First page · Last page