[4.5.9] Tutorial Guide and Notes

CluckFox

Active member
I've been re-watching the main tutorials to refresh my memory on all of the core concepts they cover. I took notes so I could quickly revisit any particular concept I might need. Hopefully others will find this information helpful too.

Common Conceptsnesmaker_notes_decoration.jpg

All Beginner and Intermediate tutorials cover the essential functions of NESMaker - creating and opening projects, editing pixels, assembling sprite animations, and designing levels.

The Beginner modules follow the same sequence:

  1. Load tutorial tilesets
  2. Load tutorial palettes
  3. Load tutorial game objects
  4. Load tutorial monsters
  5. Load tutorial monster palettes
  6. Load community sound file
  7. Import input links
After these steps are module-specific demonstrations about how to make a proper game - with win and loss conditions - using the provided assets and no code.

The Intermediate modules similarly cover sprite construction, pixel editing, and AI steps; followed by module-specific enhancements of the Basic module by writing code.

Maze Game - Beginner​

  • Watch this first to learn NESMaker GUI concepts
  • Q W E R keys change subpalette of a background tile in level editor
  • hold 1 2 3 4 keys to draw a path
  • Set path group to use in Screen Info dialog

Maze Game - Intermediate​

  • Change the labels in Project Settings to suit your needs. Labels do not affect engine or game behavior at all
  • Script Settings - Subroutines is a good starting point for places to insert custom code
  • imported graphics usually need to be recolored
  • check in TutorialAssets folder for additional graphics and sound ideas
  • Deep dive into constructing Animations
  • Paths are disabled in scrolling games and take up a lot of ROM
  • First taste of code - Tiles
  • Use Special Screens for directly placing 8x8 tiles

Maze Game - Advanced​

  • Create a 1UP game object
  • Monster Flags determine what part of collision code will run when player hits object
  • JMP RESET is a good first-line debugging tool
  • Create a "power pellet" game object that makes monsters vulnerable
  • Use a loop to find all active monsters and change their action step
  • modify player/monster collision code to change collision behavior while in "vulnerable" action step

Top Down Adventure - Beginner​

  • Monster groups with NPCs
  • NPC text and text groups
  • Text and HUD Boxes
  • HUD Elements
  • Monster groups with Monsters
  • Brief look at enemy AI to "chase" player with 8-direction movement
  • Monster Blocks
  • Screen Types

Top Down Adventure - Intermediate​

  • Pixel Editor
  • Community HUD assets
  • Inputs for Actions vs. Inputs for Motion
  • Weapon construction, animation, AI
  • Background HUD construction
  • Unlockable spells and weapons
  • Spawning weapons based on facing direction
  • Multiple weapon selection
  • Initialization code to enable GUI features
  • Pseudo-hit-box for talking NPCs
  • Monsters dropping random powerups
  • Single pickup script handling multiple types of items
  • monster blocks changed in doHandleHurtMonster script
  • Relationship of NPC Monster Group and Text Group positions
  • Sprite pre-draw script for custom tiles on Background HUD
  • Input script for weapon cycling
  • Suggestion for secondary weapon behavior

Top Down Adventure - Advanced​

  • Zoom level editor out to see adjacent screens
  • Create new type of tile
  • Examining sprite pre-draw
  • Inputs to change to an "attack" action step
  • Copy and paste entire frames of sprite animation
  • Flipping tiles in sprites
  • Making "player weapon" hurt monsters
  • Custom Script definition
  • Customizing Bank18.asm
  • How to backup X and Y registers
  • Defining custom tile behavior
  • Tiles with multiple states of behavior
  • Examining Lock Block behavior
  • Examining code that rewrites background tiles
  • How to correct "Branch out of range" compiler errors
  • Triggering the screen type
  • Customizing Extra Screen Load script to replace tiles and collisions

Simple Shmup (Shooter) - Beginner​

  • Full-screen playable area with Sprite HUD
  • Only Screen Info for first screen of a scrolling "hallway" is loaded
  • Screen Flags are still loaded on each screen
  • Scroll Edge and Boss screen flags to conditionally stop scrolling
  • Examining Boss Blocks
  • Storing boss health in User Variable
  • Warp Tiles

Simple Shmup (Shooter) - Intermediate​

  • Code to update tiles by writing to memory registers
  • Adjusting enemy shooting patterns with Action Steps
  • Static Objects
  • Cooldown timer for player shooting
  • Rationale for boss-tile behavior
  • Change monsters by warping
  • Examining motion speed & direction vs. scroll speed
  • Foreshadowing slowdown

Simple Shmup (Shooter) - Advanced​

  • Slowing down because of many sprites on screen at once
  • Controlling max sprites with the Object Variables tab in Project Settings
  • Plan level design to avoid hitting max object count
  • GUI integration comes at expense of computing cycles
  • Examining DrawSprites subroutine
  • Examining DrawSprite macro
  • Using X register for object lookups
  • Using PPU Viewer for finding tile coordinates for sprite-drawing
  • Search your soul
  • using vBlankTimer variable as a lightweight animation timer

Basic Brawler - Beginner​

  • Assets - collections of preset background+collision data+subpalette selection
  • Only warp-in screen of a scrolling hallway loads warp-out coordinates
  • sprite dead zone half screen to the right of warp-in screen
  • Change Hurt action from Null to StopMoving to mitigate recoil

Basic Brawler - Intermediate​

  • borrow skills learned from previous module tutorials
  • Low bounding boxes create illusion of depth
  • Level editor treats all black as transparent, even black assigned to palette positions 1-3
  • Create illusion of depth with Up/Down movement but retaining Left/Right facing
  • inputs - stop motion, punch, resume motion while d-pad still held down
  • inputs - changes to movement imputs may have side-effects with scrolling
  • scrolling - camera position very slightly lags player position at edge of scroll boundary
  • Monster AI in Brawler Module makes it a Brawler Game
  • AI - trigger action steps based on player position on screen
  • AI - action step flags change whether or not to "chase" player while moving
  • AI - trigger action steps based on player proximity to monster hitbox
  • AI - achieve complex behaviors by chaining action steps into a "sentence"
  • Code can spawn sprites based on monster tileset of active monster group
  • Object type numbers correspond to their position in the Project Hierarchy

Basic Brawler - Advanced​

  • Create illusion of depth with sprite ordering. PPU draws sprites over each other based on sprite ordering.
  • Default sprite order is X-register order, player is at 0, subsequent sprites get incrementing ID
  • Zero Page tab of Project Settings shows how much user variable space is used up
  • Handle Objects script is run once per frame to perform computations & actions based on Object_ X-indexed variables
  • How to construct a loop in assembly
  • Handle Objects is a candidate for optimization once you reach that point in the game's lifecycle
  • INXS. How to reorder the apparent order of a loop by replacing X temporarily in loop body
  • Create a new subroutine after the last RTS of the script file
  • A sorting algorithm
  • Edit Initialization script to set up initial values of new Zero Page variables

Mega-Metro-Vania - Intermediate​

  • Using multiple sub-palettes in a sprite
  • Flipping entire animations
  • Controlling animations conditionally
  • Scrolling is agony
  • Watch scrolling in action using PPU Viewer
  • Modify Sprite HUD
  • Sprite HUD rationale (vs. older Sprite Zero Hit method)
  • Spawning projectiles conditionally
  • Only warp-in screen data is loaded, only Flags are loaded on screens you scroll onto
  • User Variables for health and and ammo
  • Examine double-spawn quirk of scrolling back-and-forth quickly
  • Size of the Playable Area box affects player's initial Y position when "falling" into another screen

Mega-Metro-Vania - Advanced​

  • Create new tile types
  • Borrow post-screen-load routine from Adventure module to rewrite tiles
  • Using memory registers to push index of tile to draw to PPU
  • Manual screen triggering with GUI and the Initialization code to enable to use it
  • Placing screen trigger code in tile behavior
I will update this post as I rewatch the rest of the modules.

Edits​

19 March 2021 - added Brawler and Maze notes
 
Last edited:

Jonny

Well-known member
Very very useful thank you for putting your time into this. I'm often trying to remember when something specific is covered.
 

CluckFox

Active member
The OP is too big, so the rest of my notes will go here. Still have Arcade Platformer (all) and Mega-Metro-Vania (Beginner) to go:

Scrolling Platformer - Beginner​

  • Checkpoints for the afterlife
  • Only Screen Info from the warp-in screen of a scrolling hallway is loaded. Subsequent screens only load Screen Flags
  • Boss battle using screen flags

Scrolling Platforer - Intermediate​

  • Remember to ignore gravity on ladders
  • Player hitbox should leave 1px on the ground to help make ladders work, and for illusion of depth
  • Powerup objects should ignore gravity
  • Scrolling is actuated by controller input. Only simpleScroll_right.asm is necessary for one-way scrollers
  • Remember to set animation speeds in action steps
  • How to place numbers on the Sprite HUD
  • In Mesen - CTRL-P shows PPU viewer for seeing all the tiles the PPU can currently "see". Use it to find coordinates of tiles to draw on HUD
  • Sprite Zero hit can still be enabled in NMI script -- don't use it though.
  • This module's HUD script has special logic for a rolling counter that adds a 1UP when it rolls over
  • Give prize tiles at least one blank tile padding - same for any background tile that gets changed by code

Scrolling Platformer - Advanced​

  • Modify Handle Physics script in Script Settings to alter physics
  • Variable gamepad already available throughout all scripts to see what buttons are currently pressed
  • The ASL assembly operation multiplies a number by 2
  • Player can outrun the scroll seam, causing graphical glitches, if player speed is too high
  • motion speed and animation speed are controlled independtly by different code
  • Jump speed can be overridden in an input script as opposed to Handle Physics script
  • High byte of speed increased by 1 for every 16 on the speed sliders
 

Kanbei85

Member
I've been re-watching the main tutorials to refresh my memory on all of the core concepts they cover. I took notes so I could quickly revisit any particular concept I might need. Hopefully others will find this information helpful too.

Common ConceptsView attachment 4683

All Beginner and Intermediate tutorials cover the essential functions of NESMaker - creating and opening projects, editing pixels, assembling sprite animations, and designing levels.

The Beginner modules follow the same sequence:

  1. Load tutorial tilesets
  2. Load tutorial palettes
  3. Load tutorial game objects
  4. Load tutorial monsters
  5. Load tutorial monster palettes
  6. Load community sound file
  7. Import input links
After these steps are module-specific demonstrations about how to make a proper game - with win and loss conditions - using the provided assets and no code.

The Intermediate modules similarly cover sprite construction, pixel editing, and AI steps; followed by module-specific enhancements of the Basic module by writing code.

Maze Game - Beginner​

  • Watch this first to learn NESMaker GUI concepts
  • Q W E R keys change subpalette of a background tile in level editor
  • hold 1 2 3 4 keys to draw a path
  • Set path group to use in Screen Info dialog

Maze Game - Intermediate​

  • Change the labels in Project Settings to suit your needs. Labels do not affect engine or game behavior at all
  • Script Settings - Subroutines is a good starting point for places to insert custom code
  • imported graphics usually need to be recolored
  • check in TutorialAssets folder for additional graphics and sound ideas
  • Deep dive into constructing Animations
  • Paths are disabled in scrolling games and take up a lot of ROM
  • First taste of code - Tiles
  • Use Special Screens for directly placing 8x8 tiles

Maze Game - Advanced​

  • Create a 1UP game object
  • Monster Flags determine what part of collision code will run when player hits object
  • JMP RESET is a good first-line debugging tool
  • Create a "power pellet" game object that makes monsters vulnerable
  • Use a loop to find all active monsters and change their action step
  • modify player/monster collision code to change collision behavior while in "vulnerable" action step

Top Down Adventure - Beginner​

  • Monster groups with NPCs
  • NPC text and text groups
  • Text and HUD Boxes
  • HUD Elements
  • Monster groups with Monsters
  • Brief look at enemy AI to "chase" player with 8-direction movement
  • Monster Blocks
  • Screen Types

Top Down Adventure - Intermediate​

  • Pixel Editor
  • Community HUD assets
  • Inputs for Actions vs. Inputs for Motion
  • Weapon construction, animation, AI
  • Background HUD construction
  • Unlockable spells and weapons
  • Spawning weapons based on facing direction
  • Multiple weapon selection
  • Initialization code to enable GUI features
  • Pseudo-hit-box for talking NPCs
  • Monsters dropping random powerups
  • Single pickup script handling multiple types of items
  • monster blocks changed in doHandleHurtMonster script
  • Relationship of NPC Monster Group and Text Group positions
  • Sprite pre-draw script for custom tiles on Background HUD
  • Input script for weapon cycling
  • Suggestion for secondary weapon behavior

Top Down Adventure - Advanced​

  • Zoom level editor out to see adjacent screens
  • Create new type of tile
  • Examining sprite pre-draw
  • Inputs to change to an "attack" action step
  • Copy and paste entire frames of sprite animation
  • Flipping tiles in sprites
  • Making "player weapon" hurt monsters
  • Custom Script definition
  • Customizing Bank18.asm
  • How to backup X and Y registers
  • Defining custom tile behavior
  • Tiles with multiple states of behavior
  • Examining Lock Block behavior
  • Examining code that rewrites background tiles
  • How to correct "Branch out of range" compiler errors
  • Triggering the screen type
  • Customizing Extra Screen Load script to replace tiles and collisions

Simple Shmup (Shooter) - Beginner​

  • Full-screen playable area with Sprite HUD
  • Only Screen Info for first screen of a scrolling "hallway" is loaded
  • Screen Flags are still loaded on each screen
  • Scroll Edge and Boss screen flags to conditionally stop scrolling
  • Examining Boss Blocks
  • Storing boss health in User Variable
  • Warp Tiles

Simple Shmup (Shooter) - Intermediate​

  • Code to update tiles by writing to memory registers
  • Adjusting enemy shooting patterns with Action Steps
  • Static Objects
  • Cooldown timer for player shooting
  • Rationale for boss-tile behavior
  • Change monsters by warping
  • Examining motion speed & direction vs. scroll speed
  • Foreshadowing slowdown

Simple Shmup (Shooter) - Advanced​

  • Slowing down because of many sprites on screen at once
  • Controlling max sprites with the Object Variables tab in Project Settings
  • Plan level design to avoid hitting max object count
  • GUI integration comes at expense of computing cycles
  • Examining DrawSprites subroutine
  • Examining DrawSprite macro
  • Using X register for object lookups
  • Using PPU Viewer for finding tile coordinates for sprite-drawing
  • Search your soul
  • using vBlankTimer variable as a lightweight animation timer

Basic Brawler - Beginner​

  • Assets - collections of preset background+collision data+subpalette selection
  • Only warp-in screen of a scrolling hallway loads warp-out coordinates
  • sprite dead zone half screen to the right of warp-in screen
  • Change Hurt action from Null to StopMoving to mitigate recoil

Basic Brawler - Intermediate​

  • borrow skills learned from previous module tutorials
  • Low bounding boxes create illusion of depth
  • Level editor treats all black as transparent, even black assigned to palette positions 1-3
  • Create illusion of depth with Up/Down movement but retaining Left/Right facing
  • inputs - stop motion, punch, resume motion while d-pad still held down
  • inputs - changes to movement imputs may have side-effects with scrolling
  • scrolling - camera position very slightly lags player position at edge of scroll boundary
  • Monster AI in Brawler Module makes it a Brawler Game
  • AI - trigger action steps based on player position on screen
  • AI - action step flags change whether or not to "chase" player while moving
  • AI - trigger action steps based on player proximity to monster hitbox
  • AI - achieve complex behaviors by chaining action steps into a "sentence"
  • Code can spawn sprites based on monster tileset of active monster group
  • Object type numbers correspond to their position in the Project Hierarchy

Basic Brawler - Advanced​

  • Create illusion of depth with sprite ordering. PPU draws sprites over each other based on sprite ordering.
  • Default sprite order is X-register order, player is at 0, subsequent sprites get incrementing ID
  • Zero Page tab of Project Settings shows how much user variable space is used up
  • Handle Objects script is run once per frame to perform computations & actions based on Object_ X-indexed variables
  • How to construct a loop in assembly
  • Handle Objects is a candidate for optimization once you reach that point in the game's lifecycle
  • INXS. How to reorder the apparent order of a loop by replacing X temporarily in loop body
  • Create a new subroutine after the last RTS of the script file
  • A sorting algorithm
  • Edit Initialization script to set up initial values of new Zero Page variables

Mega-Metro-Vania - Intermediate​

  • Using multiple sub-palettes in a sprite
  • Flipping entire animations
  • Controlling animations conditionally
  • Scrolling is agony
  • Watch scrolling in action using PPU Viewer
  • Modify Sprite HUD
  • Sprite HUD rationale (vs. older Sprite Zero Hit method)
  • Spawning projectiles conditionally
  • Only warp-in screen data is loaded, only Flags are loaded on screens you scroll onto
  • User Variables for health and and ammo
  • Examine double-spawn quirk of scrolling back-and-forth quickly
  • Size of the Playable Area box affects player's initial Y position when "falling" into another screen

Mega-Metro-Vania - Advanced​

  • Create new tile types
  • Borrow post-screen-load routine from Adventure module to rewrite tiles
  • Using memory registers to push index of tile to draw to PPU
  • Manual screen triggering with GUI and the Initialization code to enable to use it
  • Placing screen trigger code in tile behavior
I will update this post as I rewatch the rest of the modules.

Edits​

19 March 2021 - added Brawler and Maze notes

This is a bit less useful than it could be, since timestamps are not included.
 

Mulligan

Member
Maze Game - Advanced

  • 1:05 Create a 1UP game object
  • 19:00 Monster Flags determine what part of collision code will run when player hits object
  • 7:15 JMP RESET is a good first-line debugging tool
  • 10:30 Create a "power pellet" game object that makes monsters vulnerable
  • 18:50 Use a loop to find all active monsters and change their action step
  • 23:00modify player/monster collision code to change collision behavior while in "vulnerable" action step




Adventure basic.
11:40 NPC gives weapon
 

Mulligan

Member
Top Down Adventure - Beginner

  • 12:00 Monster groups with NPCs
  • 14:00 NPC text and text groups
  • 16:45 Text and HUD Boxes
  • 18:00 HUD Elements
  • 19:00 Monster groups with Monsters
  • 21:12 Brief look at enemy AI to "chase" player with 8-direction movement
  • 21:00 Monster Blocks
  • 23:00 Screen Types
 
Top Bottom