Skip to content
Permalink
master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
 
 
Cannot retrieve contributors at this time
#include <ncurses.h>
#include <string>
#include <vector>
#include "menu.h"
using namespace std;
bool muted = false;
/*
function for detecting key presses thanks to:
https://stackoverflow.com/questions/4025891/create-a-function-to-check-for-key-press-in-unix-using-ncurses
*/
int kbhit() {
int ch = getch();
if (ch != ERR) {
ungetch(ch);
return 1;
} else {
return 0;
}
}
bool isMuted(){
return muted;
}
void toggleMute() {
muted = !muted;
}
int showMainMenu() {
//get screen size
int yMax, xMax;
getmaxyx(stdscr, yMax, xMax);
bool ScreenTooSmall = xMax < 120;
mvprintw(yMax-1, 0,"Created by: Mazin, Luke, Ben, Paula, Kelvin, Tudor, Adrian, Konrad");
//preparing colours that'll be used
init_pair(1, COLOR_WHITE, COLOR_WHITE);
init_pair(2, COLOR_BLACK, COLOR_BLACK);
init_pair(4, COLOR_MAGENTA, COLOR_MAGENTA);
/*
**********************************************
Logo window
**********************************************
*/
drawLogo(xMax);
/*
**********************************************
Choices
Based on tutorial by Casual Coder:
https://www.youtube.com/watch?v=3YiPdibiQHA&index=8&list=PL2U2TQ__OrQ8jTf0_noNKtHMuYlyxQl4v
**********************************************
*/
//create window for choices
WINDOW * choicesWin = newwin(10, 10, 35, (xMax-10)/2);
refresh();
wrefresh(choicesWin);
//can use arrow keys
keypad(choicesWin, true);
string choices[3] = {"Start", "Options", "Leave"};
int choice, highlight = 0,
mid = (((xMax-96)/2-1)-19)/2+1, mid2 = xMax-mid-19, //mid and mid2 = middle position
counter = 0, counter2 = yMax - 17, time = 0; //for moving cocktails
WINDOW * pic = newwin(16, 19, 0, mid); // cocktail 1 window
WINDOW * pic2 = newwin(16, 19, yMax-17, mid2); //cocktail 2 window
//Skip coctails if screen too small
if(!ScreenTooSmall){
drawCocktails(xMax, yMax, mid, mid2, pic, pic2);
}
/*
**********************************************
Handling input and moving coctails
**********************************************
*/
move(0,0);
while(1)
{
/*
*********************************************
Part based, again, on Casual Coder's tutorial
*/
//Printing list of choices, already highlighted
for(int i=0; i < 3; i++)
{
if(i == highlight)
{
wattron(choicesWin, A_REVERSE);
}
mvwprintw(choicesWin, i+1, (10 - choices[i].length())/2+1, choices[i].c_str());
wattroff(choicesWin, A_REVERSE);
//*******************************************
}
wrefresh(choicesWin);
if(ScreenTooSmall== false)
{
//moving coctails
while(!kbhit())
{
if(counter == yMax-17)
{
//hide last left-coctail on screen
WINDOW * hide = newwin(16, 19, yMax-17, mid);
wbkgd(hide, COLOR_PAIR(2));
wrefresh(hide);
//hide last right-coctail on screen
WINDOW * hide2 = newwin(16, 19, 0, mid2);
wbkgd(hide2, COLOR_PAIR(2));
wrefresh(hide2);
counter = 0;
counter2 = yMax-17;
}
if(time > 40000)
{
time = 0;
counter++;
counter2--;
mvwin(pic2, counter2, mid2);
wrefresh(pic2);
mvwin(pic, counter, mid);
wrefresh(pic);
}
time++;
}
}
//if key pressed, record it and save to choice
if(kbhit()){
choice = int(wgetch(choicesWin));
}
/*
*********************************************
Part based, again, on Casual Coder's tutorial
*/
//65 key_up, 66 key_down
switch(choice)
{
case 65:
highlight--;
if(highlight == -1)
highlight = 0;
break;
case 66:
highlight++;
if(highlight == 3)
highlight = 2;
break;
default:
break;
}
//when 'enter' pressed
if(choice==10)
{
//exit
if(highlight==2)
{
clear();
refresh();
endwin();
exit(0);
return 0;
}
//options
if(highlight == 1)
{
clear();
refresh();
showOptionsScreen(yMax, xMax, false);
}
if(highlight == 2){
endwin();
return 0;
}
}
}
//if 'Exit' chosen
if(highlight == 2)
{
endwin();
return 0;
}
printw("Your choice was: %s", choices[highlight].c_str());
//*********************************************
}
int showOptionsScreen(int yMax, int xMax, bool isPauseMenu){
//create window for choices
WINDOW * optionsWin = newwin(16, 16, (yMax-4)/2, (xMax-16)/2);
refresh();
wrefresh(optionsWin);
vector<string> choices;
int highlightIndex = 0, mute = isPauseMenu ? 2 : 0; //inline boolean
if(isPauseMenu){
choices.push_back("Return to Game");
choices.push_back("Save");
choices.push_back("Music: ON");
choices.push_back("Quit to Menu");
//choices = {"Return to Game", "Save", "Music: ON", "Quit to Menu"};
}else{
choices.push_back("Music: ON");
choices.push_back("Back");
//choices = {"Music: ON", "Back"};
}
while(1)
{
wclear(optionsWin);
if(isMuted()){
choices[mute] = "Music: OFF";
}else{
choices[mute] = "Music: ON";
}
for(int i=0; i < choices.size(); i++)
{
if(i == highlightIndex)
{
wattron(optionsWin, A_REVERSE);
}
mvwprintw(optionsWin, i+1, (16 - choices[i].length())/2+1, choices[i].c_str());
wattroff(optionsWin, A_REVERSE);
}
wrefresh(optionsWin);
int buttonHit = int(wgetch(optionsWin));
switch(buttonHit)
{
case UP_KEY:
highlightIndex--;
if(highlightIndex == -1){
highlightIndex = 0;
}
break;
case DOWN_KEY:
highlightIndex++;
if(highlightIndex == choices.size()){
highlightIndex--;
}
break;
case ENTER_KEY:
if(highlightIndex == choices.size()-1)
{
clear();
refresh();
endwin();
showMainMenu();
return 0;
}
else if(highlightIndex == mute)
{
toggleMute();
}
else if(choices.size() == 4 && highlightIndex == 0) // return to game
{
printw("%s", choices[highlightIndex].c_str());
move(0,0);
refresh();
}
else if(choices.size() == 4 && highlightIndex == 1) // save
{
printw("%s", choices[highlightIndex].c_str());
move(0,0);
refresh();
}
break;
default:
break;
}
}
return 0;
}
void drawCocktails(int xMax, int yMax, int mid, int mid2, WINDOW* pic, WINDOW* pic2) {
/*
**********************************************
Creating left-cocktail
**********************************************
*/
//turn getch() into a non-blocking call
nodelay(stdscr, true);
scrollok(stdscr, true);
refresh();
init_pair(3, COLOR_WHITE, COLOR_WHITE);
init_pair(4, COLOR_MAGENTA, COLOR_MAGENTA);
wattron(pic, COLOR_PAIR(4));
mvwprintw(pic, 1, 14, " ");
mvwprintw(pic, 2, 13, " ");
wattroff(pic, COLOR_PAIR(4));
wattron(pic, COLOR_PAIR(3));
mvwprintw(pic, 3, 14, " ");
mvwprintw(pic, 4, 13, " ");
mvwprintw(pic, 5, 0, " ");
mvwprintw(pic, 6, 2, " ");
mvwprintw(pic, 7, 4, " ");
mvwprintw(pic, 8, 6, " ");
mvwprintw(pic, 9, 8, " ");
mvwprintw(pic, 10, 9, " ");
mvwprintw(pic, 11, 9, " ");
mvwprintw(pic, 12, 9, " ");
mvwprintw(pic, 13, 9, " ");
mvwprintw(pic, 14, 6, " ");
wattroff(pic, COLOR_PAIR(3));
wrefresh(pic);
/*
**********************************************
Creating right-cocktail
**********************************************
*/
//create window for glass pic
//box(pic2, 0, 0);
refresh();
init_pair(3, COLOR_WHITE, COLOR_WHITE);
init_pair(4, COLOR_MAGENTA, COLOR_MAGENTA);
wattron(pic2, COLOR_PAIR(4));
mvwprintw(pic2, 1, 14, " ");
mvwprintw(pic2, 2, 13, " ");
wattroff(pic2, COLOR_PAIR(4));
wattron(pic2, COLOR_PAIR(3));
mvwprintw(pic2, 3, 14, " ");
mvwprintw(pic2, 4, 13, " ");
mvwprintw(pic2, 5, 0, " ");
mvwprintw(pic2, 6, 2, " ");
mvwprintw(pic2, 7, 4, " ");
mvwprintw(pic2, 8, 6, " ");
mvwprintw(pic2, 9, 8, " ");
mvwprintw(pic2, 10, 9, " ");
mvwprintw(pic2, 11, 9, " ");
mvwprintw(pic2, 12, 9, " ");
mvwprintw(pic2, 13, 9, " ");
mvwprintw(pic2, 14, 6, " ");
wattroff(pic2, COLOR_PAIR(3));
wrefresh(pic2);
}
void drawLogo(int xMax) {
//create window for logo
WINDOW * logo = newwin(32, 96, 2, (xMax-96)/2-1);
//box(logo, 0, 0);
refresh();
//set windows's background to white
wbkgd(logo, COLOR_PAIR(4));
wattron(logo, COLOR_PAIR(2));
//S
mvwprintw(logo, 3, 6, " ");
mvwprintw(logo, 4, 6, " ");
mvwprintw(logo, 5, 6, " ");
mvwprintw(logo, 9, 0, " ");
mvwprintw(logo, 10, 0, " ");
mvwprintw(logo, 11, 0, " ");
//space
for(int i=0;i<15;i++)
{
mvwprintw(logo, i, 12, " ");
}
//H
mvwprintw(logo, 0, 20, " ");
mvwprintw(logo, 1, 20, " ");
mvwprintw(logo, 2, 20, " ");
mvwprintw(logo, 3, 20, " ");
mvwprintw(logo, 4, 20, " ");
mvwprintw(logo, 5, 20, " ");
mvwprintw(logo, 9, 20, " ");
mvwprintw(logo, 10, 20, " ");
mvwprintw(logo, 11, 20, " ");
mvwprintw(logo, 12, 20, " ");
mvwprintw(logo, 13, 20, " ");
mvwprintw(logo, 14, 20, " ");
//space
for(int i=0;i<15;i++)
{
mvwprintw(logo, i, 32, " ");
}
//A
mvwprintw(logo, 3, 40, " ");
mvwprintw(logo, 4, 40, " ");
mvwprintw(logo, 5, 40, " ");
mvwprintw(logo, 9, 40, " ");
mvwprintw(logo, 10, 40, " ");
mvwprintw(logo, 11, 40, " ");
mvwprintw(logo, 12, 40, " ");
mvwprintw(logo, 13, 40, " ");
mvwprintw(logo, 14, 40, " ");
//space
for(int i=0;i<15;i++)
{
mvwprintw(logo, i, 52, " ");
}
//K
mvwprintw(logo, 0, 60, " ");
mvwprintw(logo, 1, 60, " ");
mvwprintw(logo, 2, 60, " ");
mvwprintw(logo, 3, 60, " ");
mvwprintw(logo, 4, 60, " ");
mvwprintw(logo, 5, 60, " ");
mvwprintw(logo, 9, 60, " ");
mvwprintw(logo, 10, 60, " ");
mvwprintw(logo, 11, 60, " ");
mvwprintw(logo, 12, 60, " ");
mvwprintw(logo, 13, 60, " ");
mvwprintw(logo, 14, 60, " ");
mvwprintw(logo, 6, 69, " ");
mvwprintw(logo, 7, 69, " ");
mvwprintw(logo, 8, 69, " ");
//space
for(int i=0;i<15;i++)
{
mvwprintw(logo, i, 72, " ");
}
//E
mvwprintw(logo, 3, 80, " ");
mvwprintw(logo, 4, 80, " ");
mvwprintw(logo, 5, 80, " ");
mvwprintw(logo, 9, 80, " ");
mvwprintw(logo, 10, 80, " ");
mvwprintw(logo, 11, 80, " ");
//space
for(int i=0;i<86;i++)
{
mvwprintw(logo, 15, i, " ");
mvwprintw(logo, 16, i, " ");
}
//I
for(int i=17;i<32;i++)
{
mvwprintw(logo, i, 0, " ");
mvwprintw(logo, i, 13, " ");
}
//T
for(int i=20;i<32;i++)
{
mvwprintw(logo, i, 15, " ");
mvwprintw(logo, i, 27, " ");
}
//space
for(int i=17;i<32;i++)
{
mvwprintw(logo, i, 33, " ");
}
//U
for(int i=17;i<29;i++)
{
mvwprintw(logo, i, 49, " ");
}
//space
for(int i=17;i<32;i++)
{
mvwprintw(logo, i, 61, " ");
}
//P
mvwprintw(logo, 20, 69, " ");
mvwprintw(logo, 21, 69, " ");
mvwprintw(logo, 22, 69, " ");
mvwprintw(logo, 26, 69, " ");
mvwprintw(logo, 27, 69, " ");
mvwprintw(logo, 28, 69, " ");
mvwprintw(logo, 29, 69, " ");
mvwprintw(logo, 30, 69, " ");
mvwprintw(logo, 31, 69, " ");
//space
for(int i=17;i<32;i++)
{
mvwprintw(logo, i, 81, " ");
}
//big space
for(int i=0;i<32;i++)
{
mvwprintw(logo, i, 86, " ");
}
//!
mvwprintw(logo, 28, 90, " ");
mvwprintw(logo, 27, 90, " ");
wattroff(logo, COLOR_PAIR(2));
wrefresh(logo);
}
int main()
{
//ncurses start
initscr();
//do not show user input
noecho();
//enables ctrl+c
cbreak();
//enables colors
start_color();
curs_set(0); //disable cursor
//check if colors are supported
if(!has_colors())
{
printw("Terminal does not support colors");
getch();
return -1;
}
showMainMenu();
endwin();
return 0;
}