| |
xIII
Registered: Nov 2008 Posts: 210 |
Another Random Generator
For my little game Modulot I used this random generator I found on Codebase64:
GetRandom:
ldx #0
lda random+1
sta temp2
lda random
asl
rol temp2
asl
rol temp2
clc
adc random
pha
lda temp2
adc random+1
sta random+1
pla
adc #$11
sta random
lda random+1
adc #$36
sta random+1
sta RANDOMNUMBERS_TABLE,x
inx
bne GetRandom+2
rts
Unfortunately I found out (too late) that this routine always generates the same table. What I wanted was a different table every time this routine is called.
How can I create a random table that is different every time ? |
|
| |
Smasher
Registered: Feb 2003 Posts: 520 |
my stupid solution: since in Modulot you have a title screen and game starts when you press space/fire just place a "inc my_counter" somewhere and recall level with "lda my_counter". use 2 bytes if you have many levels :) |
| |
xIII
Registered: Nov 2008 Posts: 210 |
Yeah, that's stupid ... :p
It has to be a 256 bytes table.
I need the table for random pattern (level), random numbers, random mod,...
I found this:
FillRandom:
ldx #0
!l: lda #$ff // maximum frequency value
sta $d40e // voice 3 frequency low byte
sta $d40f // voice 3 frequency high byte
lda #$80 // noise waveform, gate bit off
sta $d412 // voice 3 control register
lda $d41b
sta Table_Random,x
inx
bne !l-
rts
... but since these are SID registers, don't they mess up the music ? (maybe I should just try it). |
| |
chatGPZ
Registered: Dec 2001 Posts: 11386 |
the one and only right way to do this is:
a) use some user interaction as random seed. ie start a timer and then read the timer value when user presses a key (to start the game or something)
b) from that point on use a PRNG as in the first post |
| |
xIII
Registered: Nov 2008 Posts: 210 |
thx Groepaz,
a) In my IRQ: inc VALUE
b) the first lda random+1 is replaced by lda VALUE
this seems to work as I want. |
| |
chatGPZ
Registered: Dec 2001 Posts: 11386 |
nooo thats not a good idea :). instead initialize random (and random+1) once with such counter value (cia1 timer will do fine) |
| |
Smasher
Registered: Feb 2003 Posts: 520 |
I wonder where's the difference between Groepaz's and my solution :) just keep "inc value" in the irq while you play and the level is as random as RND |
| |
chatGPZ
Registered: Dec 2001 Posts: 11386 |
look at the routine above. if you replace the first LDA random+1 by some LDA counter thing, the entire routine doesnt do anymore what its supposed to do - there wont be any feedback for the highbyte at all, breaking all the sequence properties.
rule of thumb: dont try to make your own PRNG - use an existing one that is proven to work. your own will most likely be (much) worse. |
| |
Smasher
Registered: Feb 2003 Posts: 520 |
sure. but you just need 1 byte to have 256 random levels, 2 bytes for 64K levels, etc, no need to build a table and waste 256 bytes. also a table containing sorted numbers or one filled with random numbers doesn't change anything when the byte is picked up randomly from it. a table could make sense if you want to avoid repeated levels in a gameplay, but a game without repeated levels is boring, because when you are playing the 255th level you perfectly know which level you'll play next :) |
| |
xIII
Registered: Nov 2008 Posts: 210 |
lda $dc04
sta random
lda $dc05
sta random+1
before the routine above? |
| |
chatGPZ
Registered: Dec 2001 Posts: 11386 |
xIII: yes, exactly
and yes, building a table is pointless - with a given seed the generator produces the same sequence anyway. |
... 3 posts hidden. Click here to view all posts.... |
Previous - 1 | 2 - Next |