import "std.zh" const int SUBSCREEN_TEST_MODE = 0; const int SUBSCREEN_DRAW_TEST = 1; //Global arrays int GRAM[214747]; int OwnsItems[256]; //Global array indices: const int EXITING_SUBSCREEN = 500; const int SUBSCREEN = 501; //THe subscreen pointer. //////////////////////////////////////// /// Scripted Subscreen Demonstration /// /// for ZC 2.54 - Beta 45 and Higher /// /// 28-Dec-2016 - By: ZoriaRPG /// //////////////////////////////////////// //Tile pages 114 to 117 //Global Arrays int ButtonItems[3]; //Merge into another, if desired. Function pointers will be useful for this. //ButtonItems[] array indices: const int BUTTONITEM_A = 0; const int BUTTONITEM_B = 1; const int BUTTONITEM_SUBSCREEN = 2; /* This determines of the subscreen is active, so that functions that change inventory (e.g. for warping) do not interfere with setting the item in the subscreen. */ //Generic Item to manipulate with itemdata const int I_GENERIC = 123; const int I_SUBSCREEN_BLANK = 124; //! Subscreen Settings //Base const int SUBSC_FFC_INDEX = 32; //The FFC ID that we reserve for the subscreen ffc. const int SUBSC_FFC_DATA = 882; //THe FFC Data for the Subscreen FFC. (Freeze all except FFCs). //Visual Effects & Fades const int SUBSC_FADE_IN = 0; //0 == None, 1 == ZAPIN, 2 == ZAPOUT, const int SUBSC_FADE_OUT = 0; const int SUBSC_PAN_SPEED = 4; //pixels per frame. MUST BE A POWER OF 2! //Sounds const int SUBSC_CURSOR_SFX = 6; //Cursor movement. const int SUBSC_SELECTED_SFX = 44; //Select an item. const int SUBSC_OPEN_SFX = 37; //Open the subscreen const int SUBSC_CLOSE_SFX = 46; //Close the subscreen. //General Settings const int SUBSC_MAX_ITEMS = 24; //How many ites are on the subscreen? const int SUBSC_NUM_ROWS = 4; const int SUBSC_NUM_COLUMNS = 6; const int SUBSC_LINK_INVISIBLE = 1; //Is Link invisible when the subscreen is active? const int SUBSC_LAST = 24; //Last item in the array. //Item Misc Flags const int MISC_SUBSC_OBJ = 18; const int IS_SUBSCREEN_OBJECT = 1; const int IS_INVENTORY_A = 2; const int IS_INVENTORY_B = 3; //Layout const int SUBSC_INITIAL_X = 118; //The starting X-position to draw items. const int SUBSC_INITIAL_Y = 20; //The starting Y-position to draw items. const int SUBSC_X_SPACING = 18; //Pixels between items const int SUBSC_Y_SPACING = 18; //Rows, Columns, Wrapping const int SUBSC_WRAP_ROW = 18; //Wrap from the bottom row to the top, or top to the bottom. const int SUBSC_WRAP_COLUMS = 6; //Wrap from the left to the right, or riht to the left column. const int SUBSC_ITEMS_PER_ROW = 6; const int SUBSC_ITEMS_PER_COLUMN = 4; //Pane IDs const int PANE_LEFT = 0; const int PANE_CENTRE = 1; const int PANE_RIGHT = 2; //Graphical Settings const int SUBSC_BG_LAYER = 7; const int SUBSC_OBJ_LAYER = 7; //Colours const int SUBSC_COLOUR_WHITE = 0x01; const int SUBSC_COLOUR_BLACK = 0x0F; //Bitmap Settings const int BG_IS_BITMAP = -1; const int RT_SUBSCREEN = 0; const int SUBSC_BITMAP_X = 0; const int SUBSC_BITMAP_WIDTH = 256; const int SUBSC_BITMAP_Y = 0; const int SUBSC_BITMAP_HEIGHT = 232; const int SUBSC_BITMAP_DRAW_TO_X = 0; const int SUBSC_BITMAP_DRAW_TO_Y = -56; const int SUBSC_BITMAP_DRAW_MODE = 0; //0 = Normal, Trans = 1 int GetPaneTile(int pane){ if ( pane == PANE_LEFT ) return SUBSC_TILE_LPANE; else if ( pane == PANE_RIGHT ) return SUBSC_TILE_RPANE; else return SUBSC_FIRST_TILE; } //Tiles const int SUBSC_TILE_BLANK = 5; const int SUBSC_TILE_LPANE = 30680; const int SUBSC_TILE_RPANE = 30680; const int SUBSC_FIRST_TILE = 29640; //Main central pane const int SUBSC_NUMBER_OF_TILES = 0; const int SUBSC_TILE_CSET = 11; const int SUBSC_TILE_INITIAL_X = 0; const int SUBSC_TILE_INITIAL_Y = -56; const int SUBSC_TILE_LAYER = 7; const int SUBSC_TILE_WIDTH = 20; const int SUBSC_TILE_HEIGHT = 16; const int SUBSC_TILE_XSCALE = -1; const int SUBSC_TILE_YSCALE = -1; const int SUBSC_TILE_RX = 0; const int SUBSC_TILE_RY = 0; const int SUBSC_TILE_RANGLE = 0; const int SUBSC_TILE_FLIP = 0; const int SUBSC_TILE_OPACITY = 128; //Cursor Item Appearance const int CURSOR_TILE = 20140; const int CURSOR_CSET = 6; const int CURSOR_AFRAMES = 15; const int CURSOR_ASPEED = 7; const int CURSOR_LAYER = 7; //Text const int SUBSC_TEXT_INV_FONT = 2; //z3 Small const int SUBSC_TEXT_INV_FONT_SIZE = 16; const int SUBSC_TEXT_Y_INVENTORY = -48; const int SUBSC_TEXT_X_KEYS1 = 8; const int SUBSC_TEXT_X_KEYS2 = 24; const int SUBSC_TEXT_X_KEYS3 = 40; const int SUBSC_TEXT_X_BOMBS = 96; const int SUBSC_TEXT_X_SBOMBS = 112; const int SUBSC_TEXT_X_ARROWS = 144; const int SUBSC_TEXT_X_LIFE = 160; const int SUBSC_TEXT_X_MAGIC = 192; const int SUBSC_TEXT_X_MONEY = 224; const int SUBSC_TEXT_LAYER = 7; const int SUBSC_TEXT_INV_FG_COLOUR = 0x01; const int SUBSC_TEXT_INV_BG_COLOUR = 0x0F; const int SUBSC_TEXT_BACKDROP = -1; const int SUBSC_TEXT_INV_OPACITY = 128; const int SUBSC_TEXT_INV_SHADOW_OFFSET = 1; //! Subscreen 'q[]' array indices: //Operating Conditions const int SUBSC_ACTIVE = 0; //Array index of GRAM[]: Is it active? //1 to 9 reserved for expansion. //Internal Variables const int SUBSC_SELECTED = 10; //THe selected item const int SUBSC_LAST_SELECTED = 11; //Holds the ID of the previous selected item. //We do not yet use this, but it could be used later. const int SUBSC_POSX = 12; //Holds the X value for where to draw the next object. const int SUBSC_POSY = 13; //Holds the Y value for where to draw the next object. //14 to 39 reserved for expansion. //Loops const int SUBSC_FOR_LOOP = 40; //The main for loop. Sets the current object ID. const int SUBSC_SLOTCHECK_LOOP = 41; //The loop used to check what items are in slots, and assign the initial cursor position. const int SUBSC_OBJDRAW_LOOP = 42; //The loop used to copy objects to a higher layer. const int SUBSC_CLEANUP_LOOP = 43; //The loop used to clean up everything. const int SUBSC_OBJ_PAN_DRAW_LOOP = 44; //Loop for drawing objects during the pan-in. const int SUBSC_EXIT_CLEANUP_LOOP = 45; //Loop for drawing objects during the pan-in. //Pane Info const int PANE_ID = 100; const int PANE_LEFT_DRAWN = 101; const int PANE_RIGHT_DRAWN = 103; const int PANE_CENTRE_DRAWN = 104; //Bitmap Panning registers const int PANE_CENTRE_X = 120; const int PANE_CENTRE_Y = 121; const int PANE_LEFT_X = 122; const int PANE_LEFT_Y = 123; const int PANE_RIGHT_X = 124; //These start at a value that draws offscreen, and reduces to 0 to pan into view. const int PANE_RIGHT_Y = 125; //(None of these are used at present. Reserved for background tiles, and objects.) const int SUBSC_TILE_BASE = 24; const int SUBSC_CSET_BASE = 48; const int SUBSC_FLASH_BASE = 48; const int SUBSC_AFRAMES_BASE = 48; const int SUBSC_ASPEED_BASE = 48; const int SUBSC_FRAME_BASE = 48; const int SUBSC_DELAY_BASE = 48; const int SUBSC_SCRIPT_BASE = 48; /* These bases were for using tiles instead of items, to place objects as the base index of an array containing datum on object tiles, csets, and so forth. */ const int ENABLEITEMS_PRT = 502; const int SFX_EQUIP = 35; const int SUBSC_EQUIP_A_X = 30; const int SUBSC_EQUIP_A_Y = 10; const int SUBSC_EQUIP_B_X = 50; const int SUBSC_EQUIP_B_Y = 10; void UpdateDrawnInventory(){ for ( int q = Screen->NumItems(); q > 0; q-- ) { item i = Screen->LoadItem(q); if ( i->Misc[MISC_SUBSC_OBJ] == IS_INVENTORY_A ) i->ID = GetEquipmentA(); if ( i->Misc[MISC_SUBSC_OBJ] == IS_INVENTORY_B ) i->ID = GetEquipmentB(); } } void DrawEquippedItems(){ item eq[2]; eq[0] = Screen->CreateItem(Link->ItemB); eq[1] = Screen->CreateItem(Link->ItemA); for ( int q = 0; q <= 1; q++ ) { eq[q]->DrawXOffset = -1000; eq[q]->DrawYOffset = -1000; eq[q]->X = 0; eq[q]->Y = 0; eq[q]->Pickup = IP_DUMMY; } eq[1]->Misc[MISC_SUBSC_OBJ] = IS_INVENTORY_A; eq[0]->Misc[MISC_SUBSC_OBJ] = IS_INVENTORY_B; DrawItemToLayer(eq[1], SUBSC_OBJ_LAYER, SUBSC_EQUIP_A_X+SubPaneX(PANE_CENTRE), SUBSC_EQUIP_A_Y+SubPaneY(PANE_CENTRE), SUBSC_TILE_OPACITY); DrawItemToLayer(eq[0], SUBSC_OBJ_LAYER, SUBSC_EQUIP_B_X+SubPaneX(PANE_CENTRE), SUBSC_EQUIP_B_Y+SubPaneY(PANE_CENTRE), SUBSC_TILE_OPACITY); Remove(eq[0]); Remove(eq[1]); } void DrawItemToLayer(item i, int layer, int x, int y, int opacity){ Screen->DrawTile(layer,x,y,i->Tile+i->Frame,i->TileWidth,i->TileHeight,i->CSet,-1,-1,0,0,0,0,true,opacity); } void StoreEnableItemsPtr(int arr){ GRAM[ENABLEITEMS_PRT] = arr; } int GetEnableDisablePtr(){ return GRAM[ENABLEITEMS_PRT]; } bool IsEnableDisableItem(int itm){ int it_ptr = GetEnableDisablePtr(); for ( int q = (SizeOfArray(it_ptr)-1); q >= 0; q-- ) { if ( it_ptr[q] == itm ) return true; } return false; } void DoEnableDisable(int itm){ if ( Link->Item[ itm ] ) Link->Item[itm] = false; else Link->Item[itm] = true; } //Subscreen FFC ffc script SubscreenScript{ void run(){ SSTest(1); bool pan_in = true;; int q[265]; itemdata id[25]; item i[25]; AssignSubscreenPointer(q); //Pute the pointer into GRAM[] so that global accessors work. q[SUBSC_ACTIVE] = 1; q[SUBSC_SELECTED] = 0; q[SUBSC_LAST_SELECTED] = 0; q[SUBSC_POSX] = SUBSC_INITIAL_X; q[SUBSC_POSY] = SUBSC_INITIAL_Y; q[PANE_CENTRE_DRAWN] = 1; q[PANE_ID] = PANE_CENTRE; SubPaneX(PANE_CENTRE,0); SubPaneY(PANE_CENTRE,-SUBSC_BITMAP_HEIGHT); SubPaneX(PANE_LEFT,-SUBSC_BITMAP_WIDTH); SubPaneY(PANE_LEFT,0); SubPaneX(PANE_RIGHT,SUBSC_BITMAP_WIDTH); SubPaneY(PANE_LEFT,0); //Populate with the IDs of items to place in the inventory selection box. int subscreenitems[240]={I_SWORD1, I_SWORD2, I_SWORD3, I_SWORD4, I_BRANG1, I_BRANG2, I_CANDLE1, I_CANDLE2, I_BOMB, I_SBOMB, I_HAMMER, I_CBYRNA, I_BOOTS, I_BOW2, I_FLIPPERS, I_LADDER1, I_HOOKSHOT1, I_POTION1, I_POTION2, I_SHIELD1, I_WAND, I_WHISTLE, I_MAP, I_BAIT}; //put the items on the screen. int EnableDisable[]={I_SHIELD1, I_LADDER1, I_FLIPPERS, I_BOOTS}; StoreEnableItemsPtr(EnableDisable); id[SUBSC_LAST] = Game->LoadItemData(I_GENERIC); id[SUBSC_LAST]->Tile = CURSOR_TILE; id[SUBSC_LAST]->CSet = CURSOR_CSET; id[SUBSC_LAST]->AFrames = CURSOR_AFRAMES; id[SUBSC_LAST]->ASpeed = CURSOR_ASPEED; if ( SUBSC_FADE_IN == 1 ) Screen->ZapIn(); if ( SUBSC_FADE_IN == 2 ) Screen->ZapOut(); for ( q[SUBSC_FOR_LOOP] = 0; q[SUBSC_FOR_LOOP] < SUBSC_MAX_ITEMS; q[SUBSC_FOR_LOOP]++ ) { i[ q[SUBSC_FOR_LOOP] ] = Screen->CreateItem( subscreenitems[ q[SUBSC_FOR_LOOP] ]); i[ q[SUBSC_FOR_LOOP] ]->X = q[SUBSC_POSX]; i[ q[SUBSC_FOR_LOOP] ]->Y = q[SUBSC_POSY]; i[ q[SUBSC_FOR_LOOP] ]->Pickup = IP_DUMMY; //i[ q[SUBSC_FOR_LOOP] ]->DrawXOffset = SubPaneX(PANE_CENTRE); i[ q[SUBSC_FOR_LOOP] ]->DrawYOffset = SubPaneY(PANE_CENTRE)*-1; i[ q[SUBSC_FOR_LOOP] ]->Misc[MISC_SUBSC_OBJ] = IS_SUBSCREEN_OBJECT; if ( !Link->Item[ subscreenitems[q[SUBSC_FOR_LOOP] ] ] && !OwnsItems[ subscreenitems[q[SUBSC_FOR_LOOP] ] ] ) { i[ q[SUBSC_FOR_LOOP] ]->ID = I_SUBSCREEN_BLANK; i[ q[SUBSC_FOR_LOOP] ]->Tile = SUBSC_TILE_BLANK; } if ( q[SUBSC_POSX] < ( SUBSC_INITIAL_X + ( SUBSC_X_SPACING * (SUBSC_NUM_COLUMNS-1) ) ) ) { q[SUBSC_POSX] += SUBSC_X_SPACING; } else { q[SUBSC_POSX] = SUBSC_INITIAL_X; if ( q[SUBSC_POSY] < ( SUBSC_INITIAL_Y + (SUBSC_Y_SPACING * (SUBSC_NUM_ROWS-1) ) ) ) q[SUBSC_POSY] += SUBSC_Y_SPACING; } } //Pan in the initial tiles. do{ //Initial pan in. pan_in = PanUpToDown(PANE_CENTRE,true); for ( q[SUBSC_OBJ_PAN_DRAW_LOOP] = 0; q[SUBSC_OBJ_PAN_DRAW_LOOP] < SUBSC_MAX_ITEMS; q[SUBSC_OBJ_PAN_DRAW_LOOP]++ ) DrawItemToLayer(i[q[SUBSC_OBJ_PAN_DRAW_LOOP]],SUBSC_OBJ_LAYER, OP_OPAQUE); //i[ q[SUBSC_FOR_LOOP] ]->DrawXOffset = SubPaneX(PANE_CENTRE); //i[ q[SUBSC_FOR_LOOP] ]->DrawYOffset = SubPaneY(PANE_CENTRE)*-1; WaitNoAction(); } while(pan_in); //Find out what is in Link's B slot. for ( q[SUBSC_SLOTCHECK_LOOP] = 0; q[SUBSC_SLOTCHECK_LOOP] < 24; q[SUBSC_SLOTCHECK_LOOP]++ ) { if ( subscreenitems[ q[SUBSC_FOR_LOOP] ] == Link->ItemB ) { q[SUBSC_LAST_SELECTED] = subscreenitems[ q[SUBSC_FOR_LOOP] ]; q[SUBSC_SELECTED] = subscreenitems[ q[SUBSC_FOR_LOOP] ]; break; } } //if nothing matches, check the A slot for ( q[SUBSC_SLOTCHECK_LOOP] = 0; q[SUBSC_SLOTCHECK_LOOP] < 24; q[SUBSC_SLOTCHECK_LOOP]++ ) { if ( q[SUBSC_SELECTED] != 0 ) break; //If we found a B item, skip this step. if ( subscreenitems[ q[SUBSC_FOR_LOOP] ] == Link->ItemA ) { q[SUBSC_LAST_SELECTED] = subscreenitems[ q[SUBSC_FOR_LOOP] ]; q[SUBSC_SELECTED] = subscreenitems[ q[SUBSC_FOR_LOOP] ]; break; } } i[SUBSC_LAST] = Screen->CreateItem(I_GENERIC); i[SUBSC_LAST]->Pickup = IP_DUMMY; i[SUBSC_LAST]->X = i[q[SUBSC_SELECTED]]->X; i[SUBSC_LAST]->Y = i[q[SUBSC_SELECTED]]->Y; i[SUBSC_LAST]->Misc[MISC_SUBSC_OBJ] = IS_SUBSCREEN_OBJECT; //Draw the tiles to a bitmap? if ( BG_IS_BITMAP > -1 && BG_IS_BITMAP < 7 ) { //Set up the bitmap. SetupSubscreenBitmap(); } Game->PlaySound(SUBSC_OPEN_SFX); while( q[SUBSC_ACTIVE] ){ SSTest(2); if ( !pan_in ) { if ( BG_IS_BITMAP > -1 && BG_IS_BITMAP < 8 ) { Screen->SetRenderTarget(RT_SCREEN); Screen->DrawBitmapEx(BG_IS_BITMAP, RT_SUBSCREEN, SUBSC_BITMAP_X, SUBSC_BITMAP_Y, SUBSC_BITMAP_WIDTH, SUBSC_BITMAP_HEIGHT, SUBSC_BITMAP_X, SUBSC_BITMAP_Y, SUBSC_BITMAP_WIDTH, SUBSC_BITMAP_HEIGHT, 0, 0,0, SUBSC_BITMAP_DRAW_MODE, 0, true); } else { DrawSubscreenTiles(q[PANE_ID]); if ( q[PANE_ID] == PANE_CENTRE ) DrawEquippedItems(); } DrawSubscreenInventoryText(); } if ( q[PANE_ID] == PANE_CENTRE && !q[PANE_CENTRE_DRAWN] ) { q[SUBSC_POSX] = SUBSC_INITIAL_X; q[SUBSC_POSY] = SUBSC_INITIAL_Y; for ( q[SUBSC_FOR_LOOP] = 0; q[SUBSC_FOR_LOOP] < SUBSC_MAX_ITEMS; q[SUBSC_FOR_LOOP]++ ) { i[ q[SUBSC_FOR_LOOP] ] = Screen->CreateItem( subscreenitems[ q[SUBSC_FOR_LOOP] ]); i[ q[SUBSC_FOR_LOOP] ]->X = q[SUBSC_POSX]; i[ q[SUBSC_FOR_LOOP] ]->Y = q[SUBSC_POSY]; i[ q[SUBSC_FOR_LOOP] ]->Pickup = IP_DUMMY; i[ q[SUBSC_FOR_LOOP] ]->Misc[MISC_SUBSC_OBJ] = IS_SUBSCREEN_OBJECT; if ( !Link->Item[ subscreenitems[q[SUBSC_FOR_LOOP] ] ] && !OwnsItems[ subscreenitems[q[SUBSC_FOR_LOOP] ] ] ) { i[ q[SUBSC_FOR_LOOP] ]->ID = I_SUBSCREEN_BLANK; i[ q[SUBSC_FOR_LOOP] ]->Tile = SUBSC_TILE_BLANK; } if ( q[SUBSC_POSX] < ( SUBSC_INITIAL_X + ( SUBSC_X_SPACING * (SUBSC_NUM_COLUMNS-1) ) ) ) { q[SUBSC_POSX] += SUBSC_X_SPACING; } else { q[SUBSC_POSX] = SUBSC_INITIAL_X; if ( q[SUBSC_POSY] < ( SUBSC_INITIAL_Y + (SUBSC_Y_SPACING * (SUBSC_NUM_ROWS-1) ) ) ) q[SUBSC_POSY] += SUBSC_Y_SPACING; } } //Find out what is in Link's B slot. for ( q[SUBSC_SLOTCHECK_LOOP] = 0; q[SUBSC_SLOTCHECK_LOOP] < 24; q[SUBSC_SLOTCHECK_LOOP]++ ) { if ( subscreenitems[ q[SUBSC_FOR_LOOP] ] == Link->ItemB ) { q[SUBSC_LAST_SELECTED] = subscreenitems[ q[SUBSC_FOR_LOOP] ]; q[SUBSC_SELECTED] = subscreenitems[ q[SUBSC_FOR_LOOP] ]; break; } } //if nothing matches, check the A slot for ( q[SUBSC_SLOTCHECK_LOOP] = 0; q[SUBSC_SLOTCHECK_LOOP] < 24; q[SUBSC_SLOTCHECK_LOOP]++ ) { if ( q[SUBSC_SELECTED] != 0 ) break; //If we found a B item, skip this step. if ( subscreenitems[ q[SUBSC_FOR_LOOP] ] == Link->ItemA ) { q[SUBSC_LAST_SELECTED] = subscreenitems[ q[SUBSC_FOR_LOOP] ]; q[SUBSC_SELECTED] = subscreenitems[ q[SUBSC_FOR_LOOP] ]; break; } } i[SUBSC_LAST] = Screen->CreateItem(I_GENERIC); i[SUBSC_LAST]->Pickup = IP_DUMMY; i[SUBSC_LAST]->Misc[MISC_SUBSC_OBJ] = IS_SUBSCREEN_OBJECT; i[SUBSC_LAST]->X = i[q[SUBSC_SELECTED]]->X; i[SUBSC_LAST]->Y = i[q[SUBSC_SELECTED]]->Y; //! Move the subscreen objects when panning for ( q[SUBSC_FOR_LOOP] = 0; q[SUBSC_FOR_LOOP] < SUBSC_MAX_ITEMS; q[SUBSC_FOR_LOOP]++ ) { i[ q[SUBSC_FOR_LOOP] ]->DrawXOffset = SubPaneX(PANE_CENTRE); i[ q[SUBSC_FOR_LOOP] ]->DrawYOffset = SubPaneY(PANE_CENTRE); } //Draw the tiles to a bitmap? if ( BG_IS_BITMAP > -1 && BG_IS_BITMAP < 7 ) { //Set up the bitmap. SetupSubscreenBitmap(); } q[PANE_CENTRE_DRAWN] = 1; } if ( q[PANE_ID] == PANE_CENTRE ) { i[SUBSC_LAST]->X = i[q[SUBSC_SELECTED]]->X; i[SUBSC_LAST]->Y = i[q[SUBSC_SELECTED]]->Y; //cursor->X = i[q[SUBSC_SELECTED]]->X; //cursor->Y = i[q[SUBSC_SELECTED]]->Y; if ( SUBSC_OBJ_LAYER ) { for ( q[SUBSC_OBJDRAW_LOOP] = 0; q[SUBSC_OBJDRAW_LOOP] < SUBSC_MAX_ITEMS; q[SUBSC_OBJDRAW_LOOP]++ ) DrawItemToLayer(i[q[SUBSC_OBJDRAW_LOOP]],SUBSC_OBJ_LAYER, OP_OPAQUE); } if ( CURSOR_LAYER ) { DrawItemToLayer(i[SUBSC_LAST],CURSOR_LAYER, OP_OPAQUE); } if ( Link->PressRight ) { if ( q[SUBSC_SELECTED] < ( SUBSC_MAX_ITEMS -1 ) ) { q[SUBSC_LAST_SELECTED] = q[SUBSC_SELECTED]; q[SUBSC_SELECTED]++; Game->PlaySound(SUBSC_CURSOR_SFX); } else { q[SUBSC_LAST_SELECTED] = q[SUBSC_SELECTED]; q[SUBSC_SELECTED] = 0; Game->PlaySound(SUBSC_CURSOR_SFX); } } if ( Link->PressLeft ) { if ( q[SUBSC_SELECTED] > 0 ) { q[SUBSC_LAST_SELECTED] = q[SUBSC_SELECTED]; q[SUBSC_SELECTED]--; Game->PlaySound(SUBSC_CURSOR_SFX); } else { q[SUBSC_LAST_SELECTED] = q[SUBSC_SELECTED]; q[SUBSC_SELECTED] = ( SUBSC_MAX_ITEMS -1 ); Game->PlaySound(SUBSC_CURSOR_SFX); } } if ( Link->PressDown ) { if ( q[SUBSC_SELECTED] < ( SUBSC_MAX_ITEMS - SUBSC_ITEMS_PER_ROW ) ) { //18 q[SUBSC_LAST_SELECTED] = q[SUBSC_SELECTED]; q[SUBSC_SELECTED] += SUBSC_ITEMS_PER_ROW; //6 Game->PlaySound(SUBSC_CURSOR_SFX); } else { //on bottom row q[SUBSC_LAST_SELECTED] = q[SUBSC_SELECTED]; q[SUBSC_SELECTED] -= (SUBSC_MAX_ITEMS - SUBSC_ITEMS_PER_ROW); //18 Game->PlaySound(SUBSC_CURSOR_SFX); } } if ( Link->PressUp ) { if ( q[SUBSC_SELECTED] > ( SUBSC_ITEMS_PER_ROW -1 ) ) { //5 q[SUBSC_LAST_SELECTED] = q[SUBSC_SELECTED]; q[SUBSC_SELECTED] -= SUBSC_ITEMS_PER_ROW; //6 Game->PlaySound(SUBSC_CURSOR_SFX); } else { q[SUBSC_LAST_SELECTED] = q[SUBSC_SELECTED]; q[SUBSC_SELECTED] += (SUBSC_MAX_ITEMS - SUBSC_ITEMS_PER_ROW); //18 Game->PlaySound(SUBSC_CURSOR_SFX); } } if ( Link->PressA ) { if ( i[q[SUBSC_SELECTED]]->ID != I_SUBSCREEN_BLANK ) { if ( IsEnableDisableItem( i[q[SUBSC_SELECTED]]->ID ) ) { Game->PlaySound(SFX_EQUIP); OwnsItems[i[q[SUBSC_SELECTED]]->ID] = 1; DoEnableDisable( i[q[SUBSC_SELECTED]]->ID ); } else{ Link->ItemA = i[q[SUBSC_SELECTED]]->ID; ButtonItems[BUTTONITEM_A] = i[q[SUBSC_SELECTED]]->ID; Game->PlaySound(SUBSC_SELECTED_SFX); } } } if ( Link->PressB ) { if ( i[q[SUBSC_SELECTED]]->ID != I_SUBSCREEN_BLANK ) { if ( IsEnableDisableItem( i[q[SUBSC_SELECTED]]->ID ) ) { Game->PlaySound(SFX_EQUIP); OwnsItems[i[q[SUBSC_SELECTED]]->ID] = 1; DoEnableDisable( i[q[SUBSC_SELECTED]]->ID ); } else { Link->ItemB = i[q[SUBSC_SELECTED]]->ID; ButtonItems[BUTTONITEM_B] = i[q[SUBSC_SELECTED]]->ID; Game->PlaySound(SUBSC_SELECTED_SFX); } } } if ( Link->PressR ) {} //pan to right page if ( Link->PressL ) { Game->PlaySound(SUBSC_SELECTED_SFX); pan_in = true; do{ PanLeftToRight(PANE_CENTRE,false); pan_in = PanLeftToRight(PANE_LEFT,true); for ( q[SUBSC_OBJ_PAN_DRAW_LOOP] = 0; q[SUBSC_OBJ_PAN_DRAW_LOOP] < SUBSC_MAX_ITEMS; q[SUBSC_OBJ_PAN_DRAW_LOOP]++ ) DrawItemToLayer(i[q[SUBSC_OBJ_PAN_DRAW_LOOP]],SUBSC_OBJ_LAYER, OP_OPAQUE); WaitNoAction(); } while(pan_in); q[PANE_ID] = PANE_LEFT; //pan to left page q[PANE_CENTRE_DRAWN] = 0; } if ( Link->PressStart ) { Link->PressStart = false; pan_in = true; Game->PlaySound(SUBSC_CLOSE_SFX); //for ( q[SUBSC_CLEANUP_LOOP] = 0; q[SUBSC_CLEANUP_LOOP] <= SUBSC_MAX_ITEMS; q[SUBSC_CLEANUP_LOOP]++ ) // Remove(i[ q[SUBSC_CLEANUP_LOOP] ]); //<= to clean up cursor. do{ pan_in = PanExit(PANE_CENTRE,false,i); for ( q[SUBSC_OBJ_PAN_DRAW_LOOP] = 0; q[SUBSC_OBJ_PAN_DRAW_LOOP] < SUBSC_MAX_ITEMS; q[SUBSC_OBJ_PAN_DRAW_LOOP]++ ) DrawItemToLayer(i[q[SUBSC_OBJ_PAN_DRAW_LOOP]],SUBSC_OBJ_LAYER, OP_OPAQUE); WaitNoAction(); } while(pan_in); if ( SUBSC_FADE_OUT == 1 ) Screen->ZapIn(); if ( SUBSC_FADE_OUT == 2 ) Screen->ZapOut(); //for ( q[SUBSC_CLEANUP_LOOP] = 0; q[SUBSC_CLEANUP_LOOP] <= SUBSC_MAX_ITEMS; q[SUBSC_CLEANUP_LOOP]++ ) // Remove(i[ q[SUBSC_CLEANUP_LOOP] ]); //<= to clean up cursor. //Remove(cursor); q[SUBSC_ACTIVE] = 0; } i[SUBSC_LAST]->X = i[q[SUBSC_SELECTED]]->X; i[SUBSC_LAST]->Y = i[q[SUBSC_SELECTED]]->Y; } if ( q[PANE_ID] == PANE_LEFT ) { if ( Link->PressR ) { Game->PlaySound(SUBSC_SELECTED_SFX); do{ PanRightToLeft(PANE_LEFT,false); pan_in = PanRightToLeft(PANE_CENTRE,true); for ( q[SUBSC_OBJ_PAN_DRAW_LOOP] = 0; q[SUBSC_OBJ_PAN_DRAW_LOOP] < SUBSC_MAX_ITEMS; q[SUBSC_OBJ_PAN_DRAW_LOOP]++ ) DrawItemToLayer(i[q[SUBSC_OBJ_PAN_DRAW_LOOP]],SUBSC_OBJ_LAYER, OP_OPAQUE); WaitNoAction(); } while(pan_in); q[PANE_ID] = PANE_CENTRE;//pan to right page } if ( Link->PressStart ) { Link->PressStart = false; Game->PlaySound(SUBSC_CLOSE_SFX); //for ( q[SUBSC_CLEANUP_LOOP] = 0; q[SUBSC_CLEANUP_LOOP] <= SUBSC_MAX_ITEMS; q[SUBSC_CLEANUP_LOOP]++ ) // Remove(i[ q[SUBSC_CLEANUP_LOOP] ]); //<= to clean up cursor. pan_in = true; do{ pan_in = PanExit(PANE_LEFT,false,i); for ( q[SUBSC_OBJ_PAN_DRAW_LOOP] = 0; q[SUBSC_OBJ_PAN_DRAW_LOOP] < SUBSC_MAX_ITEMS; q[SUBSC_OBJ_PAN_DRAW_LOOP]++ ) DrawItemToLayer(i[q[SUBSC_OBJ_PAN_DRAW_LOOP]],SUBSC_OBJ_LAYER, OP_OPAQUE); WaitNoAction(); } while(pan_in); //for ( q[SUBSC_CLEANUP_LOOP] = 0; q[SUBSC_CLEANUP_LOOP] <= SUBSC_MAX_ITEMS; q[SUBSC_CLEANUP_LOOP]++ ) // Remove(i[ q[SUBSC_CLEANUP_LOOP] ]); //<= to clean up cursor. //for ( q[SUBSC_CLEANUP_LOOP] = 0; q[SUBSC_CLEANUP_LOOP] <= SUBSC_MAX_ITEMS; q[SUBSC_CLEANUP_LOOP]++ ) // Remove(i[ q[SUBSC_CLEANUP_LOOP] ]); //<= to clean up cursor. if ( SUBSC_FADE_OUT == 1 ) Screen->ZapIn(); if ( SUBSC_FADE_OUT == 2 ) Screen->ZapOut(); q[SUBSC_ACTIVE] = 0; this->Data = 0; this->Script = 0; Quit(); } } if ( !pan_in ) { //Prevent flicker of background. DrawSubscreenTiles(q[PANE_ID]); if ( q[PANE_ID] == PANE_CENTRE ){ for ( q[SUBSC_OBJ_PAN_DRAW_LOOP] = 0; q[SUBSC_OBJ_PAN_DRAW_LOOP] <= SUBSC_MAX_ITEMS; q[SUBSC_OBJ_PAN_DRAW_LOOP]++ ) DrawItemToLayer(i[q[SUBSC_OBJ_PAN_DRAW_LOOP]],SUBSC_OBJ_LAYER, OP_OPAQUE); DrawEquippedItems(); DrawSubscreenInventoryText(); UpdateDrawnInventory(); } } Waitframe(); } for ( q[SUBSC_EXIT_CLEANUP_LOOP] = Screen->NumItems(); q[SUBSC_EXIT_CLEANUP_LOOP] > 0; q[SUBSC_EXIT_CLEANUP_LOOP]--) { i[SUBSC_LAST] = Screen->LoadItem(q[SUBSC_EXIT_CLEANUP_LOOP]); if ( i[SUBSC_LAST]->Misc[MISC_SUBSC_OBJ] >= IS_SUBSCREEN_OBJECT && i[SUBSC_LAST]->Misc[MISC_SUBSC_OBJ] <= IS_INVENTORY_B ) Remove(i[SUBSC_LAST]); } GRAM[EXITING_SUBSCREEN] = 1; ButtonItems[BUTTONITEM_SUBSCREEN] = 0; if ( SUBSC_LINK_INVISIBLE ) Link->Invisible = false; //Resume Ghost.zh //Remove all items and wait a frame? this->Data = 0; this->Script = 0; Quit(); } } // Test Scripts item script test{ void run(){ int s[]="Using item: "; TraceS(s); Trace(Link->UsingItem); int ss[]="Tracing this->ID: "; TraceS(ss); Trace(this->ID); } } item script map{ void run(){ Link->InputMap = true; Link->PressMap = true; } } global script Init{ void run(){ SetDefaultItems(); } } item script Equip{ void run(){ if ( Link->Item[this->ID] && OwnsItems[this->ID] ){ OwnsItems[this->ID] = 1; Link->Item[this->ID] = false; } if ( !Link->Item[this->ID] && OwnsItems[this->ID] ) Link->Item[this->ID] = true; } } //////////////////////// /// Global Functions /// //////////////////////// //! Global Array Accessors //Returns the pointer for the global array index that controls subscreen values. int GetSubscreenPtr(){ return GRAM[SUBSCREEN]; } //Called from the ffc to store the array pointer in GRAM[] void AssignSubscreenPointer(int ptr){ GRAM[SUBSCREEN]=ptr; } //Call to run the subscreen ffc. void DoSubscreen(){ if ( SUBSC_LINK_INVISIBLE ) Link->Invisible = true; //Suspend ghost.zh int t[]="Running DoSubscreen()"; TraceS(t); ButtonItems[BUTTONITEM_SUBSCREEN] = 1; int s[]="SubscreenScript"; int ff = Game->GetFFCScript(s); ffc f = Screen->LoadFFC(SUBSC_FFC_INDEX); f->Data = SUBSC_FFC_DATA; f->Script = ff; } //Sets some base items. void SetDefaultItems(){ Link->Item[I_SHIELD1] = true; Link->Item[I_SWORD1] = true; Link->Item[I_SWORD2] = true; Link->Item[I_WAND] = true; Link->Item[I_WHISTLE] = true; Link->Item[I_BAIT] = true; Link->Item[I_HOOKSHOT1] = true; Link->Item[I_MAP] = true; OwnsItems[I_MAP] = 1; for ( int q = 0; q < 256; q++ ) TraceB(Link->Item[q]); } //! Drawing Routines void DrawSubscreenInventoryText(){ //Keys 1 Screen->DrawInteger(SUBSC_TEXT_LAYER, SUBSC_TEXT_X_KEYS1+SUBSC_TEXT_INV_SHADOW_OFFSET, SUBSC_TEXT_Y_INVENTORY, SUBSC_TEXT_INV_FONT, SUBSC_TEXT_INV_BG_COLOUR, SUBSC_TEXT_BACKDROP, SUBSC_TEXT_INV_FONT_SIZE, SUBSC_TEXT_INV_FONT_SIZE, Game->Counter[CR_KEYS], 0, SUBSC_TEXT_INV_OPACITY); Screen->DrawInteger(SUBSC_TEXT_LAYER, SUBSC_TEXT_X_KEYS1, SUBSC_TEXT_Y_INVENTORY, SUBSC_TEXT_INV_FONT, SUBSC_TEXT_INV_FG_COLOUR, SUBSC_TEXT_BACKDROP, SUBSC_TEXT_INV_FONT_SIZE, SUBSC_TEXT_INV_FONT_SIZE, Game->Counter[CR_KEYS], 0, SUBSC_TEXT_INV_OPACITY); //Keys 2 Screen->DrawInteger(SUBSC_TEXT_LAYER, SUBSC_TEXT_X_KEYS2+SUBSC_TEXT_INV_SHADOW_OFFSET, SUBSC_TEXT_Y_INVENTORY, SUBSC_TEXT_INV_FONT, SUBSC_TEXT_INV_BG_COLOUR, SUBSC_TEXT_BACKDROP, SUBSC_TEXT_INV_FONT_SIZE, SUBSC_TEXT_INV_FONT_SIZE, Game->LKeys[Game->GetCurLevel()], 0, SUBSC_TEXT_INV_OPACITY); Screen->DrawInteger(SUBSC_TEXT_LAYER, SUBSC_TEXT_X_KEYS2, SUBSC_TEXT_Y_INVENTORY, SUBSC_TEXT_INV_FONT, SUBSC_TEXT_INV_FG_COLOUR, SUBSC_TEXT_BACKDROP, SUBSC_TEXT_INV_FONT_SIZE, SUBSC_TEXT_INV_FONT_SIZE, Game->LKeys[Game->GetCurLevel()], 0, SUBSC_TEXT_INV_OPACITY); //Keys 3 Screen->DrawInteger(SUBSC_TEXT_LAYER, SUBSC_TEXT_X_KEYS3+SUBSC_TEXT_INV_SHADOW_OFFSET, SUBSC_TEXT_Y_INVENTORY, SUBSC_TEXT_INV_FONT, SUBSC_TEXT_INV_BG_COLOUR, SUBSC_TEXT_BACKDROP, SUBSC_TEXT_INV_FONT_SIZE, SUBSC_TEXT_INV_FONT_SIZE, Game->Counter[CR_SCRIPT5], 0, SUBSC_TEXT_INV_OPACITY); Screen->DrawInteger(SUBSC_TEXT_LAYER, SUBSC_TEXT_X_KEYS3, SUBSC_TEXT_Y_INVENTORY, SUBSC_TEXT_INV_FONT, SUBSC_TEXT_INV_FG_COLOUR, SUBSC_TEXT_BACKDROP, SUBSC_TEXT_INV_FONT_SIZE, SUBSC_TEXT_INV_FONT_SIZE, Game->Counter[CR_SCRIPT5], 0, SUBSC_TEXT_INV_OPACITY); //Bombs Screen->DrawInteger(SUBSC_TEXT_LAYER, SUBSC_TEXT_X_BOMBS+SUBSC_TEXT_INV_SHADOW_OFFSET, SUBSC_TEXT_Y_INVENTORY, SUBSC_TEXT_INV_FONT, SUBSC_TEXT_INV_BG_COLOUR, SUBSC_TEXT_BACKDROP, SUBSC_TEXT_INV_FONT_SIZE, SUBSC_TEXT_INV_FONT_SIZE, Game->Counter[CR_BOMBS], 0, SUBSC_TEXT_INV_OPACITY); Screen->DrawInteger(SUBSC_TEXT_LAYER, SUBSC_TEXT_X_BOMBS, SUBSC_TEXT_Y_INVENTORY, SUBSC_TEXT_INV_FONT, SUBSC_TEXT_INV_FG_COLOUR, SUBSC_TEXT_BACKDROP, SUBSC_TEXT_INV_FONT_SIZE, SUBSC_TEXT_INV_FONT_SIZE, Game->Counter[CR_BOMBS], 0, SUBSC_TEXT_INV_OPACITY); //Super Bombs Screen->DrawInteger(SUBSC_TEXT_LAYER, SUBSC_TEXT_X_SBOMBS+SUBSC_TEXT_INV_SHADOW_OFFSET, SUBSC_TEXT_Y_INVENTORY, SUBSC_TEXT_INV_FONT, SUBSC_TEXT_INV_BG_COLOUR, SUBSC_TEXT_BACKDROP, SUBSC_TEXT_INV_FONT_SIZE, SUBSC_TEXT_INV_FONT_SIZE, Game->Counter[CR_SBOMBS], 0, SUBSC_TEXT_INV_OPACITY); Screen->DrawInteger(SUBSC_TEXT_LAYER, SUBSC_TEXT_X_SBOMBS, SUBSC_TEXT_Y_INVENTORY, SUBSC_TEXT_INV_FONT, SUBSC_TEXT_INV_FG_COLOUR, SUBSC_TEXT_BACKDROP, SUBSC_TEXT_INV_FONT_SIZE, SUBSC_TEXT_INV_FONT_SIZE, Game->Counter[CR_SBOMBS], 0, SUBSC_TEXT_INV_OPACITY); //Arrows Screen->DrawInteger(SUBSC_TEXT_LAYER, SUBSC_TEXT_X_ARROWS+SUBSC_TEXT_INV_SHADOW_OFFSET, SUBSC_TEXT_Y_INVENTORY, SUBSC_TEXT_INV_FONT, SUBSC_TEXT_INV_BG_COLOUR, SUBSC_TEXT_BACKDROP, SUBSC_TEXT_INV_FONT_SIZE, SUBSC_TEXT_INV_FONT_SIZE, Game->Counter[CR_ARROWS], 0, SUBSC_TEXT_INV_OPACITY); Screen->DrawInteger(SUBSC_TEXT_LAYER, SUBSC_TEXT_X_ARROWS, SUBSC_TEXT_Y_INVENTORY, SUBSC_TEXT_INV_FONT, SUBSC_TEXT_INV_FG_COLOUR, SUBSC_TEXT_BACKDROP, SUBSC_TEXT_INV_FONT_SIZE, SUBSC_TEXT_INV_FONT_SIZE, Game->Counter[CR_ARROWS], 0, SUBSC_TEXT_INV_OPACITY); //Life Screen->DrawInteger(SUBSC_TEXT_LAYER, SUBSC_TEXT_X_LIFE+SUBSC_TEXT_INV_SHADOW_OFFSET, SUBSC_TEXT_Y_INVENTORY, SUBSC_TEXT_INV_FONT, SUBSC_TEXT_INV_BG_COLOUR, SUBSC_TEXT_BACKDROP, SUBSC_TEXT_INV_FONT_SIZE, SUBSC_TEXT_INV_FONT_SIZE, Game->Counter[CR_LIFE], 0, SUBSC_TEXT_INV_OPACITY); Screen->DrawInteger(SUBSC_TEXT_LAYER, SUBSC_TEXT_X_LIFE, SUBSC_TEXT_Y_INVENTORY, SUBSC_TEXT_INV_FONT, SUBSC_TEXT_INV_FG_COLOUR, SUBSC_TEXT_BACKDROP, SUBSC_TEXT_INV_FONT_SIZE, SUBSC_TEXT_INV_FONT_SIZE, Game->Counter[CR_LIFE], 0, SUBSC_TEXT_INV_OPACITY); //Magic Screen->DrawInteger(SUBSC_TEXT_LAYER, SUBSC_TEXT_X_MAGIC+SUBSC_TEXT_INV_SHADOW_OFFSET, SUBSC_TEXT_Y_INVENTORY, SUBSC_TEXT_INV_FONT, SUBSC_TEXT_INV_BG_COLOUR, SUBSC_TEXT_BACKDROP, SUBSC_TEXT_INV_FONT_SIZE, SUBSC_TEXT_INV_FONT_SIZE, Game->Counter[CR_MAGIC], 0, SUBSC_TEXT_INV_OPACITY); Screen->DrawInteger(SUBSC_TEXT_LAYER, SUBSC_TEXT_X_MAGIC, SUBSC_TEXT_Y_INVENTORY, SUBSC_TEXT_INV_FONT, SUBSC_TEXT_INV_FG_COLOUR, SUBSC_TEXT_BACKDROP, SUBSC_TEXT_INV_FONT_SIZE, SUBSC_TEXT_INV_FONT_SIZE, Game->Counter[CR_MAGIC], 0, SUBSC_TEXT_INV_OPACITY); //Money Screen->DrawInteger(SUBSC_TEXT_LAYER, SUBSC_TEXT_X_MONEY+SUBSC_TEXT_INV_SHADOW_OFFSET, SUBSC_TEXT_Y_INVENTORY, SUBSC_TEXT_INV_FONT, SUBSC_TEXT_INV_BG_COLOUR, SUBSC_TEXT_BACKDROP, SUBSC_TEXT_INV_FONT_SIZE, SUBSC_TEXT_INV_FONT_SIZE, Game->Counter[CR_RUPEES], 0, SUBSC_TEXT_INV_OPACITY); Screen->DrawInteger(SUBSC_TEXT_LAYER, SUBSC_TEXT_X_MONEY, SUBSC_TEXT_Y_INVENTORY, SUBSC_TEXT_INV_FONT, SUBSC_TEXT_INV_FG_COLOUR, SUBSC_TEXT_BACKDROP, SUBSC_TEXT_INV_FONT_SIZE, SUBSC_TEXT_INV_FONT_SIZE, Game->Counter[CR_RUPEES], 0, SUBSC_TEXT_INV_OPACITY); } void SetupSubscreenBitmap(){ Screen->SetRenderTarget(RT_BITMAP0); //Centre pane Screen->DrawTile( SUBSC_TILE_LAYER, SUBSC_TILE_INITIAL_X, SUBSC_TILE_INITIAL_Y, SUBSC_FIRST_TILE, SUBSC_TILE_WIDTH, SUBSC_TILE_HEIGHT, SUBSC_TILE_CSET, SUBSC_TILE_XSCALE, SUBSC_TILE_YSCALE, SUBSC_TILE_RX, SUBSC_TILE_RY, SUBSC_TILE_RANGLE, SUBSC_TILE_FLIP, true, SUBSC_TILE_OPACITY); Screen->SetRenderTarget(RT_BITMAP1); //Left pane Screen->DrawTile( SUBSC_TILE_LAYER, SUBSC_TILE_INITIAL_X, SUBSC_TILE_INITIAL_Y, SUBSC_TILE_LPANE, SUBSC_TILE_WIDTH, SUBSC_TILE_HEIGHT, SUBSC_TILE_CSET, SUBSC_TILE_XSCALE, SUBSC_TILE_YSCALE, SUBSC_TILE_RX, SUBSC_TILE_RY, SUBSC_TILE_RANGLE, SUBSC_TILE_FLIP, true, SUBSC_TILE_OPACITY); Screen->SetRenderTarget(RT_BITMAP2); //Right pane Screen->DrawTile( SUBSC_TILE_LAYER, SUBSC_TILE_INITIAL_X, SUBSC_TILE_INITIAL_Y, SUBSC_TILE_LPANE, SUBSC_TILE_WIDTH, SUBSC_TILE_HEIGHT, SUBSC_TILE_CSET, SUBSC_TILE_XSCALE, SUBSC_TILE_YSCALE, SUBSC_TILE_RX, SUBSC_TILE_RY, SUBSC_TILE_RANGLE, SUBSC_TILE_FLIP, true, SUBSC_TILE_OPACITY); } //Draws an item to a given layer void DrawItemToLayer(item i, int layer, int opacity){ Screen->DrawTile(layer,i->X+SubPaneX(PANE_CENTRE),i->Y+SubPaneY(PANE_CENTRE),i->Tile+i->Frame,i->TileWidth,i->TileHeight,i->CSet,-1,-1,0,0,0,0,true,opacity); //Trace(i->Frame); } void DrawSubscreenTiles(int pane_id){ Screen->DrawTile( SUBSC_TILE_LAYER, SUBSC_TILE_INITIAL_X+SubPaneX(pane_id), SUBSC_TILE_INITIAL_Y+SubPaneY(pane_id), GetPaneTile(pane_id), SUBSC_TILE_WIDTH, SUBSC_TILE_HEIGHT, SUBSC_TILE_CSET, SUBSC_TILE_XSCALE, SUBSC_TILE_YSCALE, SUBSC_TILE_RX, SUBSC_TILE_RY, SUBSC_TILE_RANGLE, SUBSC_TILE_FLIP, true, SUBSC_TILE_OPACITY); } //! Subscreen Pane Panning //Getters for Panning int SubPaneX(int pane){ int ss_ptr = GetSubscreenPtr(); if ( pane == PANE_LEFT ) return ss_ptr[PANE_LEFT_X]; else if ( pane == PANE_RIGHT ) return ss_ptr[PANE_RIGHT_X]; else return ss_ptr[PANE_CENTRE_X]; } int SubPaneY(int pane){ int ss_ptr = GetSubscreenPtr(); if ( pane == PANE_LEFT ) return ss_ptr[PANE_LEFT_Y]; else if ( pane == PANE_RIGHT ) return ss_ptr[PANE_RIGHT_Y]; else return ss_ptr[PANE_CENTRE_Y]; } void SubPaneX(int pane, int value){ int ss_ptr = GetSubscreenPtr(); if ( pane == PANE_LEFT ) ss_ptr[PANE_LEFT_X] = value; else if ( pane == PANE_RIGHT ) ss_ptr[PANE_RIGHT_X] = value; else ss_ptr[PANE_CENTRE_X] = value; } void SubPaneY(int pane, int value){ int ss_ptr = GetSubscreenPtr(); if ( pane == PANE_LEFT ) ss_ptr[PANE_LEFT_Y] = value; else if ( pane == PANE_RIGHT ) ss_ptr[PANE_RIGHT_Y] = value; else ss_ptr[PANE_CENTRE_Y] = value; } //Panning routines //Pan left bool PanLeftToRight(int pane, bool in){ //Slide in fromthe left Link->PressStart = false; NoAction(); if ( in ) { if ( SubPaneX(pane) <= (SCREEN_LEFT-SUBSC_PAN_SPEED) ) { SubPaneX(pane, ( SubPaneX(pane) + SUBSC_PAN_SPEED ) ); DrawSubscreenTiles(pane); if ( pane == PANE_CENTRE ) DrawEquippedItems(); return true; } //Draw tiles or bitmap. //tiles DrawSubscreenTiles(pane); if ( pane == PANE_CENTRE ) DrawEquippedItems(); return false; } if ( !in ) { if ( SubPaneX(pane) <= (SCREEN_RIGHT+SUBSC_PAN_SPEED) ) { SubPaneX(pane, ( SubPaneX(pane) + SUBSC_PAN_SPEED ) ); DrawSubscreenTiles(pane); if ( pane == PANE_CENTRE ) DrawEquippedItems(); return true; } //Draw tiles or bitmap. //tiles DrawSubscreenTiles(pane); if ( pane == PANE_CENTRE ) DrawEquippedItems(); return false; } } bool PanRightToLeft(int pane, bool in){ //Slide in fromthe left Link->PressStart = false; NoAction(); if ( in ) { if ( SubPaneX(pane) > (SCREEN_LEFT) ) { SubPaneX(pane,SubPaneX(pane)-SUBSC_PAN_SPEED); DrawSubscreenTiles(pane); if ( pane == PANE_CENTRE ) DrawEquippedItems(); return true; } //Draw tiles or bitmap. //tiles DrawSubscreenTiles(pane); if ( pane == PANE_CENTRE ) DrawEquippedItems(); return false; } if ( !in ) { if ( SubPaneX(pane)+SCREEN_RIGHT > (SCREEN_LEFT-SUBSC_PAN_SPEED) ) { SubPaneX(pane,SubPaneX(pane)-SUBSC_PAN_SPEED); DrawSubscreenTiles(pane); if ( pane == PANE_CENTRE ) DrawEquippedItems(); return true; } //Draw tiles or bitmap. //tiles DrawSubscreenTiles(pane); if ( pane == PANE_CENTRE ) DrawEquippedItems(); return false; } } bool PanUpToDown(int pane, bool in){ //Slide in fromthe left Link->PressStart = false; NoAction(); if ( in ) { if ( SubPaneY(pane) <= (SCREEN_TOP-SUBSC_PAN_SPEED) ) { //if ( SubPaneY(pane) <= (SCREEN_TOP+SUBSC_PAN_SPEED) ) SubPaneY(pane,SubPaneY(pane)+SUBSC_PAN_SPEED); //else //SubPaneY(pane,SubPaneY(pane)+1); DrawSubscreenTiles(pane); if ( pane == PANE_CENTRE ) DrawEquippedItems(); return true; } //Draw tiles or bitmap. //tiles DrawSubscreenTiles(pane); if ( pane == PANE_CENTRE ) DrawEquippedItems(); return false; } if ( !in ) { if ( SubPaneY(pane) <= (SCREEN_BOTTOM-SUBSC_PAN_SPEED) ) { SubPaneY(pane,SubPaneY(pane)+SUBSC_PAN_SPEED); DrawSubscreenTiles(pane); if ( pane == PANE_CENTRE ) DrawEquippedItems(); return true; } //Draw tiles or bitmap. //tiles DrawSubscreenTiles(pane); if ( pane == PANE_CENTRE ) DrawEquippedItems(); return false; } } bool PanDownToUp(int pane, bool in){ //Slide in fromthe left Link->PressStart = false; NoAction(); if ( in ) { if ( SubPaneY(pane) > (SUBSCREEN_TOP+SUBSC_PAN_SPEED) ) { SubPaneY(pane,SubPaneY(pane)-SUBSC_PAN_SPEED); DrawSubscreenTiles(pane); if ( pane == PANE_CENTRE ) DrawEquippedItems(); return true; } //Draw tiles or bitmap. //tiles DrawSubscreenTiles(pane); if ( pane == PANE_CENTRE ) DrawEquippedItems(); return false; } if ( !in ) { if ( SubPaneY(pane)+SUBSC_BITMAP_HEIGHT > (SUBSCREEN_TOP+SUBSC_PAN_SPEED) ) { SubPaneY(pane,SubPaneY(pane)-SUBSC_PAN_SPEED); DrawSubscreenTiles(pane); if ( pane == PANE_CENTRE ) DrawEquippedItems(); return true; } //Draw tiles or bitmap. //tiles DrawSubscreenTiles(pane); if ( pane == PANE_CENTRE ) DrawEquippedItems(); return false; } } bool PanExit(int pane, bool in, item arr){ //Slide in fromthe left Link->PressStart = false; NoAction(); int q; if ( in ) { if ( SubPaneY(pane) > (SUBSCREEN_TOP+SUBSC_PAN_SPEED) ) { SubPaneY(pane,SubPaneY(pane)-SUBSC_PAN_SPEED); DrawSubscreenTiles(pane); if ( pane == PANE_CENTRE ) DrawEquippedItems(); return true; } //Draw tiles or bitmap. //tiles DrawSubscreenTiles(pane); if ( pane == PANE_CENTRE ) DrawEquippedItems(); return false; } if ( !in ) { if ( SubPaneY(pane)+SUBSC_BITMAP_HEIGHT > (SUBSCREEN_TOP+SUBSC_PAN_SPEED) ) { SubPaneY(pane,SubPaneY(pane)-SUBSC_PAN_SPEED); DrawSubscreenTiles(pane); for ( q = 0; q <= SUBSC_MAX_ITEMS; q++ ) DrawItemToLayer(arr[q],SUBSC_OBJ_LAYER, OP_OPAQUE); if ( pane == PANE_CENTRE ) DrawEquippedItems(); return true; } //Draw tiles or bitmap. //tiles DrawSubscreenTiles(pane); if ( pane == PANE_CENTRE ) DrawEquippedItems(); if ( pane == PANE_CENTRE ) DrawEquippedItems(); for ( q = 0; q <= SUBSC_MAX_ITEMS; q++ ) Remove(arr[ q ]); //<= to clean up cursor. return false; } } //! Utilities void ChangeItemScript(itemdata a, itemdata b){ b->Script = a->Script; } void ChangeItemScript(itemdata a, item b){ itemdata c = Game->LoadItemData(b->ID); a->Script = c->Script; } void ChangeItemPScript(itemdata a, itemdata b){ b->PScript = a->PScript; } void ChangeItemPScript(itemdata a, item b){ itemdata c = Game->LoadItemData(b->ID); a->PScript = c->PScript; } //Sample Global Active Script global script active{ void run(){ SetDefaultItems(); int a[]="ZC 2.54 Beta 45 Demo Quest"; TraceS(a); Game->DisableActiveSubscreen = true; //Prevent the internal subscreen from appearing. Link->ItemA = 6; while(true){ if ( Link->PressStart ) { DoSubscreen(); } if ( SUBSCREEN_DRAW_TEST ) { Screen->DrawCombo(6, -40, 100, 84, 1, 1, 11, -1, -1, 0, 0, 0, 1, 0, true, 128); Screen->DrawTile(6, -40, 100, 12246, 1,1, 11, -1, -1, 0, 0, 0, 0, true, 128); } //Preserve the items on DMap change. if ( !ButtonItems[BUTTONITEM_SUBSCREEN] ){ if ( Link->ItemA != ButtonItems[BUTTONITEM_A] && ButtonItems[BUTTONITEM_A] != 0 ) Link->ItemA = ButtonItems[BUTTONITEM_A]; if ( Link->ItemB != ButtonItems[BUTTONITEM_B] && ButtonItems[BUTTONITEM_B] != 0 ) Link->ItemB = ButtonItems[BUTTONITEM_B]; } if ( GRAM[EXITING_SUBSCREEN] ) { GRAM[EXITING_SUBSCREEN] = 0; if ( SUBSC_FADE_IN == 1 ) Screen->ZapIn(); if ( SUBSC_FADE_IN == 2 ) Screen->ZapOut(); } Waitdraw(); Waitframe(); } } } //Debug void SSTest(int m){ if ( SUBSCREEN_TEST_MODE < m ) return; if ( m == 1 ) { int s[]="Subscreen loaded."; TraceS(s); } if ( m == 2 ) { int s[]="Subscreen while loop running"; TraceS(s); } if ( m == 4 ) { int s[]="Doing clean-up."; TraceS(s); } }