Windows Trying to make an Undertale fangame...



so, does anyone have any tips on how to make an Undertale fangame in GameMaker 1.4?
Here's what I want to learn how to program:
  • An intro story similar to Undertale's
  • Making the transitions from room to room smooth
  • Making something similar to your first encounter with flowey
  • Creating a save file system
  • Programming a battle interface with different monsters, bullets, bosses, etc
  • Making an in-game menu (the one that appears when you press C or Ctrl)
  • Making interactable objects, complete with text boxes
  • Puzzles
I am using GameMaker: Studio 1.4.1567
Any help would be greatly appreciated! :)
Damn, is that all? Let me just write you a few hundred pages to answer your questions. :p

Start by making Pong. Then maybe a simple platformer. Then random other stuff for five years. And then you'll be good enough to start thinking about making an Undertale clone, haha. You need to start much smaller. What have you made so far?

Also, this is in the wrong forum...

Guest User

[1] the intro can just be a single sprite with each frame being a subimage of that sprite. in the object, you can set an alarm to increase the subimage by one until depleted.

you can then add all sorts of fancy stuff like fading the image, and so on, etc. at your own discretion.

Image Index

[2] idk im not good at quests and cutscenes all i can think of is object that controls the behavior and timing of everything. e.g. when the player enters the room 'phase = 0;', when the player reaches a certain part of the room 'phase = 1;' in which it spawns Flowey and the textbox.
/// Alarm[0]
quest_phase += 1;

switch(quest_phase) {
    case 1:
        /* spawn Flowey */
        /* create textbox */
    case 2:
        /* create battle */
default: break; }
you can take a look at different setups for quest progression to get an idea, like here. just google

[3] Doors & Room Transitions

[4] Saving & Loading

[5] nothing here because someone answered this and im lazy.

[6] you just spawn your menu when the correct key is pushed.
/* Example Code from Player Step Event to spawn Inventory */
/* KEY PRESS: Pipboy */
    else if(input_pressed(global.INPUT_PIPBOY)) {
        state = statePlayer.interface;
        instance_create_layer(0, 0, SystemController.LayerInterface, InterfaceInventory); }
Menu System & Inventory combining the concepts of these videos, Undertale's inventory can be re-created using an Array or List storing numbers corresponding to the type of item, similar to in this video. however, instead of drawing sprites like in the video, you would simply draw the names as text.
/* Example Draw code from my inventory, which is very similar to Undertales */
/* where "GridDefinition" is a DS_Grid containing the name of the item info. each row */
/* is a separate item. thus, if ListInventory[| i] = 1, GridDefinition[| 1, 2] would retrieve the */
/* name of the item. */
for(var i = 0; i < 25; i++) {
    if(!is_undefined(SystemController.ListInventory[| i])) { draw_text_grid(3, 2 + i, GridDefinition[SystemController.ListInventory[| i], 2]); }
    else { draw_text_grid(3, 2 + i, "................", GREY); } }
    draw_sprite_color(SpritemapInterface, 0, 1, (2 + menu_cursor));
iirc Undertale also uses key commands and stuff to equip/unequip items and you don't use the mouse for anything like in the video. but the idea is the same:
/* example of equipping items for this type of inventory */
var _item = SystemController.ListInventory[| menu_cursor];
   if(!is_undefined(_item) && _item != -1) {
      var _slot = GridDefinition[_item, 0];
      /* PART: Remove > Inventory */
      ds_list_delete(SystemController.ListInventory, menu_cursor);

      /* PART: Remove > Equipment */
      if(SystemController.ArrayEquipment[_slot, 0] != -1) { ds_list_add(SystemController.ListInventory, SystemController.ArrayEquipment[_slot, 0]); }

      /* PART: Add > Equipment */
      SystemController.ArrayEquipment[_slot, 0] = _item; }
[7] Interactable Objects the easiest way you'd do this to emulate Undertale is have a DIRECTION variable that stores which way the player is facing. then, when 'E' (or whatever) is pressed the game takes that into account when checking the (x, y) coordinates for an object to interact with. for example, if the player is facing LEFT that would correspond to (x + 1, y), and DOWN would correspond to (x, y + 1).
/* Example Code of my Player's interact with NPCs to spawn textbox */
else if(place_meeting(_x, _y, SuperNpc)) {
      var _inst = instance_place(_x, _y, SuperNpc);
      if(_inst != noone && _inst.flag_speaker) {
            var _box = instance_create_layer(0, 0, SystemController.LayerInterface, InterfaceTextbox);
            _box.speaker_name = _inst.entity_name;
            _box.speaker_color = _inst.entity_color;
            _box.speaker_portrait = _inst.entity_portrait;
            for(var i = 0; i < array_length_1d(dialogue); i++) { _box.dialogue[i] = _inst.dialogue[i]; } } }
Advanced Dialogue Engine pt.1
Advanced Dialogue Engine pt.2

[8] nothing here because i hate puzzles and i'm lazy.

have fun.
Last edited by a moderator: