Copy to Clipboard Test

Mog Shop Code

const int MogShop_DefaultFailMessage = 1; // Default message to play when Link can't afford the item

const int MogShop_PriceTag = 1; // use 0 if you don't want to display price tags, otherwise use 1
const int MogShop_FontColour = 0x01; // colour of the price tag font (the 2 digits after "0x" is the code for your colour)
const int MogShop_FontOutline = 0x0F; // colour of the price tag font's outline
const int MogShop_FontType = 16; // which font to use (0 is the Z1 font, 16 is the LA font. you might have to look up std_constants.zh or just experiment)
const int MogShop_FontYOffset = -8; // positional offset of the price tag on the Y axis relative to the FFC

const int MogShop_SoldOutComboID = 1; // ID of the combo for the FFC to be when the item is sold out (can't use 0)
const int MogShop_SoldOutComboCSet = 8; // CSet of the combo

const int MogShop_InteractComboID = 0; // ID of the combo to show above Link's head when he's standing in front of the item. Use 0 if you don't want any.
const int MogShop_InteractComboCSet = 8; // CSet of the combo

ffc script MogShop{
	void run(int ShopItem, int InfoMessage, int Price, int Currency, int OnlyOnceID, int FailMessage, int CollisionStyle){
		// Saves the width and height of the FFC for collision checks
		int Width = 16;
		int Height = 16;
		if(this->EffectWidth!=16)
			Width = this->EffectWidth;
		else if(this->TileWidth>1)
			Width = this->TileWidth*16;
		if(this->EffectHeight!=16)
			Height = this->EffectHeight;
		else if(this->TileHeight>1)
			Height = this->TileHeight*16;
		// Determine collision check position
		int HitX = this->X;
		int HitY = this->Y;
		if ( CollisionStyle != 0 )
			HitY = this->Y + 8;
		
		// Disable the shop if the item is sold out
		int SoldOutComboID = MogShop_SoldOutComboID;
		if ( SoldOutComboID < 0 )
			SoldOutComboID = 1;
		if ( OnlyOnceID >= 0 ) {
			if ( Screen->D[OnlyOnceID] == 1 ) {
				this->Data = SoldOutComboID;
				this->CSet = MogShop_SoldOutComboCSet;
				while(true){
					DrawOverUpdate(this, HitX, HitY, CollisionStyle);
					Waitframe();
				}
			}
		}
		
		// Determine currency
		int CounterToUse = Currency;
		if ( Currency <= 0 )
			CounterToUse = 1;
		
		// Create price tag string
		int PriceTag[100];
		itoa(PriceTag, Price);
		
		// Determine price tag layer
		int PriceTagLayer;
		if ( CollisionStyle != 0 )
			PriceTagLayer = 6;
		
		while(true){
			// Check collision with the item
			bool CanInteract;
			if ( LinkCanInteract() ) {
				// Facing Up
				if(Link->Dir==DIR_UP&&Link->Y>=HitY&&Link->Y<=HitY+Height-8&&Link->X>=HitX-8&&Link->X<=HitX+Width-8)
					CanInteract = true;
				else if ( CollisionStyle == 0 ) { // Only allow other directions when CollisionStyle is 0
					// Facing Down
					if(Link->Dir==DIR_DOWN&&Link->Y>=HitY-16&&Link->Y<=HitY+Height-16&&Link->X>=HitX-8&&Link->X<=HitX+Width-8)
						CanInteract = true;
					// Facing Left
					else if(Link->Dir==DIR_LEFT&&Link->Y>=HitY-8&&Link->Y<=HitY+Height-9&&Link->X>=HitX&&Link->X<=HitX+Width)
						CanInteract = true;
					// Facing Right
					else if(Link->Dir==DIR_RIGHT&&Link->Y>=HitY-8&&Link->Y<=HitY+Height-9&&Link->X>=HitX-16&&Link->X<=HitX+Width-16)
						CanInteract = true;
				}
			}
			
			DrawOverUpdate(this, HitX, HitY, CollisionStyle);
			
			// Draw price tag
			if ( MogShop_PriceTag == 1 ) {
				Screen->DrawString(PriceTagLayer, this->X+8 +1, this->Y+MogShop_FontYOffset, MogShop_FontType, MogShop_FontOutline, -1, TF_CENTERED, PriceTag, OP_OPAQUE);
				Screen->DrawString(PriceTagLayer, this->X+8 -1, this->Y+MogShop_FontYOffset, MogShop_FontType, MogShop_FontOutline, -1, TF_CENTERED, PriceTag, OP_OPAQUE);
				Screen->DrawString(PriceTagLayer, this->X+8, this->Y+MogShop_FontYOffset +1, MogShop_FontType, MogShop_FontOutline, -1, TF_CENTERED, PriceTag, OP_OPAQUE);
				Screen->DrawString(PriceTagLayer, this->X+8, this->Y+MogShop_FontYOffset -1, MogShop_FontType, MogShop_FontOutline, -1, TF_CENTERED, PriceTag, OP_OPAQUE);
				Screen->DrawString(PriceTagLayer, this->X+8, this->Y+MogShop_FontYOffset, MogShop_FontType, MogShop_FontColour, -1, TF_CENTERED, PriceTag, OP_OPAQUE);
			}
			
			// Handle interaction
			if ( CanInteract ) {
				if ( Link->PressA ) {
					Link->InputA = false;
					Link->PressA = false;
					Screen->Message(InfoMessage);
				}
				else if ( Link->PressR ) {
					Link->InputR = false;
					Link->PressR = false;
					
					// Check if affordable
					if ( Game->Counter[CounterToUse] >= Price && (CounterToUse != CR_LIFE || Game->Counter[CR_LIFE] - Price > 0) ) {
						Game->DCounter[CounterToUse] -= Price;
						item drop = CreateItemAt(ShopItem, Link->X, Link->Y);
						SetItemPickup(drop, IP_HOLDUP, true);
						
						if ( OnlyOnceID >= 0 ) { // Check if it can only be bought once
							Screen->D[OnlyOnceID] = 1;
							this->Data = SoldOutComboID;
							this->CSet = MogShop_SoldOutComboCSet;
							while(true){
								DrawOverUpdate(this, HitX, HitY, CollisionStyle);
								Waitframe();
							}
						}
					}
					else { // Can't afford
						if ( FailMessage > 0 )
							Screen->Message(FailMessage);
						else
							Screen->Message(MogShop_DefaultFailMessage);
					}
				}
				else if ( MogShop_InteractComboID > 0 )
					Screen->FastCombo(6, Link->X, Link->Y-16, MogShop_InteractComboID, MogShop_InteractComboCSet, OP_OPAQUE);
			}
			Waitframe();
		}
	}
	bool LinkCanInteract(){
		if ( Link->Action != LA_NONE && Link->Action != LA_WALKING )
			return false;
		if ( Link->Z > 0 )
			return false;
		return true;
	}
	void DrawOverUpdate(ffc this, int HitX, int HitY, int CollisionStyle){
		// Toggle draw-over if CollisionStyle is not 0
		if ( CollisionStyle != 0 ) {
			if ( Link->Y < HitY )
				this->Flags[FFCF_OVERLAY] = true;
			else
				this->Flags[FFCF_OVERLAY] = false;
		}
	}
}