diff --git a/src/hub/hub.c b/src/hub/hub.c index 6be11c8..a4d48b8 100644 --- a/src/hub/hub.c +++ b/src/hub/hub.c @@ -38,6 +38,9 @@ static void options(void); static void stats(void); static void trophies(void); static void quit(void); +static void doCursor(void); +static void doMissionSelect(void); +static void doMissionInfo(void); static HubMission hubMissionHead; static HubMission *hubMissionTail; @@ -61,11 +64,15 @@ void initHub(void) HubMission *mission, *teeka; Tuple *t; + startSectionTransition(); + memset(&hubMissionHead, 0, sizeof(HubMission)); hubMissionTail = &hubMissionHead; memset(&keySprites, 0, sizeof(Sprite*) * MAX_KEY_TYPES); + loadMusic("music/61321__mansardian__news-background.ogg"); + atlasTexture = getTexture("gfx/atlas/atlas.png"); worldMap = getImageFromAtlas("gfx/hub/worldMap.jpg"); alert = getImageFromAtlas("gfx/hub/alert.png"); @@ -161,47 +168,34 @@ void initHub(void) app.delegate.logic = &logic; app.delegate.draw = &draw; + + playMusic(1); + + endSectionTransition(); } static void logic(void) { - HubMission *m; - blipValue += 0.1; blipSize = 64 + (sin(blipValue) * 16); animateSprites(); + doCursor(); + if (selectedMission == NULL) { - if (app.keyboard[SDL_SCANCODE_ESCAPE]) - { - showWidgetGroup("hub"); - showingWidgets = 1; - } - else if (isControl(CONTROL_FIRE) || app.mouse.button[SDL_BUTTON_LEFT]) - { - m = getMissionAt(cursor.x, cursor.y); - - if (m != NULL) - { - selectedMission = m; - app.mouse.button[SDL_BUTTON_LEFT] = 0; - clearControl(CONTROL_FIRE); - - showWidgetGroup("mission"); - } - } + doMissionSelect(); } else { - if (app.keyboard[SDL_SCANCODE_ESCAPE]) - { - cancel(); - } + doMissionInfo(); } +} +static void doCursor(void) +{ if (app.mouse.dx != 0 || app.mouse.dy != 0) { cursor.x = app.mouse.x; @@ -229,6 +223,49 @@ static void logic(void) } } +static void doMissionSelect(void) +{ + HubMission *m; + + if (app.keyboard[SDL_SCANCODE_ESCAPE]) + { + showWidgetGroup("hub"); + showingWidgets = 1; + } + else if (isControl(CONTROL_FIRE) || app.mouse.button[SDL_BUTTON_LEFT]) + { + m = getMissionAt(cursor.x, cursor.y); + + if (m != NULL) + { + selectedMission = m; + app.mouse.button[SDL_BUTTON_LEFT] = 0; + clearControl(CONTROL_FIRE); + + showWidgetGroup("mission"); + } + } +} + +static void doMissionInfo(void) +{ + Widget *w; + + w = selectWidgetAt(cursor.x, cursor.y); + + if ((w != NULL) && (isControl(CONTROL_FIRE) || app.mouse.button[SDL_BUTTON_LEFT])) + { + w->action(); + app.mouse.button[SDL_BUTTON_LEFT] = 0; + clearControl(CONTROL_FIRE); + } + + if (app.keyboard[SDL_SCANCODE_ESCAPE]) + { + cancel(); + } +} + static void draw(void) { blitRectScaled(atlasTexture->texture, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, &worldMap->rect, 0); @@ -240,6 +277,8 @@ static void draw(void) if (selectedMission != NULL) { drawMissionInfo(); + + drawWidgets(); } blitRect(atlasTexture->texture, cursor.x, cursor.y, getCurrentFrame(cursorSpr), 1); @@ -265,6 +304,9 @@ static void drawMissions(void) blitRectScaled(atlasTexture->texture, mission->x, mission->y, blipSize, blipSize, &alert->rect, 1); drawText(mission->x, mission->y - 32, 18, TA_CENTER, colors.white, mission->name); break; + + default: + break; } } @@ -308,12 +350,14 @@ static void drawMissionInfo(void) drawText(x + 15, y + 100, 22, TA_LEFT, colors.white, selectedMission->description); limitTextWidth(0); - drawText(SCREEN_WIDTH / 2, y + h - 165, 24, TA_CENTER, colors.white, "Keys"); - size = 65; mid = size / 2; - y = (((SCREEN_HEIGHT - h) / 2) + h) - 100; + y = (((SCREEN_HEIGHT - h) / 2) + h) - 225; + + drawText(SCREEN_WIDTH / 2, y, 24, TA_CENTER, colors.white, "Keys"); + + y += 64; x = ((SCREEN_WIDTH - w) / 2) + 30; @@ -471,6 +515,8 @@ static void startMission(void) STRNCPY(game.worldId, selectedMission->id, MAX_NAME_LENGTH); saveGame(); + + stopMusic(); } static void cancel(void) diff --git a/src/hub/hub.h b/src/hub/hub.h index 46af99f..bde4edc 100644 --- a/src/hub/hub.h +++ b/src/hub/hub.h @@ -42,6 +42,13 @@ extern void saveGame(void); extern void hideAllWidgets(void); extern void showWidgetGroup(char *group); extern Widget *getWidget(char *name, char *group); +extern void drawWidgets(void); +extern Widget *selectWidgetAt(int x, int y); +extern void loadMusic(char *filename); +extern void playMusic(int loop); +extern void stopMusic(void); +extern void startSectionTransition(void); +extern void endSectionTransition(void); extern App app; extern Colors colors; diff --git a/src/structs.h b/src/structs.h index 6cf98aa..9181f1f 100644 --- a/src/structs.h +++ b/src/structs.h @@ -341,7 +341,6 @@ typedef struct { int winHeight; float scaleX; float scaleY; - int hideMouse; Mouse mouse; SDL_Joystick *joypad; int keyboard[MAX_KEYBOARD_KEYS]; diff --git a/src/system/widgets.c b/src/system/widgets.c index 4c328ac..07695f9 100644 --- a/src/system/widgets.c +++ b/src/system/widgets.c @@ -182,6 +182,33 @@ Widget *getWidget(char *name, char *group) return NULL; } +Widget *selectWidgetAt(int x, int y) +{ + Widget *w; + int i; + + for (i = 0 ; i < numWidgets ; i++) + { + w = &widgets[i]; + + if (w->visible && collision(w->x, w->y, w->w, w->h, x, y, 1, 1)) + { + if (w != selectedWidget) + { + playSound(SND_MENU_NAV, 0); + } + + widgetIndex = i; + selectedWidget = w; + return w; + } + } + + selectedWidget = NULL; + + return NULL; +} + void hideAllWidgets(void) { int i; diff --git a/src/system/widgets.h b/src/system/widgets.h index 7888400..430cce0 100644 --- a/src/system/widgets.h +++ b/src/system/widgets.h @@ -31,6 +31,7 @@ extern float limit(float i, float a, float b); extern void playSound(int snd, int ch); extern int isControl(int type); extern void clearControl(int type); +extern int collision(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2); extern App app; extern Colors colors;