void CK6_GrabbiterCol(CK_object *a, CK_object *b) { if (!ck_gameState.ep.ck6.sandwich) { CA_CacheGrChunk(0x23); SD_PlaySound(SOUND_GRABBITER); US_CenterWindow(26, 8); VH_DrawBitmap(US_GetWindowX() + US_GetWindowW() - 0x30, US_GetWindowY(), 0x23); US_SetWindowW(US_GetWindowW() - 0x30); US_SetPrintY(US_GetPrintY() + 5); US_CPrint("Oh no!\n" "It's a slavering\n" "Grabbiter! He says,\n" "\"Get me lunch and\n" "I'll tell ya a secret!\""); VL_Present(); VL_DelayTics(30); // VW_WaitVBL(30); IN_ClearKeysDown(); IN_WaitButton(); RF_ForceRefresh(); ck_nextX = -b->deltaPosX; ck_nextY = -b->deltaPosY; b->xDirection = b->yDirection = IN_motion_None; CK_PhysUpdateNormalObj(b); } else { ck_gameState.ep.ck6.sandwich++; CA_CacheGrChunk(0x23); US_CenterWindow(26, 8); VH_DrawBitmap(US_GetWindowX() + US_GetWindowW() - 0x30, US_GetWindowY(), 0x23); US_SetWindowW(US_GetWindowW() - 0x30); US_SetPrintY(US_GetPrintY() + 2); US_CPrint("The Grabbiter grabs\n" "the gigantic sandwich,\n" "downs it in one bite,\n" "and says,\"Here's your\n" "secret. Big meals\n" "make me sleepy!\n"); VL_Present(); VL_DelayTics(30); // VW_WaitVBL(30); IN_ClearKeysDown(); IN_WaitButton(); CK_SetAction2(a, CK_GetActionByName("CK6_ACT_GrabbiterNapping0")); RF_ForceRefresh(); } }
void CK6_MapCliffCol(CK_object *a, CK_object *b) { if (b->type == CT_Player) { if (ck_gameState.ep.ck6.rope == 0) { CA_CacheGrChunk(0x23); US_CenterWindow(26, 8); VH_DrawBitmap(US_GetWindowX() + US_GetWindowW() - 0x30, US_GetWindowY(), 0x23); US_SetWindowW(US_GetWindowW() - 0x30); US_SetPrintY(US_GetPrintY() + 15); US_CPrint("What a tall cliff!\n" "Wish I had a rope\n" "and grappling hook.\n"); VL_Present(); SD_PlaySound(SOUND_NEEDKEYCARD); VL_DelayTics(30); // VW_WaitVBL(30); IN_ClearKeysDown(); IN_WaitButton(); RF_ForceRefresh(); ck_nextX = -b->deltaPosX; ck_nextY = -b->deltaPosY; b->xDirection = b->yDirection = IN_motion_None; CK_PhysUpdateNormalObj(b); } else if (ck_gameState.ep.ck6.rope == 1) { ck_gameState.ep.ck6.rope++; SD_PlaySound(SOUND_KEENTHROWROPE); CK_SetAction2(b, CK_GetActionByName("CK6_ACT_MapKeenThrowRope0")); b->type = CT_Friendly; } else if (ck_gameState.ep.ck6.rope == 2) { if (a->user1) { b->posY += 0x40; b->user4 = 6; b->yDirection = IN_motion_Down; } else { b->posY -= 0x40; b->user4 = 6; b->yDirection = IN_motion_Up; } CK_SetAction(b, CK_GetActionByName("CK6_ACT_MapKeenClimbRope0")); b->type = CT_Friendly; } } }
void CK6_RocketCol(CK_object *a, CK_object *b) { if (ck_gameState.ep.ck6.passcard == 0) { CA_CacheGrChunk(0x23); US_CenterWindow(26, 8); VH_DrawBitmap(US_GetWindowX() + US_GetWindowW() - 0x30, US_GetWindowY(), 0x23); US_SetWindowW(US_GetWindowW() - 0x30); US_SetPrintY(US_GetPrintY() + 5); US_CPrint("The door makes a loud\n" "blooping noise.\n" "It says,\n" "\"Passcard required\n" "for entry.\""); VL_Present(); SD_PlaySound(SOUND_NEEDKEYCARD); VL_DelayTics(30); // VW_WaitVBL(30); IN_ClearKeysDown(); IN_WaitButton(); RF_ForceRefresh(); ck_nextX = -b->deltaPosX; ck_nextY = -b->deltaPosY; b->xDirection = b->yDirection = IN_motion_None; CK_PhysUpdateNormalObj(b); } else if (ck_gameState.ep.ck6.passcard == 1) { a->user1 = 0; a->user2 = 0x100; CK_SetAction2(a, CK_GetActionByName("CK6_ACT_RocketFly0")); b->posX = a->posX; b->posY = a->posY + 0x100; b->clipped = CLIP_not; CK_SetAction2(b, CK_GetActionByName("CK6_ACT_MapKeenRocketSit0")); SD_PlaySound(SOUND_ROCKETLAUNCH); SD_WaitSoundDone(); } }
void CK6_ShowGetRope() { SD_WaitSoundDone(); SD_PlaySound(SOUND_STORYITEM); CA_UpLevel(); CA_CacheGrChunk(0x23); US_CenterWindow(26, 8); VH_DrawBitmap(US_GetWindowX() + US_GetWindowW() - 0x30, US_GetWindowY(), 0x23); US_SetWindowW(US_GetWindowW() - 0x30); US_SetPrintY(US_GetPrintY() + 12); US_CPrint("Wow! A rope and\n" "grappling hook!\n" "They look useful!\n"); VL_Present(); VL_DelayTics(30); // VW_WaitVBL(30); IN_ClearKeysDown(); IN_WaitButton(); CA_DownLevel(); ck_gameState.ep.ck6.rope = true; }
void CK6_ShowGetSandwich() { SD_WaitSoundDone(); SD_PlaySound(SOUND_STORYITEM); CA_UpLevel(); CA_CacheGrChunk(0x23); US_CenterWindow(26, 8); VH_DrawBitmap(US_GetWindowX() + US_GetWindowW() - 0x30, US_GetWindowY(), 0x23); US_SetWindowW(US_GetWindowW() - 0x30); US_SetPrintY(US_GetPrintY() + 12); US_CPrint("This is the second\n" "biggest sandwich\n" "I ever saw!\n"); VL_Present(); VL_DelayTics(30); // VW_WaitVBL(30); IN_ClearKeysDown(); IN_WaitButton(); CA_DownLevel(); ck_gameState.ep.ck6.sandwich = true; }
void CK6_ShowGetPasscard() { SD_WaitSoundDone(); SD_PlaySound(SOUND_STORYITEM); CA_UpLevel(); CA_CacheGrChunk(0x23); US_CenterWindow(26, 8); VH_DrawBitmap(US_GetWindowX() + US_GetWindowW() - 0x30, US_GetWindowY(), 0x23); US_SetWindowW(US_GetWindowW() - 0x30); US_SetPrintY(US_GetPrintY() + 4); US_CPrint("What's this? Cool!\n" "A passcard for\n" "the Bloogstar Rocket!\n" "(It can fly though\n" "their force field.)"); VL_Present(); VL_DelayTics(30); // VW_WaitVBL(30); IN_ClearKeysDown(); IN_WaitButton(); CA_DownLevel(); ck_gameState.ep.ck6.passcard = true; }
void CK_InitGame() { // Can't do much without memory! MM_Startup(); //TODO: Get filenames/etc from config/episode // Load the core datafiles CA_Startup(); // Setup saved games handling US_Setup(); // Set a few Menu Callbacks // TODO: Finish this! US_SetMenuFunctionPointers(&CK_LoadGame, &CK_SaveGame, &CK_ExitMenu); // Set ID engine Callbacks ca_beginCacheBox = CK_BeginCacheBox; ca_updateCacheBox = CK_UpdateCacheBox; ca_finishCacheBox = CK_FinishCacheBox; // Mark some chunks we'll need. CA_ClearMarks(); CA_MarkGrChunk(FON_MAINFONT); CA_MarkGrChunk(ca_gfxInfoE.offTiles8); CA_MarkGrChunk(ca_gfxInfoE.offTiles8m); CA_MarkGrChunk(MPIC_STATUSLEFT); CA_MarkGrChunk(MPIC_STATUSRIGHT); CA_MarkGrChunk(PIC_TITLESCREEN); // Moved from CA_Startup CA_CacheMarks(0); // Lock them chunks in memory. CA_LockGrChunk(FON_MAINFONT); MM_SetLock(&ca_graphChunks[ca_gfxInfoE.offTiles8], true); MM_SetLock(&ca_graphChunks[ca_gfxInfoE.offTiles8m], true); MM_SetLock(&ca_graphChunks[MPIC_STATUSLEFT], true); MM_SetLock(&ca_graphChunks[MPIC_STATUSRIGHT], true); // Compile the actions CK_ACT_SetupFunctions(); CK_KeenSetupFunctions(); CK_OBJ_SetupFunctions(); CK_Map_SetupFunctions(); CK_Misc_SetupFunctions(); ck_currentEpisode->setupFunctions(); CK_ACT_LoadActions("ACTION.EXT"); // Setup the screen VL_InitScreen(); // TODO: Palette initialization should be done in the terminator code VL_SetDefaultPalette(); // Setup input IN_Startup(); // Setup audio SD_Startup(); US_Startup(); // Wolf loads fonts here, but we do it in CA_Startup()? RF_Startup(); VL_ColorBorder(3); VL_ClearScreen(0); VL_Present(); // Create a surface for the dropdown menu ck_statusSurface = VL_CreateSurface(STATUS_W+64, STATUS_H+16); }
bool US_LineInput(uint16_t x, uint16_t y, char *buf, char *def, bool escok, uint16_t maxchars, uint16_t maxwidth) { bool redraw, cursorvis, cursormoved, done, result; IN_ScanCode sc; char c, s[128], olds[128]; uint16_t i, cursor, w, h, len/*, temp*/; uint32_t lasttime; if (def) strcpy(s, def); else *s = '\0'; *olds = '\0'; cursor = strlen(s); cursormoved = redraw = true; cursorvis = done = false; lasttime = SD_GetTimeCount(); IN_SetLastASCII(IN_KP_None); IN_SetLastScan(IN_SC_None); while (!done) { // TODO/FIXME: Handle this in a possibly better way // (no busy loop, updating gfx if required, etc..) IN_PumpEvents(); //CK_SetTicsPerFrame(); if (cursorvis) USL_XORICursor(x, y, s, cursor); sc = IN_GetLastScan(); IN_SetLastScan(IN_SC_None); c = IN_GetLastASCII(); IN_SetLastASCII(IN_KP_None); switch (sc) { case IN_SC_LeftArrow: if (cursor) cursor--; c = 0; cursormoved = true; break; case IN_SC_RightArrow: if (s[cursor]) cursor++; c = 0; cursormoved = true; break; case IN_SC_Home: cursor = 0; c = 0; cursormoved = true; break; case IN_SC_End: cursor = strlen(s); c = 0; cursormoved = true; break; case IN_SC_Enter: strcpy(buf, s); done = true; result = true; c = 0; break; case IN_SC_Escape: if (escok) { done = true; result = false; } c = 0; break; case IN_SC_Backspace: if (cursor) { strcpy(s + cursor - 1, s + cursor); cursor--; redraw = true; } c = 0; cursormoved = true; break; case IN_SC_Delete: if (s[cursor]) { strcpy(s + cursor, s + cursor + 1); redraw = true; } c = 0; cursormoved = true; break; case 0x4c: // Keypad 5 case IN_SC_UpArrow: case IN_SC_DownArrow: case IN_SC_PgUp: case IN_SC_PgDown: case IN_SC_Insert: c = 0; break; } if (c) { len = strlen(s); VH_MeasurePropString(s, &w, &h, US_GetPrintFont()); if ( isprint(c) && (len < 128 - 1) && ((!maxchars) || (len < maxchars)) && ((!maxwidth) || (w < maxwidth)) ) { for (i = len + 1; i > cursor; i--) s[i] = s[i - 1]; s[cursor++] = c; redraw = true; } } if (redraw) { /* px = x; py = y; */ //temp = us_printColour; //us_printColour = us_backColour; VH_DrawPropString(olds, x, y, us_printFont, us_printColour); //us_printColour = temp; strcpy(olds, s); /* px = x; py = y; */ VH_DrawPropString(s, x, y, us_printFont, us_printColour); redraw = false; } if (cursormoved) { cursorvis = false; lasttime = SD_GetTimeCount() - 70 /*TimeCount - TickBase*/; cursormoved = false; } if (SD_GetTimeCount()-lasttime > 35 /*TimeCount - lasttime > TickBase / 2*/) { lasttime = SD_GetTimeCount();//TimeCount; cursorvis ^= true; } if (cursorvis) USL_XORICursor(x, y, s, cursor); //VW_UpdateScreen(); VL_Present(); } if (cursorvis) USL_XORICursor(x, y, s, cursor); if (!result) { /* px = x; py = y; */ VH_DrawPropString(olds, x, y, us_printFont, us_printColour); } //VW_UpdateScreen(); VL_Present(); IN_ClearKeysDown(); return (result); }