Indie game storeFree gamesFun gamesHorror games
Game developmentAssetsComics


A member registered Aug 12, 2015 · View creator page →

Creator of

Recent community posts

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.

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)

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


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.

Wow, you just blazed through the entire thing in one sitting! The amount of struggle you had with Game Over and The Big Picture is what I expect a blind player to go through with EVERY stage, but you first-tried more than half the game! (This is the reason the score screen can't be skipped the first time you beat a stage, I figured players would appreciate a break - I guess I should change that to make them skippable from the get-go...)

GG at skipping the entire last phase of the final boss too, you had so much DPS the attack pattern didn't even have time to spawn in properly!

(Having to read mail to unlock stages is a similar intentional choice - it's used to drop the plot on you, gives hints about what's ahead so you can make a more informed equipment choice, and it's supposed to give you a break in the action... I guess I should add in an option for that too...)

And sorry for making an even more incomprehensible plot this time, a lot of stuff are references that makes no sense without knowing Touhou lore (when moving from the japanese-only PC-98 to Windows the entire universe was reset, this was later in turn made canon, and this is what the ending revolves around)

I also never realized how busted melee damage is, enemies can hear you do finishers but I guess I forgot to make them hear you oneshotting their friends right next to them... (I tested every stage with the default equipment to make sure they're beatable without upgrades, which also means I barely tested how upgrades affect the balancing)

And yes, it's the "The Shining" carpet. I stole the idea from Anger Foot.

Meleeing through walls wasn't intentional, I guess I just kinda assumed all walls were too thick for your attacks to reach through but never actually checked? (I did fix a bug where longer guns could shoot through walls since the bullets are created at the end of the barrel and that would poke through the walls if you were right next to them, that one was way too powerful; but since you wanna go fast for the bigger combos and slowly picking off enemies is... slow, I never found the melee wallhacks to be that gamebreaking)

Oh wow, I expected people to use this engine for simple Doom clones and you went ahead and made a fantasy immersive sim?? Nice job!

No problem at all!

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.

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

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

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)

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.

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

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)

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.

One of the good things with code is that once you've made it, you can reuse it everywhere! I'd definitely be down with making this CRT filter my "style" (I mean, I've already used it in like 5 games at this point...), it goes a long way for making retro pixelart with big chunks of the same color more visually interesting.

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)

CONTROL object's Step Event:

In the regular Game Maker tileset editor:

There are some macros in init_constants regarding tiles. Update TILES_PER_ROW, TILES_WALKABLE_COLUMNS and TILES_SOLID_COLUMNS to match the tileset and everything should work.

Keep in mind, changing the width of a tileset will change tile IDs in Game Maker (since it's linear) so any rooms using that tileset will be corrupted. After you use a tileset once, you should only change the height if possible.

Glad you liked it! ^__^ It was fantastic seeing your reaction to the shotgun and then gradually improving every level until you ended on an S-rank! You're also the first person I've seen figuring out the vents exist without tips, so good job!

(The reason you never had anything new to equip is because you never visited the shops in the headquarters, maybe I should add some more signposting those exist so it's harder to miss...)

(1 edit)

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.

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

Yeah I kinda ran out of time to make both levels and cutscenes because I spent too much time on gameplay and effects... totally worth it though... UwU

Yeah I kinda ran out of time to make both levels and cutscenes because I spent too much time on gameplay and effects... I really like the idea to date shopkeepers for better deals though, definitely gonna keep that in mind!

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.

Released version 2. Just a small update that adds three new chord progressions, one of which just displays the different chords in the scale in order (useful if you wanna figure out which notes are OK to use in argipeggios/melody segments)

Glad you like it! I'm aiming for 16 stages (12 "real" stages and 4 boss battles), hopefully there's enough ways to keep the core gameplay fresh even when stretched out that far... (there's more equipment in the game than is accessible in the demo, and in the final version I'll throw in a bunch more Touhou references as well, since there not being enough of those was a common complaint)... I finished stage 7 yesterday but there's plenty of side content and polish to do so I'm still far from the actual 50% progress mark... you'll have to stay tuned a bit longer, I'm afraid ^^'

The story is a bit of a last-second addition but I'll try to tackle some interesting themes now when I have time to flesh it out! Capitalism and violence are more relevant than ever right now, sadly...

Thanks! Glad you could get into the right murderous mindset ^__^

You can turn off the screen curvature in the options ("Old TV Effect"), it starts at 40% but you can turn it down to 0% for a regular screen (or 100% if you want to play with a fully spherical screen for some reason)

Here I was worried I'm making the game too hard, and you go and do a challenge run immediately... xP

(There's melee weapons that do actual damage instead of just stunning enemies, so it should be possible to melee-only everything since the swimmers go all the way to the edge before they turn around... one of the streams I caugh, the player managed to crash the game by doing an execution on one of the swimmers (I'd forgotten to give them a corpse sprite) so it might even be possible to kill them this way if you just time everything perfectly so you don't knock them back into the pool and out of your range... just not in this version of the game due to the crash....)

Robotic killer dolls is an awesome idea, very small enemies in large groups (like the baby skeletons outside Nito's arena in Dark Souls 1) is one of the creepiest things I know and making them make ambient robotic sounds you can hear through the 3D audio (so you can hear them slowly approach) would help really ramp up their perceived threat level...

The TV effect defaults to 40%, you can lower it / turn it off in the options (or turn it up to 100% if you want the screen to be a perfect circle)

Epilepsy warning is a good idea, I'll replace the demo warning with that in the full release!

I'm glad you like it!

  • I'd love to use more canonical touhou enemies in my fangames, but there's not actually a lot to work with (there's like fairies, moon rabbits (which are basically fairies with bunny ears), evil yin-yang orbs, PC-98 ghosts and fuzzballs, and a bunch of geometric shapes and particle effects that don't have a lot of personality - that's it). I currently only use fairies though so there's room to add more... (onis are from japanese folklore so that counts, right?)
    • (Also at least 4 more Touhou characters are in the story draft, just not introduced properly yet - Patchouli, Kokoro, Tsukasa and Eiki)
  • IMO using an actual canonical character as an assassination target would be going too far so those'll all be OCs.
  • There's at least one more direct touhou reference implant in the game already (just impossible to get legitimately right now since it unlocks for purchase after a stage that's not in the game yet), I'll try to work in some more notable ones. I'm a bit limited by effects having to be passive at the moment but there's probably some way around that. (Maybe some stuff like Sakuya's timestop being a novelty grenade, Reisen's trumpet gun etc instead of limiting to just implants could help?)
  • Yeah, I noticed stealth is way too easy at the moment (stage 2 has basically every stationary enemy facing away from the doorways which excurberates this problem), more advanced enemies have a greater vision distance/angle but I probably should make executions, vent-breaking etc make audible sound... (also maybe enemies that turn around in random directions erratically so they will spot you if you stick around)
  • Effects being so turned up it makes the game basically unplayable is mostly there to really make the first impression as impactful as possible, I can see them being grating... for the first few days of prototyping I was actually going for Cruelty Squad's "intentionally make the game as hard to enjoy as possible" vibe and tried to turn everything up to eleven, but it eventually rendered the game completely unplayable so I had to scale them back to a slightly more reasonable level. But yeah, the options are there for a reason (I got a lot of premature complaints about the old-TV effect in particular... all these people liking straight lines, smh...)

Cool! Seeing someone play the game blind is always awesome for UX / tutorial testing~

I might go commercial with this when the full game is complete, so I'd rather not. Though maybe an asset pack with the old TV effect could be something for the future...

Oh wow, I've never gotten sub-20 and I made the game...! (And I made the other two levels yesterday so I've spent like 20 days playtesting Rise And Shrine exclusively...)

I'll try to finish the game up soon, it was meant as a quick side distraction from my real project and then I ended up overscoping things way too much as usual.

Hopefully having this demo out means people find all the massive problems I overlooked so I can iron out the worst flaws before the full release...

Excuse me, Hotline Miami and Cruelty Squad but Touhou :P

Glad you like it, though! ^_^

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)

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

Did you have "allow the player to resize the window" turned off, perhaps? (It wins out over all other window options)