**New Release** REALMS OF QUEST 3 (available for order!)

Discussion, Reviews & High-scores

Moderator: Moderators

vic user
VicGyver
Posts: 1401
Joined: Thu Mar 25, 2004 9:40 am

Post by vic user »

great cover art!

i often judge a book by its cover, so i would have bought that in a wink
adamantyr
Vic 20 Newbie
Posts: 18
Joined: Fri Mar 27, 2009 10:00 am

Stuff and more stuff

Post by adamantyr »

carlsson wrote:... but then again the 256 bytes built into an unexpanded TI-99/4(A) isn't much either (not counting the 16K VDP memory also used by its Basic). When Adamantyr writes 8+24K CPU memory it must be an expanded machine? Compare to the VIC-20 which has 5.5K RAM shared between CPU and VIC chip.
Yes, I'm writing for a "maxed out" classic TI system, which would have at least two DSSD drives (180k), and 32k memory expansion. The 256 bytes that live in the console are called the "scratchpad", and are is only 16-bit 0-wait state RAM in the system. (Unless you do a mod on your console or are using an emulator.)
carlsson wrote:By the way, you know there is at least one brand of computers and video games combining the TMS graphics chip with the 6502 CPU? :-D I mean if you would go bold in converting your RPG.
Are you referring to the MSX systems? They used a Z80 processor, though... they also had the TI's 9928a video chip (the PAL version). Some of the Japanese developers got really good at getting around the technical limitations of the chip; a lot of them used those skills on the classic NES a few years later.
ghislain wrote:I was thinking about putting in rivers of magma and lava the other day and I'll definitely put that in there. Since you're abandoning your old map, can I steal yours? Wink Well, not the whole thing, but I'll be embedding castles and cities with the natural terrain which is a spectacular visual effect.
No problem, borrow any concepts you want. My current design is roughly the same as this one (large lake in center, desert on right, dead woods middle left, etc.) but not the same map.
ghislain wrote:Having 16 different types of tile in my game, I might not be able to pull that off? Do you compress the map in your game?
Yeah, I was making the most of what I had, which was 256 tiles to play with. I load new tile sets from disk into the upper 128 for different map types, so my game technically has 640 tiles (with some repeats).

I didn't compress the map because I used the full byte by having the last bit act as a lit indicator. Plus, with 128 tiles, it wouldn't compress all that well... the less tiles you have the better your compression will be, though, so that's something you should definitely consider.
ghislain wrote:Since I plan to 'sell' my game, there may be legal difficulties in using the 'Beholder' name as it is a registered creation of TSR (now Wizards of the Coast). I doubt that they would care if a small vanity project like this was using the name, but I might give it a different synonym or something to that effect.
Yes, "Beholder" and "Roper" are both copyrighted... you can check the OGL (Open Gaming License) on Wizard's site to be certain on that. Ultima called the latter "Reaper" in order to avoid a lawsuit issue.

Adamantyr
User avatar
Ghislain
Realms of Quest
Posts: 1286
Joined: Sun Aug 08, 2004 12:54 am

Re: Stuff and more stuff

Post by Ghislain »

adamantyr wrote:
ghislain wrote:Having 16 different types of tile in my game, I might not be able to pull that off? Do you compress the map in your game?
Yeah, I was making the most of what I had, which was 256 tiles to play with. I load new tile sets from disk into the upper 128 for different map types, so my game technically has 640 tiles (with some repeats).
I was thinking about this last night, and I thought of a way to create 3-4 different types of tiles for 'grass' while only using a single nibble to represent the information on the map:

(the following is in pseudocode to give you an idea)

Code: Select all

IF TILE=GRASS THEN
     IF XPOS+YPOS.AND3=0 THEN DISPLAY GRASS_GRAPHIC1
     IF XPOS+YPOS.AND3=1 THEN DISPLAY GRASS_GRAPHIC2
     IF XPOS+YPOS.AND3=2 THEN DISPLAY GRASS_GRAPHIC3
     IF XPOS+YPOS.AND3=3 THEN DISPLAY GRASS_GRAPHIC3
END IF
This way, the tile graphics on the screen would not look as squared.
Yes, "Beholder" and "Roper" are both copyrighted... you can check the OGL (Open Gaming License) on Wizard's site to be certain on that. Ultima called the latter "Reaper" in order to avoid a lawsuit issue.
Adamantyr
OK, thanks. I'm tempted to use those names because they're most commonly known as these, but the advantage of creating my own names is that it makes them unique to my game universe.

----------------------

After some more brainstorming, I decided to modify the screen display again. It almost looks like Wizardry on the VIC-20 now:

Image

The reason for the change is that it will be easier for the player to determine how many hit points each character has. Rather than having to manually view a character in the middle of combat to determine what their hit points are, a cleric will be able to cast a healing spell on the one who needs it most. I also include the character's status (D=dead, G=good, P=poisoned, S=statue, etc).

This new display will drastically reduce the amount of text on the screen. I think that I can solve that issue if I just remove the character information at the bottom of the screen whenever there is going to be a lot of in-game text that will be shown.

With the new screen, the following sections will be for:

-UPPER LEFT -- monster portraits and in-context graphics
-UPPER RIGHT #1 -- the monsters you're fighting against (the number in the inner border denotes the row number)
-UPPER RIGHT #2 -- will show the commands you can enter
-VERY MIDDLE -- 4 lines of space to display some text
-BOTTOM -- the 6 characters in the party
"A slave is one who waits for someone to come and free him." -- Ezra Pound
adamantyr
Vic 20 Newbie
Posts: 18
Joined: Fri Mar 27, 2009 10:00 am

Re: Stuff and more stuff

Post by adamantyr »

Ghislain wrote:I was thinking about this last night, and I thought of a way to create 3-4 different types of tiles for 'grass' while only using a single nibble to represent the information on the map:

(the following is in pseudocode to give you an idea)

Code: Select all

IF TILE=GRASS THEN
     IF XPOS+YPOS.AND3=0 THEN DISPLAY GRASS_GRAPHIC1
     IF XPOS+YPOS.AND3=1 THEN DISPLAY GRASS_GRAPHIC2
     IF XPOS+YPOS.AND3=2 THEN DISPLAY GRASS_GRAPHIC3
     IF XPOS+YPOS.AND3=3 THEN DISPLAY GRASS_GRAPHIC3
END IF
This way, the tile graphics on the screen would not look as squared.
A superb idea! That's a process solution to a data problem.

If you use that particular technique above it will generate a "checkerboard" pattern of different tiles, you may want to consider throwing some randomization into the mix.

An easy way is to grab a "clock" byte from somewhere in system and use that... although you'll want to be careful to have consistency. A better way is to take some facet of the map in question and use that as a randomizer element. Then do some simple random number generation from it, like bit shift two bits off the left or right for your 0-3 value.
Ghislain wrote:OK, thanks. I'm tempted to use those names because they're most commonly known as these, but the advantage of creating my own names is that it makes them unique to my game universe.
I had much the same thought myself... Starting with Ultima 4, Richard Garriot removed all references to elves and dwarves because he figured they didn't add anything to the story or character design, and later he removed all Tolkein-style monsters from Ultima 6 onwards because they had become "fantasy cliche".

Adamantyr
User avatar
Ghislain
Realms of Quest
Posts: 1286
Joined: Sun Aug 08, 2004 12:54 am

Re: Stuff and more stuff

Post by Ghislain »

adamantyr wrote:A superb idea! That's a process solution to a data problem.

If you use that particular technique above it will generate a "checkerboard" pattern of different tiles, you may want to consider throwing some randomization into the mix.

An easy way is to grab a "clock" byte from somewhere in system and use that... although you'll want to be careful to have consistency. A better way is to take some facet of the map in question and use that as a randomizer element. Then do some simple random number generation from it, like bit shift two bits off the left or right for your 0-3 value.
Thanks! I will definitely use a bit of randomization though like you said. As well, I'll be using a single nibble to display a big castle as follows:

Code: Select all

IF TILE=CASTLE THEN
     SCREENPOSX=SCREENPOSX-1: DISPLAY CASTLE_GRAPHIC1
     SCREENPOSX=SCREENPOSX+1:DISPLAY CASTLE_GRAPHIC2
     SCREENPOSX=SCREENPOSX+1:DISPLAY CASTLE_GRAPHIC3
END IF
With that, I use a single map memory location to show a 3-tile castle. *edit: this might not be as easy as I think--if the map display routine does not come across the castle's center position, then it doesn't get displayed. I'll have to put some more thought into this.
Ghislain wrote:OK, thanks. I'm tempted to use those names because they're most commonly known as these, but the advantage of creating my own names is that it makes them unique to my game universe.
I had much the same thought myself... Starting with Ultima 4, Richard Garriot removed all references to elves and dwarves because he figured they didn't add anything to the story or character design, and later he removed all Tolkein-style monsters from Ultima 6 onwards because they had become "fantasy cliche".

Adamantyr
Well, RoQ3 will embrace fantasy cliches to the fullest. I wrote an introduction to the user's manual the other day and the little woman at home thought it was a hoot. But in the context of the Ultima universe with 8 spheres of virtue and an avatar that comes from our world, omitting elves and dwarves makes a lot of sense.

There are probably about 10 CRPGs that were made in total for the VIC-20 of which I programmed at least 3 of them. (Dunjon II is really just an improvement over Dunjon, and of course Realms of Quest 1 and 2). So I want to create a game where you can create characters based off of multiple races on the VIC-20 (RoQ1+2 did not even refer to the character's race at all). It will be basically the Ultimate D&D game for the VIC-20.

The other VIC-20 CRPG games are:
  • Ultima: Escape from Mount Drash
    Sword of Fargoal
    Sorcery
    Temple of Apshai
There are a few others as well but their names escape me.
"A slave is one who waits for someone to come and free him." -- Ezra Pound
adamantyr
Vic 20 Newbie
Posts: 18
Joined: Fri Mar 27, 2009 10:00 am

CRPG's

Post by adamantyr »

Ghislain wrote:Thanks! I will definitely use a bit of randomization though like you said. As well, I'll be using a single nibble to display a big castle as follows:

Code: Select all

IF TILE=CASTLE THEN
     SCREENPOSX=SCREENPOSX-1: DISPLAY CASTLE_GRAPHIC1
     SCREENPOSX=SCREENPOSX+1:DISPLAY CASTLE_GRAPHIC2
     SCREENPOSX=SCREENPOSX+1:DISPLAY CASTLE_GRAPHIC3
END IF
With that, I use a single map memory location to show a 3-tile castle. *edit: this might not be as easy as I think--if the map display routine does not come across the castle's center position, then it doesn't get displayed. I'll have to put some more thought into this.
A very good idea. Extend that line of thinking to what form your maps will take, and how you can make best use of what you have.

For your tile graphics, are you using a bitmap system to plot them, or some form of character display system like ASCII? On the TI everything is on a 256 character table, so I have a limited set I can display.
Ghislain wrote:There are probably about 10 CRPGs that were made in total for the VIC-20 of which I programmed at least 3 of them. (Dunjon II is really just an improvement over Dunjon, and of course Realms of Quest 1 and 2). So I want to create a game where you can create characters based off of multiple races on the VIC-20 (RoQ1+2 did not even refer to the character's race at all). It will be basically the Ultimate D&D game for the VIC-20.

The other VIC-20 CRPG games are:
  • Ultima: Escape from Mount Drash
    Sword of Fargoal
    Sorcery
There are a few others as well but their names escape me.
A worthy goal! Similar to my own, in fact, for the TI. :)

I know of "Sword of Fargoal", it was a popular one... looks really simple too, maybe make a TI version one of these days...

"Ultima: Escape from Mt. Drash" has a long and interesting history... I'm sure the VIC-20 guys know it better than I do. :)

Never heard of Sorcery, can you provide some links? Always cool to see some other CRPG's in play.

Adamantyr
User avatar
Ghislain
Realms of Quest
Posts: 1286
Joined: Sun Aug 08, 2004 12:54 am

Re: CRPG's

Post by Ghislain »

adamantyr wrote:For your tile graphics, are you using a bitmap system to plot them, or some form of character display system like ASCII? On the TI everything is on a 256 character table, so I have a limited set I can display.
VIC-20 also has a 256 char table that can be user-defined. It doesn't really use a bitmap--unless you're using double height characters so that you can 'map' the whole screen with the double height chars.

As for 'sorcery' I'll let the other forum members explain what it is ;)

----------------------------

I spent most of the afternoon working on the 'ADVENTURER'S INN' menu. So far I've implemented (V)IEW and (D)ELETE.

I'll upload a demo once I have something that is usable.

For the past few weeks I've been mostly working on the graphics but I made some changes to the source code where I can view the graphics I'm working on as well as keep testing the program. So I should be able to make a lot of progress on the main program in the near future.

Making a party-based CRPG is much more challenging than a single-character one for certain. You're basically writing a program to manage data.

Another challenge is that when I use calls to the KERNAL to display to the screen, it runs slowly--almost as if you're running a BASIC program. Now I understand why CRPGs such as POOL OF RADIANCE appear to take time to display text and data on the screen even though it is an ML program. I'll just have to find a way to make it display faster--or at least temporarily turn off the screen for a second as the text/data is rendered on the screen.
"A slave is one who waits for someone to come and free him." -- Ezra Pound
adamantyr
Vic 20 Newbie
Posts: 18
Joined: Fri Mar 27, 2009 10:00 am

Re: CRPG's

Post by adamantyr »

Ghislain wrote:VIC-20 also has a 256 char table that can be user-defined. It doesn't really use a bitmap--unless you're using double height characters so that you can 'map' the whole screen with the double height chars.
Yeah, bitmap mode on the TI is memory-consumptive, mapped weirdly, and mostly useful for drawing programs... blitting like an Apple II is out of the question.

So with 256, you got a lot of room for some decent tile work. I suggest you make your combat, dungeon, and map sets totally separate if you have the memory for it, so that you can have plenty of room for creativity. Especially if you're storing them in RAM and can just alter a pointer to change the whole set.
Ghislain wrote:Making a party-based CRPG is much more challenging than a single-character one for certain. You're basically writing a program to manage data.

Another challenge is that when I use calls to the KERNAL to display to the screen, it runs slowly--almost as if you're running a BASIC program. Now I understand why CRPGs such as POOL OF RADIANCE appear to take time to display text and data on the screen even though it is an ML program. I'll just have to find a way to make it display faster--or at least temporarily turn off the screen for a second as the text/data is rendered on the screen.
Yes, my CRPG is party-based, and it does get complicated to manage... Especially with controls.

Text displays are the worst. I was disgusted with how much memory I was consuming just drawing that stuff on the screen... if you program in assembly too long you start resenting the prospective user for his lack of ability to read the registers directly like the computer can. :)

I think it's only on vintage systems that text actually takes up the same amount of space (if not more) than graphics! I got around the problem in two ways:

One, by storing as much as possible on disk as memory images, which is a nice shortcut on the TI, although each screen is a separate file so you have to keep the count low to avoid the 127 file limit on a disk.

Two, stratify your data so that things are nicely arranged in pre-determined locations, and reuse those positions as much as you can. Then you can build your text writing as a single process that just reads data tables for positions and text to write.

It's the compound text that kills you, like "HP: 12/15" or "%Name% hits!", where you have to combine static text with numeral values or variables with unknown lengths. Keep those to a minimum if you can.

Adamantyr
carlsson
Class of '6502
Posts: 5516
Joined: Wed Mar 10, 2004 1:41 am

Re: Stuff and more stuff

Post by carlsson »

adamantyr wrote:
carlsson wrote:combining the TMS graphics chip with the 6502 CPU
Are you referring to the MSX systems?
No, I made a pass to the possibly obscure creatiVision video game (later repacked into the vTech Laser 2001 computer), very similar to ColecoVision except the CPU. But that was just a side remark, and as you have figured out the VIC-20 graphic capacities should give people enough room to make nice RPG games.

.. on the other hand as Ghislain is eager to put his game on a 32K cartridge, how about going one step further and see if it is possible to fit a 9928/29 on the cartridge, thus making a RPG with its "custom" video chip? It would make it harder and probably more expensive to manufacture but also be a quite certain way to avoid piracy.. and get colourful, 40 column graphics. :-D
Anders Carlsson

Image Image Image Image Image
User avatar
darkatx
Vic 20 Afficionado
Posts: 483
Joined: Wed Feb 04, 2009 2:17 pm
Location: Canada

Post by darkatx »

In answer to the new screen format...RIGHT ON! :D

It's so much easier to read now...especially with the neat font you have there.
Learning all the time... :)
User avatar
Ghislain
Realms of Quest
Posts: 1286
Joined: Sun Aug 08, 2004 12:54 am

Post by Ghislain »

Worked today on more data management routines, this time switching a character position (say trade character 2 with character 5, etc):

Code: Select all

		STA TEMP3
		LDX PCHAR
		LDA PCHARLOC,X
		STA PCHARLO
		LDA PNAMELOC,X
		STA PNAMELO

		;first copy the names
		LDX TEMP3
		LDA PNAMELOC,X
		STA 1		; set PNAMELO2 
		LDA PNAMEHI
		STA 2		; set PNAMEHI2

		LDY #0
@C1:
		LDA (PNAMELO),Y
		STA TEMP4	; copy active name to temp name
		LDA (1),Y
		STA (PNAMELO),Y		; copy selected name to active name
		LDA TEMP4
		STA (1),Y		; copy temp name to selected name
		INY
		CPY #11
		BNE @C1

		;then copy the stats
		LDX TEMP3
		LDA PCHARLOC,X
		STA 1		; set PCHARLO2 
		LDA PCHARHI
		STA 2		; set PCHARHI2

		LDY #0
@C2:
		LDA (PCHARLO),Y
		STA TEMP4		; copy active stat to temp stat
		LDA (1),Y
		STA (PCHARLO),Y		; copy selected stat to active stat
		LDA TEMP4
		STA (1),Y		; copy temp stat to selected stat
		INY
		CPY #34
		BNE @C2
		
		JSR PRINTCHARS
		RTS
The advantage/disadvantage of ML programming is that you're constantly working with pointers. Another plus is that the above would probably be a lot slower to accomplish in BASIC and the code to accomplish this with string and integer arrays would probably be greater.
"A slave is one who waits for someone to come and free him." -- Ezra Pound
User avatar
Mike
Herr VC
Posts: 5134
Joined: Wed Dec 01, 2004 1:57 pm
Location: Munich, Germany
Occupation: electrical engineer

Post by Mike »

You could put all information about each group member in a single structure, allocate 6 structures in total, and hold an array of 6 pointers to all these member structures.

Then it's simply a matter of exchanging 2 of the 6 pointers, and re-displaying the table through these pointers.

Michael
adamantyr
Vic 20 Newbie
Posts: 18
Joined: Fri Mar 27, 2009 10:00 am

LOS algorithm in 6502

Post by adamantyr »

Incidentally, you may not have noticed it, but in part 4 of my CRPG articles I had a link to the actual 6502 LOS algorithm derived from the Apple II version of Ultima IV.

You can view it here.

Adamantyr
User avatar
Ghislain
Realms of Quest
Posts: 1286
Joined: Sun Aug 08, 2004 12:54 am

Post by Ghislain »

Mike wrote:You could put all information about each group member in a single structure, allocate 6 structures in total, and hold an array of 6 pointers to all these member structures.

Then it's simply a matter of exchanging 2 of the 6 pointers, and re-displaying the table through these pointers.
Or something like that... heh.

I actually have pointers that reference the physical locations of the character names and their stats (PCHARLOC and PNAMELOC).

I just need to move that those two 6 byte pointer arrays to RAM and then have them switched around when the player changes the order of players in the party.

Still a n00b learning the ropes...
Last edited by Ghislain on Wed Apr 01, 2009 4:56 pm, edited 1 time in total.
"A slave is one who waits for someone to come and free him." -- Ezra Pound
User avatar
Ghislain
Realms of Quest
Posts: 1286
Joined: Sun Aug 08, 2004 12:54 am

Post by Ghislain »

Thanks to MIke's suggestion, I reduced all of those lines of code into the following:

Code: Select all

		TAY
		LDX PCHAR	; x=active, y=selected

		LDA PNAMELOC,X
		STA TEMP3
		LDA PNAMELOC,Y
		STA PNAMELOC,X
		LDA TEMP3
		STA PNAMELOC,Y

		LDA PCHARLOC,X
		STA TEMP3
		LDA PCHARLOC,Y
		STA PCHARLOC,X
		LDA TEMP3
		STA PCHARLOC,Y

		JSR PRINTCHARS
		RTS
I will now hang my head in shame...

I also spent a good part of the day drawing a dragon. I'm not 100% satisfied with it, but it's not too bad. You guys will get to see it when I upload my next demo (which should be soon, I want to at least create the interface for rolling and creating characters)
"A slave is one who waits for someone to come and free him." -- Ezra Pound
Post Reply