/* * "ESCMENU.C" * * Part of The Escotia Playstation Library * * Author: ScoTT Campbell * Date: 19/10/98 * */ #include "..\headers\escmenu.h" #define NULL_MENU_ITEM ((void*) 0) static int EsSortSubMenu(menu_type subMenu, int x, int y, int isCurrent, GsOT* ot, unsigned int pri); /* Local function used by EsSortMenu since sub-menus are displayed differently */ int UpdateMenu(menu_type menu, unsigned long int pad) { if(pad & PAD1_UP) StepCurrentBackward(menu); if(pad & PAD1_DOWN) StepCurrentForward(menu); if(pad & PAD1_RIGHT) { if( !IsNullMenu(menu->menuArray[menu->current].subMenu) ) StepCurrentForward(GetSubMenu(&menu->menuArray[menu->current])); } if(pad & PAD1_LEFT) { if( !IsNullMenu(menu->menuArray[menu->current].subMenu) ) StepCurrentBackward(GetSubMenu(&menu->menuArray[menu->current])); } if(pad & PAD1_CROSS) { if( !IsNullMenu(menu->menuArray[menu->current].subMenu) ) StepCurrentForward(GetSubMenu(&menu->menuArray[menu->current])); else return menu->current; } return menu->size; }/* UpdateMenu */ menu_type CreateMenu(unsigned char size, int x, int y, int spacing) { int i; menu_type newMenu; if( !(newMenu = (menu_type) malloc(sizeof(menu_header))) ) return NULL_MENU; newMenu->x = x; newMenu->y = y; newMenu->spacing = spacing; newMenu->current = 0; if( !(newMenu->menuArray = (menu_item*) calloc(size, sizeof(menu_item))) ) { free(newMenu); return NULL_MENU; } for(i=0; imenuArray[i].subMenu = NULL_MENU; newMenu->size = size; return newMenu; }/* CreateMenu */ int IsNullMenu(menu_type menu) { if(menu == NULL_MENU) return 1; return 0; }/* IsNullMenu */ menu_type GetSubMenu(menu_item* menuItem) { if( (menuItem == NULL_MENU_ITEM) || (menuItem->subMenu == NULL_MENU) ) return NULL_MENU; return menuItem->subMenu; }/* GetSubMenu */ int AddSubMenu(menu_type menu, menu_type subMenu, unsigned int position) { if( (menu == NULL_MENU) || (subMenu == NULL_MENU) ) return 1; if(position > menu->size) return 1; menu->menuArray[position].subMenu = subMenu; return 0; } int AddSpriteToMenuItem(menu_item* menuItem, GsSPRITE* sprite) { if( (menuItem == NULL_MENU_ITEM) || (sprite == NULL) ) return 1; CopySprite(sprite, &menuItem->itemSprite); return 0; }/* AddSpriteToMenuItem */ int AddSpriteToMenu(menu_type menu, unsigned char position, GsSPRITE* sprite) { if( (menu == NULL_MENU) || (sprite == NULL) ) return 1; CopySprite(sprite, &menu->menuArray[position].itemSprite); return 0; }/* AddSpriteToMenuItem */ int DestroyMenu(menu_type menu) { if(menu == NULL_MENU) return 1; if(menu->menuArray == NULL_MENU_ITEM) free(menu); else { free(menu->menuArray); free(menu); } return 0; }/* DestroyMenu */ menu_item* GetCurrentMenuItem(menu_type menu) { return &menu->menuArray[menu->current]; }/* GetCurrentMenuItem */ void StepCurrentForward(menu_type menu) { menu->current++; if( (menu->current) > (menu->size-1) ) menu->current = 0; }/* StepCurrentForward */ void StepCurrentBackward(menu_type menu) { if(menu->current == 0) menu->current = menu->size - 1; else menu->current--; }/* StepCurrentBackwards */ void SetMenuPosition(menu_type menu, int x, int y) { menu->x = x; menu->y = y; }/* SetMenuPosition */ void SetMenuSpacing(menu_type menu, unsigned int space) { menu->spacing = space; }/* SetMenuSpacing */ int EsSortMenu(menu_type menu, GsOT* ot, unsigned int pri) { int i; int currentX = menu->x; int currentY = menu->y; if( (menu == NULL_MENU) || (ot == NULL) ) return 1; if( (menu->size == 0) || (menu->menuArray == NULL_MENU_ITEM) ) return 1; for(i=0; isize; i++) { SetSpritePosition(&menu->menuArray[i].itemSprite, currentX, currentY); if(i == menu->current) SetSpriteColour(&menu->menuArray[i].itemSprite, 200, 200, 200); else SetSpriteColour(&menu->menuArray[i].itemSprite, 50, 50, 50); GsSortSprite(&menu->menuArray[i].itemSprite, ot, pri); if(menu->menuArray[i].subMenu != NULL_MENU) { currentX += menu->menuArray[i].itemSprite.w; if(i == menu->current) EsSortSubMenu(menu->menuArray[i].subMenu, currentX, currentY, 1, ot ,pri); else EsSortSubMenu(menu->menuArray[i].subMenu, currentX, currentY, 0, ot ,pri); } currentX = menu->x; currentY += menu->spacing; } return 0; }/* EsSortMenu */ static int EsSortSubMenu(menu_type subMenu, int x, int y, int isCurrent, GsOT* ot, unsigned int pri) { x += subMenu->x; y += subMenu->y; if( (subMenu == NULL_MENU) || (ot == NULL) ) return 1; if( (subMenu->size == 0) || (subMenu->menuArray == NULL_MENU_ITEM) ) return 1; SetSpritePosition(&subMenu->menuArray[subMenu->current].itemSprite, x, y); if(isCurrent) SetSpriteColour(&subMenu->menuArray[subMenu->current].itemSprite, 200, 200, 200); else SetSpriteColour(&subMenu->menuArray[subMenu->current].itemSprite, 50, 50, 50); GsSortSprite(&subMenu->menuArray[subMenu->current].itemSprite, ot, pri); if(subMenu->menuArray[subMenu->current].subMenu != NULL_MENU) { x += subMenu->menuArray[subMenu->current].itemSprite.w; if(isCurrent) EsSortSubMenu(subMenu->menuArray[subMenu->current].subMenu, x, y, 1, ot ,pri); else EsSortSubMenu(subMenu->menuArray[subMenu->current].subMenu, x, y, 0, ot ,pri); } return 0; }