Omnimaga

Calculator Community => Other Calc-Related Projects and Ideas => TI Z80 => Topic started by: ibid on October 03, 2012, 03:00:25 am

Title: axe set (with AI)
Post by: ibid on October 03, 2012, 03:00:25 am
I am porting the card game set (http://en.wikipedia.org/wiki/Set (game)) to the 83/84 plus calculators in axe.

So far I did close to everything besides for the Human element. (I did the AI)

here's a screenshot:
(http://img.ourl.ca/rfg/0-setscreenshot.gif)


Edit: Here's the above screenshot but with the frozen frames removed. As per suggestion from Sorunome I had switched over to managing the greyscale via interrupts, and so this image more closely resembles the game as it was before I abandoned it.
(https://i.imgur.com/PK6Ewuf.gif)
Title: Re: axe set (with AI)
Post by: aeTIos on October 03, 2012, 04:35:25 am
looks quite nice :o Is the grayscale better oncalc?
Title: Re: axe set (with AI)
Post by: Xeda112358 on October 03, 2012, 07:20:24 am
Hmm, it looks like you are performing some computations and probably drawing a bit, too, when you press a key (the lag is noticeable between frames). I think you should try putting the LCD updating in an interrupt, then it will be constantly updating on its own :)
Title: Re: axe set (with AI)
Post by: ibid on October 03, 2012, 09:03:48 am
The greyscale kind of looks better on the calculator where you are paused more between keys. The computations are done beforehand and Dispgraphrr is in a very short loop.

I've never really used interrupts before. So I should just use FnInt( to turn it on, LnReg to turn it off, and put Dispgraphrr in the interrupt routine?
Title: Re: axe set (with AI)
Post by: Sorunome on October 03, 2012, 07:32:52 pm
nice game so far!

And yeah, probably, but i think you can't use L2 then.
EDIT: just found this fore nice greyscale: http://ourl.ca/17145/318621
Title: Re: axe set (with AI)
Post by: Deep Toaster on October 03, 2012, 10:08:46 pm
Very nice graphics :) I've never played Set before, but it looks great for a first game! (I'm assuming since you just registered that it's your first Axe game.)

And welcome to Omnimaga!
Title: Re: axe set (with AI)
Post by: TIfanx1999 on December 08, 2017, 05:57:02 pm
Wow, 4 years since the initial post. :O Are you finishing this or are you working on anything programming related at the moment?
Title: Re: axe set (with AI)
Post by: ibid on December 27, 2017, 07:27:21 am
Quote
Wow, 4 years since the initial post. :O Are you finishing this or are you working on anything programming related at the moment?

I just picked it up again to try finishing it, but not sure if I'll be able to complete it.

The problem with using interrupts for greyscale is that they update the display before I'm finished drawing to the buffers. If I turn off interrupts during the drawing routines than there's a noticeable lag where the greyscale freezes into monochrome.

My usual method was to have all of the drawing commands followed by dispgraphclrdrawrr in a single loop.

Other than creating a 1,536 byte buffer in the ram, the only thing that I can think of is to rewrite all of the drawing routines to only erase each section right before it gets redrawn instead of constantly clrdraw'ing everything at once.
Title: Re: axe set (with AI)
Post by: c4ooo on December 27, 2017, 08:45:53 pm
Have 4 buffers. Two for the final greyscale image, and two others for drawing on. When you finish drawing a frame, copy the draw buffer to the greyscale buffer. You can use GetCalc("prgmTEMP, 768*2) to make a temporary program were to store the buffer.
Title: Re: axe set (with AI)
Post by: ibid on December 27, 2017, 09:09:34 pm
But then I'll need an extra 1,536 bytes of free ram in order to run the game (in addition to however much space the program is).

Is there a way to draw text to a custom buffer? Or should I just leave my drawing routines as they are and use the new buffers as the greyscale buffer?
Title: Re: axe set (with AI)
Post by: c4ooo on December 27, 2017, 09:58:41 pm
Actually there is enough free ram for 5 buffers. (Although a game i made used 6).
Take a look at this, a modified version of @Runer112's greylib:
Code: [Select]
L6->Str1B1
L3->Str1B2
L1->Str1B5
L2+103->Str1B3
L4-512->Str1B4
|E36->^^oGP
#ExprOff
Lbl GTUNE
1->K
ClrDraw^^r^^r
Rect(24,0,24,64)^^r
Rect(72,0,24,64)^^r
Rect(48,0,48,64)
Text(0,,"GREYSCALE RATE "[CF]"/"[0500]
GDISP()
While 1
Text(80,0,{Str1RATE}>Dec
Copy(L6,L3,168
GDISP()
If getKey(2)
{Str1RATE}--
Pause 50
1->K
ElseIf getKey(3)
{Str1RATE}++
Pause 50
1->K
ElseIf getKey(15)??getKey(41)??getKey(9)??getKey(54)
!If K
Return
End
Else
0->K
End
End
Return
Lbl GLOAD
Asm(3E40D3(^^oGP)^^r)
fnInt(GI, and 0)
Return
Lbl GUNLOAD
FnOff
Asm(EF204AAF32178DEF1150)
Asm(AFD3(^^oGP)^^r)
LnReg^^r
Asm(FF)
Return
#ExprOn
Lbl GDISP
FnOff
Copy(Str1B1,Str1B3)
Copy(Str1B2,Str1B4)
FnOn
Return
#ExprOff
Lbl GNOT83
Asm(DB0217ED62)
Return
#ExprOn
Lbl GI
If {Str1GNOT83}Asm(7DDEF6D303)
Asm(3E02D3(^^oGP+1)^^r3A(Str1RATE)D3(^^oGP+2)^^r
Else
Str1GI
{}--
ReturnIf ->{}
{Str1RATE}->{Str1GI}
End
DispGraph(Str1B3,Str1B4)^^r^^r
Return
L6 and L3 are still used for drawing while L2+103 and L4-512 are used for the greyscale. "Lbl GTUNE" is" the greyscale tuner, "Lbl GLOAD" initializes the greyscale (use this at start of program), "Lbl GUNLOAD" uninitilizes it (use this at end), "Lbl GDISP" flips the buffers (use this when you finish drawing your frame), "Lbl GNOT83" returns if or not the calc is an not 83, and lastly "Lbl GI" is the actual interrupt.

"Str1RATE" is a pointer to the greyscale rate, a single byte that tells how often the greyscale should update. "Str1GI" is a pointer to another byte that acts like a counter of sorts.You should ask @Runer112 for more info, I have forgot the intricacies of greyscale :(
Title: Re: axe set (with AI)
Post by: E37 on December 30, 2017, 04:06:45 pm
If you want to draw text to a custom buffer, I made an axiom that lets you do just that! It also is twice as fast as standard Text( command. The tokens are under the matrix menu.

Spoiler For commands n' stuff:
Text()
Text(x,y,string) //Draws string to x,y to front buffer
Text(x,y,string,buffer) //Draws string to x,y at specified buffer
Text(string) //Draws string to the front buffer at current cursor position
Text(string,buffer) //Draws string to specified buffer at current cursor position

Dec()
Same as Text() but replace string with an unsigned int

Dec()r and Dec()rr
Same as Dec() but displays the number in hex or binary

Char()
Same as Text() but replace string with a character

Tok()
Same as Text() but replace string with a pointer to a 1 or 2 byte token
Title: Re: axe set (with AI)
Post by: ibid on December 31, 2017, 03:59:03 am
I implemented Greylib, which took care of all the display problems I had. I'm now pretty much all done besides for the actual gameplay (which is where I thought I was up to when I first started this topic).

Anyways, I'm uploading a copy as it is now. It's not really playable, but it shows off the graphics, the AI, and most of the interface. The calculator lays out cards and show a set. If you press Enter, the calculator will remove the set, lay out more cards, and show a different set. (And so on until there are no more cards in the deck.) You can press the arrow keys to explore the attributes of different cards in the sidebar (in case the card designs are too hard to make out). The "Set" button at F5 doesn't do anything yet, and there's no way for you to call your own set. So as of now you can only watch the calculator play against itself.
Title: Re: axe set (with AI)
Post by: ibid on January 08, 2018, 12:50:10 pm
Okay, it's now fully playable.

(https://i.imgur.com/WlIcgjK.gif)

Rules

Like the original game, each card has four properties (number, color, shape, pattern). A "set" is a group of three cards in which every one of the properties is either the same or different. (but not two cards alike with only the third different).

Twelve cards (or more if needed) are laid out and you have to try finding a set. When you find one, you press [Graph] to call it, and then select the three cards. You get a point and those cards are replaced. Calling "set" incorrectly causes you to lose a point. (Though you can disable this penalty in the settings.)

If you wait to long then the calculator will "find" a set first and get a point. This time is defaulted to about 20 seconds (on the 15mHz calcs at least), but you can adjust it in the settings for an easier/harder game.

Controls

Arrow keys - move cursor around
Graph - Call a set
Graph/2nd/Enter - Select cards (after calling a set)
2nd/Enter - Deal new cards (after the calculator calls a set)
Trace - Enter/Exit the settings menu
Clear - Exit