**New Release** REALMS OF QUEST 3 (available for order!)
Moderator: Moderators
Stuff and more stuff
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:... 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.
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.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?I mean if you would go bold in converting your RPG.
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: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.
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).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?
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.
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.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.
Adamantyr
Re: Stuff and more stuff
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:adamantyr wrote: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).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?
(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
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.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
----------------------
After some more brainstorming, I decided to modify the screen display again. It almost looks like Wizardry on the VIC-20 now:

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
Re: Stuff and more stuff
A superb idea! That's a process solution to a data problem.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)
This way, the tile graphics on the screen would not look as squared.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
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.
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".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.
Adamantyr
Re: Stuff and more stuff
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: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.
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
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.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".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.
Adamantyr
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
"A slave is one who waits for someone to come and free him." -- Ezra Pound
CRPG's
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.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:
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.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
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.
A worthy goal! Similar to my own, in fact, for the TI.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:
There are a few others as well but their names escape me.
- Ultima: Escape from Mount Drash
Sword of Fargoal
Sorcery

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
Re: CRPG's
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.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.
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
Re: CRPG's
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.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.
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.
Yes, my CRPG is party-based, and it does get complicated to manage... Especially with controls.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.
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
Re: Stuff and more stuff
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.adamantyr wrote:Are you referring to the MSX systems?carlsson wrote:combining the TMS graphics chip with the 6502 CPU
.. 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.

Anders Carlsson






Worked today on more data management routines, this time switching a character position (say trade character 2 with character 5, etc):
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.
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
"A slave is one who waits for someone to come and free him." -- Ezra Pound
LOS algorithm in 6502
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
You can view it here.
Adamantyr
Or something like that... heh.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.
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
Thanks to MIke's suggestion, I reduced all of those lines of code into the following:
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)
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 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