-rw-r--r-- | noncore/games/sfcave/sfcave.cpp | 355 | ||||
-rw-r--r-- | noncore/games/sfcave/sfcave.h | 10 |
2 files changed, 213 insertions, 152 deletions
diff --git a/noncore/games/sfcave/sfcave.cpp b/noncore/games/sfcave/sfcave.cpp index d551afe..0160d34 100644 --- a/noncore/games/sfcave/sfcave.cpp +++ b/noncore/games/sfcave/sfcave.cpp | |||
@@ -35,2 +35,3 @@ | |||
35 | #define MENU_OPTIONS_MENU 1 | 35 | #define MENU_OPTIONS_MENU 1 |
36 | #define MENU_REPLAY_MENU 2 | ||
36 | 37 | ||
@@ -38,5 +39,6 @@ | |||
38 | #define MENU_START_GAME 0 | 39 | #define MENU_START_GAME 0 |
39 | #define MENU_OPTIONS 1 | 40 | #define MENU_REPLAY 1 |
40 | #define MENU_HELP 2 | 41 | #define MENU_OPTIONS 2 |
41 | #define MENU_QUIT 3 | 42 | #define MENU_HELP 3 |
43 | #define MENU_QUIT 4 | ||
42 | 44 | ||
@@ -48,2 +50,8 @@ | |||
48 | 50 | ||
51 | // Replay Menu Options | ||
52 | #define MENU_REPLAY_START 0 | ||
53 | #define MENU_REPLAY_LOAD 1 | ||
54 | #define MENU_REPLAY_SAVE 2 | ||
55 | #define MENU_REPLAY_BACK 3 | ||
56 | |||
49 | 57 | ||
@@ -71,4 +79,8 @@ QString SFCave::gameTypes[] = { SFCAVE_GAME, GATES_GAME, FLY_GAME }; | |||
71 | 79 | ||
72 | QString SFCave::menuOptions[2][5] = { { "Start Game", "Options", "Help", "Quit", "" }, | 80 | QString SFCave::menuOptions[NR_MENUS][MAX_MENU_OPTIONS] = { { "Start Game", "Replays", "Options", "Help", "Quit", "", "", "" }, |
73 | { "Game Type - %s", "Game Difficulty - %s", "Clear High Scores for this game", "Back", "" } }; | 81 | { "Game Type - %s", "Game Difficulty - %s", "Clear High Scores for this game", "Back", "", "", "", "" }, |
82 | { "Play Reply", "Load Replay", "Save Replay", "Back", "", "", "", "" } }; | ||
83 | |||
84 | int SFCave::nrMenuOptions[NR_MENUS] = { 5, 4, 4 }; | ||
85 | int SFCave ::currentMenuOption[NR_MENUS] = { 0, 0, 0 }; | ||
74 | 86 | ||
@@ -96,4 +108,2 @@ int SFCave::initialGateGaps[] = { 75, 50, 25 }; | |||
96 | 108 | ||
97 | int SFCave::nrMenuOptions[2] = { 4, 4 }; | ||
98 | int SFCave ::currentMenuOption[2] = { 0, 0 }; | ||
99 | 109 | ||
@@ -694,3 +704,3 @@ void SFCave :: draw() | |||
694 | p.drawText( (sWidth/2) - (fm.width( text )/2), 135, text ); | 704 | p.drawText( (sWidth/2) - (fm.width( text )/2), 135, text ); |
695 | 705 | /* | |
696 | text = "Press r to replay"; | 706 | text = "Press r to replay"; |
@@ -703,2 +713,3 @@ void SFCave :: draw() | |||
703 | p.drawText( (sWidth/2) - (fm.width( text )/2), 180, text ); | 713 | p.drawText( (sWidth/2) - (fm.width( text )/2), 180, text ); |
714 | */ | ||
704 | } | 715 | } |
@@ -764,59 +775,3 @@ void SFCave :: keyPressEvent( QKeyEvent *e ) | |||
764 | if ( state == STATE_MENU ) | 775 | if ( state == STATE_MENU ) |
765 | { | 776 | handleMenuKeys( e ); |
766 | switch( e->key() ) | ||
767 | { | ||
768 | case Qt::Key_Down: | ||
769 | currentMenuOption[currentMenuNr] ++; | ||
770 | if ( menuOptions[currentMenuNr][currentMenuOption[currentMenuNr]] == "" ) | ||
771 | currentMenuOption[currentMenuNr] = 0; | ||
772 | break; | ||
773 | case Qt::Key_Up: | ||
774 | currentMenuOption[currentMenuNr] --; | ||
775 | if ( currentMenuOption[currentMenuNr] < 0 ) | ||
776 | currentMenuOption[currentMenuNr] = nrMenuOptions[currentMenuNr]-1; | ||
777 | break; | ||
778 | |||
779 | case Qt::Key_Left: | ||
780 | if ( currentMenuNr == MENU_OPTIONS_MENU ) | ||
781 | { | ||
782 | if ( currentMenuOption[currentMenuNr] == MENU_GAME_TYPE ) | ||
783 | { | ||
784 | currentGameType --; | ||
785 | if ( currentGameType < 0 ) | ||
786 | currentGameType = NR_GAME_TYPES - 1; | ||
787 | } | ||
788 | else if ( currentMenuOption[currentMenuNr] == MENU_GAME_DIFFICULTY ) | ||
789 | { | ||
790 | currentGameDifficulty --; | ||
791 | if ( currentGameDifficulty < 0 ) | ||
792 | currentGameDifficulty = NR_GAME_DIFFICULTIES - 1; | ||
793 | } | ||
794 | } | ||
795 | break; | ||
796 | |||
797 | case Qt::Key_Right: | ||
798 | if ( currentMenuNr == MENU_OPTIONS_MENU ) | ||
799 | { | ||
800 | if ( currentMenuOption[currentMenuNr] == MENU_GAME_TYPE ) | ||
801 | { | ||
802 | currentGameType ++; | ||
803 | if ( currentGameType == NR_GAME_TYPES ) | ||
804 | currentGameType = 0; | ||
805 | } | ||
806 | else if ( currentMenuOption[currentMenuNr] == MENU_GAME_DIFFICULTY ) | ||
807 | { | ||
808 | currentGameDifficulty ++; | ||
809 | if ( currentGameDifficulty == NR_GAME_DIFFICULTIES ) | ||
810 | currentGameDifficulty = 0; | ||
811 | } | ||
812 | } | ||
813 | break; | ||
814 | |||
815 | case Qt::Key_Space: | ||
816 | case Qt::Key_Return: | ||
817 | case Qt::Key_Enter: | ||
818 | dealWithMenuSelection(); | ||
819 | break; | ||
820 | } | ||
821 | } | ||
822 | else | 777 | else |
@@ -838,3 +793,7 @@ void SFCave :: keyPressEvent( QKeyEvent *e ) | |||
838 | if ( state == STATE_CRASHED ) | 793 | if ( state == STATE_CRASHED ) |
794 | { | ||
839 | state = STATE_MENU; | 795 | state = STATE_MENU; |
796 | currentMenuNr = 0; | ||
797 | currentMenuOption[currentMenuNr] = 0; | ||
798 | } | ||
840 | break; | 799 | break; |
@@ -901,2 +860,162 @@ void SFCave :: keyReleaseEvent( QKeyEvent *e ) | |||
901 | 860 | ||
861 | |||
862 | void SFCave :: saveScore() | ||
863 | { | ||
864 | #ifdef QWS | ||
865 | Config cfg( "sfcave" ); | ||
866 | cfg.setGroup( "settings" ); | ||
867 | QString key = "highScore_"; | ||
868 | |||
869 | cfg.writeEntry( key + gameTypes[currentGameType] + "_" + dificultyOption[currentGameDifficulty], highestScore[currentGameType][currentGameDifficulty] ); | ||
870 | key += CURRENT_GAME_TYPE; | ||
871 | cfg.writeEntry( key, highestScore[currentGameType] ); | ||
872 | #endif | ||
873 | } | ||
874 | |||
875 | void SFCave :: saveReplay() | ||
876 | { | ||
877 | FILE *out; | ||
878 | out = fopen( (const char *)replayFile, "w" ); | ||
879 | if ( !out ) | ||
880 | { | ||
881 | printf( "Couldn't write to /home/root/sfcave.replay\n" ); | ||
882 | return; | ||
883 | } | ||
884 | |||
885 | // Build up string of values | ||
886 | // Format is:: <landscape seed> <game type> <difficulty> <framenr> <framenr>....... | ||
887 | QString val; | ||
888 | val.sprintf( "%d %d %d ", currentSeed, currentGameType, currentGameDifficulty ); | ||
889 | |||
890 | QListIterator<int> it( replayList ); | ||
891 | while( it.current() ) | ||
892 | { | ||
893 | QString tmp; | ||
894 | tmp.sprintf( "%d ", (*it.current()) ); | ||
895 | val += tmp; | ||
896 | |||
897 | ++it; | ||
898 | } | ||
899 | val += "\n"; | ||
900 | |||
901 | QString line; | ||
902 | line.sprintf( "%d\n", val.length() ); | ||
903 | fwrite( (const char *)line, 1, line.length(), out ); | ||
904 | |||
905 | fwrite( (const char *)val, 1, val.length(), out ); | ||
906 | |||
907 | fclose( out ); | ||
908 | |||
909 | printf( "Replay saved to %s\n", (const char *)replayFile ); | ||
910 | |||
911 | } | ||
912 | |||
913 | void SFCave :: loadReplay() | ||
914 | { | ||
915 | FILE *in = fopen( (const char *)replayFile, "r" ); | ||
916 | |||
917 | if ( in == 0 ) | ||
918 | { | ||
919 | printf( "Couldn't load replay file!\n" ); | ||
920 | return; | ||
921 | } | ||
922 | |||
923 | // Read next line - contains the size of the options | ||
924 | char line[10+1]; | ||
925 | fgets( line, 10, in ); | ||
926 | |||
927 | int length = -1; | ||
928 | sscanf( line, "%d", &length ); | ||
929 | char *data = new char[length+1]; | ||
930 | |||
931 | fread( data, 1, length, in ); | ||
932 | // printf( "data - %s", data ); | ||
933 | |||
934 | QString sep = " "; | ||
935 | QStringList list = QStringList::split( sep, QString( data ) ); | ||
936 | |||
937 | // print it out | ||
938 | QStringList::Iterator it = list.begin(); | ||
939 | currentSeed = (*it).toInt(); | ||
940 | ++it; | ||
941 | currentGameType = (*it).toInt(); | ||
942 | ++it; | ||
943 | currentGameDifficulty = (*it).toInt(); | ||
944 | ++it; | ||
945 | |||
946 | replayList.clear(); | ||
947 | for ( ; it != list.end(); ++it ) | ||
948 | { | ||
949 | int v = (*it).toInt(); | ||
950 | replayList.append( new int( v ) ); | ||
951 | } | ||
952 | |||
953 | delete data; | ||
954 | |||
955 | fclose( in ); | ||
956 | |||
957 | printf( "Replay loaded from %s\n", (const char *)replayFile ); | ||
958 | } | ||
959 | |||
960 | |||
961 | //--------------- MENU CODE --------------------- | ||
962 | void SFCave :: handleMenuKeys( QKeyEvent *e ) | ||
963 | { | ||
964 | switch( e->key() ) | ||
965 | { | ||
966 | case Qt::Key_Down: | ||
967 | currentMenuOption[currentMenuNr] ++; | ||
968 | if ( menuOptions[currentMenuNr][currentMenuOption[currentMenuNr]] == "" ) | ||
969 | currentMenuOption[currentMenuNr] = 0; | ||
970 | break; | ||
971 | case Qt::Key_Up: | ||
972 | currentMenuOption[currentMenuNr] --; | ||
973 | if ( currentMenuOption[currentMenuNr] < 0 ) | ||
974 | currentMenuOption[currentMenuNr] = nrMenuOptions[currentMenuNr]-1; | ||
975 | break; | ||
976 | |||
977 | case Qt::Key_Left: | ||
978 | if ( currentMenuNr == MENU_OPTIONS_MENU ) | ||
979 | { | ||
980 | if ( currentMenuOption[currentMenuNr] == MENU_GAME_TYPE ) | ||
981 | { | ||
982 | currentGameType --; | ||
983 | if ( currentGameType < 0 ) | ||
984 | currentGameType = NR_GAME_TYPES - 1; | ||
985 | } | ||
986 | else if ( currentMenuOption[currentMenuNr] == MENU_GAME_DIFFICULTY ) | ||
987 | { | ||
988 | currentGameDifficulty --; | ||
989 | if ( currentGameDifficulty < 0 ) | ||
990 | currentGameDifficulty = NR_GAME_DIFFICULTIES - 1; | ||
991 | } | ||
992 | } | ||
993 | break; | ||
994 | |||
995 | case Qt::Key_Right: | ||
996 | if ( currentMenuNr == MENU_OPTIONS_MENU ) | ||
997 | { | ||
998 | if ( currentMenuOption[currentMenuNr] == MENU_GAME_TYPE ) | ||
999 | { | ||
1000 | currentGameType ++; | ||
1001 | if ( currentGameType == NR_GAME_TYPES ) | ||
1002 | currentGameType = 0; | ||
1003 | } | ||
1004 | else if ( currentMenuOption[currentMenuNr] == MENU_GAME_DIFFICULTY ) | ||
1005 | { | ||
1006 | currentGameDifficulty ++; | ||
1007 | if ( currentGameDifficulty == NR_GAME_DIFFICULTIES ) | ||
1008 | currentGameDifficulty = 0; | ||
1009 | } | ||
1010 | } | ||
1011 | break; | ||
1012 | |||
1013 | case Qt::Key_Space: | ||
1014 | case Qt::Key_Return: | ||
1015 | case Qt::Key_Enter: | ||
1016 | dealWithMenuSelection(); | ||
1017 | break; | ||
1018 | } | ||
1019 | } | ||
1020 | |||
902 | void SFCave :: displayMenu() | 1021 | void SFCave :: displayMenu() |
@@ -920,3 +1039,3 @@ void SFCave :: displayMenu() | |||
920 | // Draw options | 1039 | // Draw options |
921 | int pos = 170; | 1040 | int pos = 140; |
922 | for ( int i = 0 ; menuOptions[currentMenuNr][i] != "" ; ++i, pos += 25 ) | 1041 | for ( int i = 0 ; menuOptions[currentMenuNr][i] != "" ; ++i, pos += 25 ) |
@@ -961,2 +1080,7 @@ void SFCave :: dealWithMenuSelection() | |||
961 | 1080 | ||
1081 | case MENU_REPLAY: | ||
1082 | currentMenuNr = MENU_REPLAY_MENU; | ||
1083 | currentMenuOption[currentMenuNr] = 0; | ||
1084 | break; | ||
1085 | |||
962 | case MENU_OPTIONS: | 1086 | case MENU_OPTIONS: |
@@ -1012,94 +1136,29 @@ void SFCave :: dealWithMenuSelection() | |||
1012 | } | 1136 | } |
1013 | } | ||
1014 | } | ||
1015 | |||
1016 | void SFCave :: saveScore() | ||
1017 | { | ||
1018 | #ifdef QWS | ||
1019 | Config cfg( "sfcave" ); | ||
1020 | cfg.setGroup( "settings" ); | ||
1021 | QString key = "highScore_"; | ||
1022 | |||
1023 | cfg.writeEntry( key + gameTypes[currentGameType] + "_" + dificultyOption[currentGameDifficulty], highestScore[currentGameType][currentGameDifficulty] ); | ||
1024 | key += CURRENT_GAME_TYPE; | ||
1025 | cfg.writeEntry( key, highestScore[currentGameType] ); | ||
1026 | #endif | ||
1027 | } | ||
1028 | 1137 | ||
1029 | void SFCave :: saveReplay() | 1138 | case MENU_REPLAY_MENU: |
1030 | { | ||
1031 | FILE *out; | ||
1032 | out = fopen( (const char *)replayFile, "w" ); | ||
1033 | if ( !out ) | ||
1034 | { | 1139 | { |
1035 | printf( "Couldn't write to /home/root/sfcave.replay\n" ); | 1140 | switch( currentMenuOption[currentMenuNr] ) |
1036 | return; | ||
1037 | } | ||
1038 | |||
1039 | // Build up string of values | ||
1040 | // Format is:: <landscape seed> <framenr> <framenr>....... | ||
1041 | QString val; | ||
1042 | val.sprintf( "%d ", currentSeed ); | ||
1043 | |||
1044 | QListIterator<int> it( replayList ); | ||
1045 | while( it.current() ) | ||
1046 | { | 1141 | { |
1047 | QString tmp; | 1142 | case MENU_REPLAY_START: |
1048 | tmp.sprintf( "%d ", (*it.current()) ); | 1143 | if ( currentSeed != 0 ) |
1049 | val += tmp; | 1144 | state = STATE_REPLAY; |
1050 | 1145 | // Display No Replay | |
1051 | ++it; | 1146 | break; |
1052 | } | ||
1053 | val += "\n"; | ||
1054 | 1147 | ||
1055 | QString line; | 1148 | case MENU_REPLAY_LOAD: |
1056 | line.sprintf( "%d\n", val.length() ); | 1149 | loadReplay(); |
1057 | fwrite( (const char *)line, 1, line.length(), out ); | 1150 | break; |
1058 | fwrite( (const char *)val, 1, val.length(), out ); | ||
1059 | 1151 | ||
1060 | fclose( out ); | 1152 | case MENU_REPLAY_SAVE: |
1153 | saveReplay(); | ||
1154 | break; | ||
1061 | 1155 | ||
1062 | printf( "Replay saved to %s\n", (const char *)replayFile ); | 1156 | case MENU_REPLAY_BACK: |
1157 | currentMenuNr = MENU_MAIN_MENU; | ||
1158 | break; | ||
1063 | 1159 | ||
1064 | } | 1160 | } |
1065 | |||
1066 | void SFCave :: loadReplay() | ||
1067 | { | ||
1068 | FILE *in = fopen( (const char *)replayFile, "r" ); | ||
1069 | |||
1070 | if ( in == 0 ) | ||
1071 | { | ||
1072 | printf( "Couldn't load replay file!\n" ); | ||
1073 | return; | ||
1074 | } | 1161 | } |
1075 | // Read size of next line | ||
1076 | char line[10+1]; | ||
1077 | fgets( line, 10, in ); | ||
1078 | |||
1079 | int length = -1; | ||
1080 | sscanf( line, "%d", &length ); | ||
1081 | char *data = new char[length+1]; | ||
1082 | |||
1083 | fread( data, 1, length, in ); | ||
1084 | |||
1085 | QString sep = " "; | ||
1086 | QStringList list = QStringList::split( sep, QString( data ) ); | ||
1087 | |||
1088 | // print it out | ||
1089 | QStringList::Iterator it = list.begin(); | ||
1090 | currentSeed = (*it).toInt(); | ||
1091 | ++it; | ||
1092 | |||
1093 | replayList.clear(); | ||
1094 | for ( ; it != list.end(); ++it ) | ||
1095 | { | ||
1096 | int v = (*it).toInt(); | ||
1097 | replayList.append( new int( v ) ); | ||
1098 | } | 1162 | } |
1099 | |||
1100 | delete data; | ||
1101 | |||
1102 | fclose( in ); | ||
1103 | |||
1104 | printf( "Replay loaded from %s\n", (const char *)replayFile ); | ||
1105 | } \ No newline at end of file | 1163 | } \ No newline at end of file |
1164 | |||
diff --git a/noncore/games/sfcave/sfcave.h b/noncore/games/sfcave/sfcave.h index 238a615..65e5ae4 100644 --- a/noncore/games/sfcave/sfcave.h +++ b/noncore/games/sfcave/sfcave.h | |||
@@ -14,3 +14,4 @@ | |||
14 | 14 | ||
15 | 15 | #define NR_MENUS 3 | |
16 | #define MAX_MENU_OPTIONS 8 | ||
16 | 17 | ||
@@ -55,6 +56,6 @@ public: | |||
55 | 56 | ||
56 | static QString menuOptions[2][5]; | 57 | static QString menuOptions[NR_MENUS][MAX_MENU_OPTIONS]; |
57 | int currentMenuNr; | 58 | int currentMenuNr; |
58 | static int nrMenuOptions[2]; | 59 | static int nrMenuOptions[NR_MENUS]; |
59 | static int currentMenuOption[2]; | 60 | static int currentMenuOption[NR_MENUS]; |
60 | 61 | ||
@@ -109,2 +110,3 @@ public: | |||
109 | 110 | ||
111 | void handleMenuKeys( QKeyEvent * e ); | ||
110 | void displayMenu(); | 112 | void displayMenu(); |