[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
Alarms
Opacity
[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.
Code:
/// 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.
Code:
/* 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.
Code:
/* 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++) {
draw_set_color(global.GUI_color);
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:
Code:
/* 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).
Code:
/* 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.