News: 11 March 2016 - Forum Rules
Current Moderators - DarkSol, KingMike, MathOnNapkins, Azkadellia, Danke

Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Messages - Fox Cunning

Pages: 1 2 3 [4]
Newcomer's Board / Re: entire rom palette tinted green
« on: January 08, 2020, 08:58:19 am »
I'm not totally sure I'm doing this right:
I have a breakpoint set to $2001, and I'm running about in the game watching the A value shown under Seek To and all that stuff.
Whenever it breaks I'm looking at the line the breakpoint has selected
(such as 0F:F973:8D 07 20  STA PPU_DATA = #$00)
and watching to see if the #$00 matches up with the A value.
So far the #$00 has only ever been #$00 and #$0A. The A value hasn't matched up with it except for on the title screen where A is also 00, which is identical to my backup ROM. This is after wandering around in the game for a while doing this.
FCEUX is not main main emu/debugger, but I'm fairly sure what you are seeing is the value of the register at the moment execution was stopped.
In this case, you can completely ignore that value and check the code before that instruction, e.g.:

Code: [Select]
  LDA $04 = #$0A
  STA PPU_DATA = #$00


  LDA #$0A
  STA PPU_DATA = #$00

In both these examples #$0A is being written, not #$00, and it should be the value in the Accumulator if execution stops at the "STA".
But you can ignore any value read from PPU_Data unless you are specifically reading PPU_Data (in that case, only ignore the first read).

Anyway, I believe you should be looking at writes to $2001 (PPU_MASK), not $2007 (PPU_DATA). Double-check your breakpoints.

Personal Projects / Re: Ultima: Exodus (NES)
« on: January 05, 2020, 03:59:15 am »
Those changes to the battle AI sound like they will make a big difference!
Hopefully so! Especially in ship battles, where enemies now won't get stuck on a plank if the closest character is on the other one.
It could still be made smarter, but I think now there's a good compromise between speed, code size and efficiency.

Another update:
I've put in the code to allow a slightly different palette for each map.
Some maps use lava pits, so they need some kind of red and thus can't be changed too much, but here's a few experiments:

Also each NPC now can use two different palettes to allow some slight variations, as seen in the screenshots above.

Some other routines have also been completely re-written, to this effect:
  • Characters in "good" state will regenerate 1 HP every 5 steps outside of towns (instead of the original 1 HP per 10 steps).
  • Barbarians regenerate health a bit more quickly: 1 HP every 4 steps.
  • Magic users regenerate 1 MP every 2 steps (instead of 1).
  • Druids regenerate MP at double rate (like in the original Ultima 3).
  • Food is consumed at the rate of 1 unit every 20 steps (instead of 10).
  • Diseased characters will consume food at double rate (1 every 10 steps).
  • When out of food, a character loses 1 HP per step (instead of 5 HP every 4 steps).
The rest is unchanged: poisoned characters still lose 1 HP per step, and diseased characters lose 1 HP every 2 steps.

Personal Projects / Re: Ultima: Exodus (NES)
« on: December 31, 2019, 05:18:19 pm »
I can sneak in one more update before the new year! :woot!:

As ROM space was starting to become an issue, I've implemented a simple RLE map compression that frees up almost 10 KBytes in ROM!

That broke the way chests worked, so I had to re-implement that too.
The downside is that chests now disappear when offscreen, but that should rarely happen.

On the bright side, the routines for moving the party have been improved and now take a significantly smaller amount of CPU cycles -- it's not noticeable normally since you are limited to moving one pixel per frame, but it helps when there are a lot of enemies or NPCs roaming the map.

Also, since I had to turn my attention to chests: now the maximum loot value scales with the level of the character opening the chest.

First update of the new year ;D

I have almost completely re-written the enemy's battle AI.
Now not only the sequence is much faster (especially noticeable when there are less than 8 enemies), but enemies are now also a bit smarter and will try to navigate around obstacles including other enemies.

Before/after comparison of movement with 2 enemies:

Personal Projects / Re: Ultima: Exodus (NES)
« on: December 28, 2019, 09:00:11 pm »
Cheers guys, I appreciate all the interest and comments. Hopefully I'll have a pre-release version to test soon.

Since I can't sleep, here's another update to the character creation screen:

Markers to indicate the primary attribute(s) for the selected profession, and icons to represent each race/profession - since they will appear in game without text, so you don't need to guess what they represent.

Personal Projects / Re: Ultima: Exodus (NES)
« on: December 28, 2019, 04:10:13 pm »
Oh, I spoke too soon :( The bit I was using to extend the tileset for the castle is actually used for the rogue-like LOS effect, which would result in castles being always hidden or everything being always visible (and with the wrong palette).
Well, no big issue: I considered that change a minor addition.

the batle on the boat, use the same tiles of the ground
Good point, I hope I'll have some space left to add at least one or two "boat" tiles that replace regular floors for those battle maps.


On a more positive note, adding an impassible "rocks" tile was a lot easier.

This can break the monotony of certain areas, and provide some more strategy in the overworld encounters, since enemies can't easily move around obstacles.

Personal Projects / Re: Ultima: Exodus (NES)
« on: December 28, 2019, 11:11:05 am »
I've been working on the map lately, and it's starting to look more like what I want it to be:

However, working around its tile limitations is proving to be harder than I thought, and I'm only halfway through it.
Next steps are: hacking the routines that redraw a portion of the map that was "covered" by the UI, changing the impassibility of the new castle tiles, and moving the party to the middle castle tile when they walk on the sides, so that they can enter the castle from either side.

Personal Projects / Re: Ultima: Exodus (NES)
« on: December 26, 2019, 01:00:40 pm »
for watter, i sugest these graphics
Those some really nice tilesets!

The game animates water by cycling its four patterns this way:
Code: [Select]

So here it is when I copy-paste from one of the above:

And this is using the water ripped from Ultima IV:

You can think of it as if it was shifting each row to the left alternatively, so I tried to use that to give a "wavy" effect creating my own water from scratch:

I won't pretend to be an artist: I'm a programmer and a hardware engineer so that's basically coder art, but it's the best I can do.

Hi there,
Just wanted to drop in and say great work on this!
Ultima is my favorite RPG series and I'd play the heck out of this on both the Apple II and NES. Nowadays I enjoy playing through it using Jeff Ludwig's New Exodus mode! :)

Keep up the great work! I'll be following this project. :) :thumbsup:

Cheers!! :beer:

8-bit fan

Cheers, mate! Your appreciation means a lot.

I played the computer version back in the day as the NES one was not available in Europe - I have imported a cart only recently, thanks Ebay!
Also played Jeff Ludwig's hack and it makes the game a lot more enjoyable for sure.
I am doing my own rebalancing based on many of his ideas, the base concept is that the game should incentivise the player to level up.

A little update now.

I've removed the "pre-made character" functionality. The pre-made characters sucked and the whole thing took almost a quarter of a ROM bank.
Now I have space for other much more needed functionality.
As a replacement for this, I am pre-generating four characters with decent stats straight into RAM, so players who don't want to hand-make their own still have a pre-made party.
To give some choice, I am storing compressed character data in ROM, then unpacking two random groups of melee and magic users in RAM when a new game is created.

Gameplay-wise, I've fixed the "Repel" and "Undead" spells so they now have a real random chance to succeed, which gets better the higher the required stat (INT for Repel and WIS for Undead).

Gaming Discussion / Re: Should I play Terranigma?
« on: December 25, 2019, 05:38:30 am »
I played it back in the day without knowing it was part of a(n unofficial) trilogy - so I had played neither Soul Blazer nor Illusion of Time (as it was known here in Europe).
Initially I found it cool as I prefer real-time battles to the Final Fantasy-style combat, but the game's world was dead and depressing which is probably part of why I didn't finish it.

Personally, I'd give it another go now that I'm older and appreciate darker themes more. In fact, thanks for reminding me of the existence of this game.

Personal Projects / Re: Ultima: Exodus (NES)
« on: December 23, 2019, 07:05:22 pm »
Speaking of UI: just finished coding in the weapon display.
No more throwing daggers by mistake because you thought you had a bow equipped.

I had to do some bug fixing because my new routines messed up a check that required strict timing. All seems fine now.

Personal Projects / Re: Ultima: Exodus (NES)
« on: December 23, 2019, 12:56:31 pm »
Thanks mate, it's always good to see that someone is interested in this hack, and in good old Ultima III.

Will you be modifying the overworld sprites as well?

Definitely! I'm working on the sprites/BG tiles too:

If I'm left with enough space in ROM, I'd like to add slight palette variations per town.

Programming / Re: (Question) How to Modify Sprites in NES Games
« on: December 22, 2019, 07:07:13 am »
Speaking of tools, my new favourite is YY-CHR (which you can also find here).

However, how to edit sprites (and palettes) may vary depending on the game. Games that use CHR-RAM often have their sprites compressed.
In that case, you will have to know a bit more than just hex editing.

Personal Projects / Re: Ultima: Exodus (NES)
« on: December 21, 2019, 08:22:02 pm »
I've been doing some graphical hacking, starting with character graphics and expanding the tileset for maps.
Changing the status screen required altering a bunch of subroutines, changing some tables in ROM and creating two new routines that took all but two bytes of the free space at the end of bank #13.

I created some tiles based on the sprites used for the tarots in U4, adapted to fit the 11 professions of U3 and the attribute restrictions of BG tiles.
Since they are a bit smaller than the original graphics, that saved me some room in ROM, and I had space on screen to show character names (previously, if you had two or more characters in the same class, they would all look the same and you wouldn't know who was who).

I've also changed the fonts to something more fantasy-looking (clearly inspired by the good old Gold Box games).

Finally I have something to show.



Personal Projects / Re: Ultima: Exodus (NES)
« on: December 09, 2019, 06:41:37 pm »
I agree, the throne room looks like someone stacked up tables behind Lord British.
I was planning to add an ankh tile similar to this: which is the throne room in Ultima IV.

10/12 Update
Yesterday I found the tables with enemy encounters, the spellcasting routines, and the routines used to generate pseudo-random numbers.

I think I will fix the "Repel" and "Undead" spells next.
They have two main issues:
- Each can only be used against two types of enemies only, which are mostly encountered at lower levels.
Basically the spells are overpowered at lower levels, then become a waste of space in the magic menu.
- They are supposed to be random, to offset the fact that they cost no MP, but they don't use the RNG routines.
Instead they do an AND with a counter which is incremented once per vblank. The result is well known: this can be exploited to time the button press with the sprite animations and make the spell 100% successful.

So my plan for today is:
- Change the spell so that it can still one-hit kill low level monsters, but it can also do some damage to other types of enemies found at higher levels.
- Make both spells cost at least a bit of MP.
- Make either the success chance or effectiveness based on caster level and stats (INT for Repel, WIS for Undead).

This is going to take some extra space in ROM, but there should be enough at the end of the same bank where the spellcasting routines are.

11/12 Update
I've been looking into the "battle AI" routine, and it seems that the enemy's ability to attack diagonally is either unintended or the result of the developers running out of space in the last bank for a complete implementation.

Some values are written during enemy movement but never read, and the routine that decides if a target is in range only reads the sum of the X and Y distances.
Since bank #0 is already loaded when the evaluation happens, and that has relatively abundant free space, I may just write the extra battle AI there.

Or I may get rid of the code that allows enemies to steal stuff from the player (which is just annoying since stolen items can't be recovered or looted) and use that space instead...

In the meanwhile I found where the game stores NPC data for the current map, including the encoded address of the pattern for their sprites.
So here is Chuckles, restored to his normal clothes (I guess he was turned into a woman by mistake):

Now I just need to find where is the routine that reads that data from ROM.

12/12 Update
After further examination, the enemy's diagonal attack may have been left there intentionally.
In its absence, some really cheap tactics are possible: moving a character constantly left and right, enemies can never attack, other player characters can safely kill it with ranged attacks/magic.
Anyway, the distances are recalculated several times instead of using previously stored values, so I'll use that to speed up this routine a bit.

I've also found where the NPC data tables are stored for each location. I can permanently change Chuckles and see if there is room for extra features like NPC names/portraits etc.

16/12 Update
The town and world maps are stored in a very simple way, "packed" so that each byte represents two tiles.
4 bits per tile means only 16 tiles are available to use without drastically changing the map system.

In towns, there are two values that are never used, so I can add an Ankh tile as planned, and have space left for one alternative grass tile.
In the "overworld" maps there is some more room, might be worth adding more grass tiles since that's what most of the map is made of.

Personal Projects / Ultima: Exodus (NES) --- Now released
« on: December 09, 2019, 12:22:43 pm »

I thought I'd share a hack I've been working on in the past week or so.
Ultima: Exodus on NES was definitely the best version of Ultima 3 back in the day, but still has its shortcomings. So I decided to do a QoL hack, but I will likely upgrade the graphics too.

Update 22 Feb. 2020

Version 1.00 has finally been released!

These are my goals, and my progress so far...

  • [DONE] Allow using the Start button as well as Select to finish party creation
  • [DONE] Add an option to "set camp and save" when Start button is pressed (only allow camping outside of towns)
  • Don't allow monsters to attack diagonally, since the player can't While this would be easy to implement, it would allow cheap battle tactics
  • [DONE] During combat, allow another action after one has been cancelled via B button (still pass if B is pressed before selecting an action)
  • [DONE] Also, don't end turn when accidentally trying to cast spells with a non-caster, or opening the Tools menu when the character has nothing
  • [DONE] Reduce the duration of the screen flashes that happen when casting certain spells
  • [DONE] Make the "hit" sprite disappear more quickly to speed up combat
  • [DONE] Change NPC dialogue to better reflect the computer version and replace some useless banter with useful clues on how to progress the story
  • [WIP] Speed up the game engine. The NMI handler routine takes way too long
  • [DONE] Reduce the intro credits to two screens instead of five
  • [DONE] Improve and speed up enemy's combat AI
Gameplay changes:
  • [DONE] Allow the best character to try and disarm a trap in dungeons, instead of just testing the party leader
  • [DONE] Adjust the town maps so that they are not as redundant (e.g. duplicated shops / NPCs)
  • [DONE] Make horses useful (they allowed outrunning monsters in the computer versions)
  • [DONE] Fix the REPEL and UNDEAD spell behaviour, also make them more useful past level 2 but less overpowered
  • [DONE] Make enemy abilities more in line with the computer versions (e.g. Gargoyles and Manes should have magic attacks)
  • [DONE] Add some variety to loot chests by allowing weapons and armour to be found in addition to just gold
  • [DONE] Reintroduce enemies that were in the computer versions but not in the NES one
  • [DONE] Change the way Max MP is assigned depending on profession, to make casters other than Wizards and Clerics more useful
  • [DONE] Have different HP values depending on race and profession instead of it being the same for everyone
  • [DONE] Award attribute points to each profession's main stats upon levelling up
  • [DONE] Make loot scale with the level of the character who opens the chest
  • [DONE] Tweak HP/MP regeneration rate and food consumption
  • [DONE] Improve the enemy's battle AI
  • [DONE] Rebalance combat to make player characters more effective as they level up
GFX / UI improvements
  • [DONE] Change intro text palettes for smoother transition
  • [DONE] Change the text when a character is hit in battle so that it fits in the notification area at the bottom-right instead of being cut off
  • [DONE] During combat, add a marker next to the active character's name to indicate whose turn it is
  • [DONE] Also show what weapon is currently equipped when attacking, to avoid accidentally throwing your only dagger or wasting a turn trying to attack at range with a mace
  • [DONE] Replace status, gender and class letters with symbols (custom tiles, maybe replace unused Japanese characters)
  • [DONE] Replace health, magic and food letters with symbols
  • [DONE] Change "profession" graphics and palettes (e.g. status menu / character creation)
  • [DONE] Change all character / NPC sprites (maybe using Ultima IV ones)
  • [DONE] Allow NPC and monster graphics to use two different palettes (top sprites / bottom sprites)
  • [DONE] Restore Chuckles' jester outfit (he's wearing woman's clothes for some reason, but the ROM contains an unused jester sprite)
  • [DONE] Redo the "cutscenes" graphics (Lord British and Time Lord)
  • [DONE] Change fonts to something more fitting a fantasy game (something like the Pool of Radiance fonts)
  • [DONE] Upgrade all tiles
  • [DONE] Possibly add some new map tiles (e.g. different types of grass, ankh...)
  • [DONE] Upgrade dungeon graphics and allow a different palette for each dungeon
  • [DONE] Add character names on dialogue frames (if there is room for that in ROM)
  • Add some colour or graphics to the status screen There isn't much room left, and I prefer to use it for gameplay/QoL improvements
The UI can definitely use some love: the "party info" panel is unreadable, especially if your characters have 5-letter names.

I was initially thinking of including part of Ludmeister's excellent hack. As sadly I had no reply from him, I've started doing my own rebalancing.

********************** PROGRESS SCREENSHOTS *********************
Note that these are outdated and kept for historic reasons only!

Saving in the wilderness:Status screen:Battle UI (WIP):Weapon Display:
Dialogue UI:Dungeons:

I appreciate all comments, suggestions and criticism.

Newcomer's Board / Re: Introduction Topic
« on: December 08, 2019, 06:30:32 pm »
After all these years of lurking, I guess it's about time for me to say hello. Well, hello! ;D

Pages: 1 2 3 [4]