0 Members and 1 Guest are viewing this topic.
Alright, Enough said. I FINALLY got the menu working and now I can start creating sprites for the actual game now!
HoMM: [==--------] Project 'resumed': I'm suffering overwhelming new ideas being popped up in my dreams :PtiDE: [----------] Explored and understood the main part of the code: just started writing a Tokenizer.
:.SNAKEX::.<DATA>:.LOGO:[07C0000000000000000000001FE0000000000000000000001FF0000000780000000000003FF0000000FC0000000001F87FF7CF0000FC0000000787F87FF7DF87E0FC0000001F87F07BF7FF8FF0FC0000003F87E079E7FF8FF8FC0000003FC7C07F07FF9FFCFC1000001FEF807FE7FF8FFCFC7C00000FFF807FF7FF8FFCFDFE1E0007FF807FF7FF8FFEFDFE3FC003FF001FF7FF9FFEFFFC7FC001FE0001F7FF9FFEFFF8FFC001FF0039F7EF9FFEFFE0FFC000FF8079F7EFDFFEFFC1FBC001FFC0FFF7EFDFFEFFE1FFC003FFF0FFF7C30FFEFFE1FFC003FFFC7FE3C00FDFFFF1FF8007E7FC1F0000000EFDFFFDE00FC3FC00000000007CFEFBE01F83F80000000000187EFFE03F83F80000000000003E7FE03F8040000000000000003FC03F00000000000000000000000E]→Pic1::.MENU RAIN:[8080808000000000]→Pic2::.MENU ARROW:[0010181C18100000]→Pic3::.MENU ITEMS:"PLAY"→Str1:"HELP"→Str2:"SCORES"→Str3:"QUIT"→Str4:"ADVENTURE MODE"→Str6:"TIMED MODE"→Str7:"CLASSIC MODE"→Str8:"MAIN MENU"→Str9::.<INITIALIZING>:DiagnosticOff:ClrDraw:ClrDraw{^r}::.STORE MENU TO BACK BUFFER:Fix 1:Fix 5:Text(30,28→M→N,Str1):Text(30,36,Str2):Text(30,44,Str3):Text(30,52,Str4):DrawInv :StorePic :ClrDraw::.INTRO EFFECT:For(A,0,63): Line(0,A,95,63-A): DispGraph:End:For(A,0,95): Line(A,0,95-A,63): DispGraph:End::1→A→Z: 0→X::.<MENU LOOP>:Repeat getKey→K=9 and (M=N):ReturnIf getKey(15):: .MOVE CURSOR: .Update the cursor destination and current position, although does not draw cursor: .there are three things being combining to get a new value of N. First, M>N will be 1 if M (destination) is greater than N (current position), so the expression will be 1 so far. Second is -(M<N): min(max(K=1-(K=4)*8+M,28),52)→M>N-(M<N)+N→N: DS<(A,5): Pt-Change(rand^96,1,Pic2): End: : .DRAW LOGO AND MENU: .Shift sandstorm: Z+1→Z: .Move rain down: Vertical +: .Backup rain image: conj({L6},{L1},708): .Draw logo, sandstorm, menu, and cursor: sub(DM): .Update screen: DispGraph: .Restore rain image: conj({L1},{L6},708)::End::.<MENU HANDLER>:ClrHome::If K-15 and (M-52):: .set menu bit: : .If menu bit is 0: !If X: : !If M-28: ClrDraw: ClrDraw{^r}: Fix 0: Fix 5: Text(30,28→M→N,Str6: Text(30,36,Str7: Text(30,44,Str8: Text(30,52,Str9: Fix 4: : DrawInv : StorePic : ClrDraw: DrawInv : 1→A→Z: : : .<MENU LOOP>: : : Repeat getKey→K=9 and (M=N) or (K=15): : .MOVE CURSOR: .Update the cursor destination and current position, although does not draw cursor: .there are three things being combining to get a new value of N. First, M>N will be 1 if M (destination) is greater than N (current position), so the expression will be 1 so far. Second is -(M<N), which will evaluate to -1 if M is less than N, so this subtracts 1 in this case. This can only be true if the first expression is false, so the expression will now equal 1 if M>N, -1 if M<N, or 0 is neither are true (M=N). This offset is then applied to N, either moving N in the appropriate direction towards M or, if N already equals M, not changing it at all.: min(max(K=1-(K=4)*8+M,28),52)→M>N-(M<N)+N→N: : .ADD RAIN: .Add a new rain sprite every 5 iterations of the menu loop: DS<(A,5): Pt-Change(rand^96,1,Pic2): End: : .DRAW LOGO AND MENU: .Shift sandstorm: Z+1→Z: Vertical +: conj({L6},{L1},708): sub(DM): DispGraph: conj({L1},{L6},708): : End: .<MENU HANDLER>: !If M-28: sub(ADV): End: !If M-36: sub(TM): End: !If M-44: sub(CL): End: !If M-52: End: 1→X: End: .If menu bit is 1: Else: .If HELP: !If M-36: Disp Str2: End: .If SCORES: !If M-44: Disp Str3: End: .If QUIT: !If M-52: Disp Str4: End: End:End: Return::.<SUBROUTINES>:.DRAW MENU:Lbl DM:.∙=bitwise and:.□=bitwise xor:.┼=bitwise or:: .DRAW LOGO AND SANDSTORM: .Loop through the logo, 2 bytes at a time: For(B,0,148): .Logo data - End state: Black logo image on white bg: .XOR 65535 - Inverts logo data - End state: White logo image on black bg: .AND Rain image - If either is white (0), output is white, so logo and rain remain white - End state: White logo image and white rain on black bg: .OR *Must wait for data in parentheses to be parsed* :: .Sandstorm garbage: .AND Logo data - This is the original, black on white logo. For the outside of the logo text, which is white (0), all ANDs will result in staying white (no change, so outside of logo text is unaffected) - The black text of the logo is all black (1), so the end state will be determined by the random data of the sandstorm - End state: Random black/white image on white bg: .OR ^ - The only areas of ^ which can be black are the logo text, so everything outside the logo text will be unaffected, while areas inside (previously white) will take on the random sandstorm image - End state: Sandstorm logo image and white rain on black bg: .→ Buffer: {B*2+Pic1}{^r}→D□65535∙{B*2+{L6}→C}{^r}┼({B*2+Z}{^r}∙D)→{C}{^r}: End:: .DRAW MENU ITEMS: .Loop through the menu image, 2 bytes at a time: For(B,168,353): .Menu image - End state: White text on black bg: .AND Rain image - If either is white (0 - menu text and rain droplets), result will be white (0) - End state: White menu items and rain on black bg: .→ Buffer: {B*2+{L3}}{^r}∙{B*2+{L6}→C}{^r}→{C}{^r}: End:: .DRAW CURSOR: .Draw black cursor, turning any rain that might have been there black: Pt-On(22,N,Pic3): .Invert cursor, turning cursor white: Pt-Change(22,N,Pic3)::Return::Lbl ADV: ClrDraw: ClrDraw{^r}: Disp Str6:Return:Lbl TM: ClrDraw: ClrDraw{^r}: Disp Str7:Return:Lbl CL: ClrDraw: ClrDraw{^r}: Disp Str8:Return:::.<VARIABLES>:.A=Counter to add rain:.B=Temp loop variable for Lbl DM:.C=Temp (buffer):.D=Temp (pic1 data):.K=getKey:.M=Menu cursor destination:.N=Menu cursor current display position:.X=current menu bit:.Z=Sandstorm offset:.L1=Rain image backup:.L3=Menu items image:.L6=Rain image