Copy to Clipboard Test

Time/Use Limit Item Code

int TIME_LIMIT_ITEM[256];//global array used to track item limits.



//Returns ID of item from itemdata pointer

int ItemID (itemdata it){

	for (int i=0; i<256; i++){

		itemdata n = Game->LoadItemData(i);

		if (it==n) return i;

	}

	return -1;

}



//Sets either time, or use count limit, after it expiring Link loses this item. Uses OnPickup item script slot.

//D0 - unused

//D1 - Use count/Time limit, if  D1 >0 - time limit, in second. If <0, Abs -> Item Durability, use count, ala Minecraft.

//D2 - Sound to play on expiration.

//D3 - message to render,  when item expires.

//D4 - pickup string.

item script SetItemLimit{

	void run(int ID, int count, int endsfx, int endstr, int pickstr){

		int id = ItemID (this);

		if (this->InitD[1]>0) count*=60;

		TIME_LIMIT_ITEM[id] = count; 

		Screen->Message(pickstr);

	}

}



//Reduce counter per use and remove item, if it expires. Uses OnAction item script slot.

//Arguments are the same as SetItemLimit item script.

item script UpdateItemDurability{

	void run(int ID, int count, int sfx, int msg){

		int str[] = "TimeLimitItemController";

		int scr = Game->GetFFCScript(str);

		int id = ItemID (this);

		ffc f;

		for (int i=1;i<=32;i++){

			f=Screen->LoadFFC(i);

			if (f->Script!=scr) continue;

			if (f->InitD[0]==id || f->InitD[0]==0) Quit();

		}

		TIME_LIMIT_ITEM[id]++;

		if(TIME_LIMIT_ITEM[id] == 0){

			int itemid = ItemID (this);

			Game->PlaySound(sfx);

			Screen->Message(msg);

			Link->Item[itemid]=false;

		}

	}

}



global script Init{

	void run(){

		for (int i=0;i<255;i++){

			TIME_LIMIT_ITEM[i]=0;

		}

	}

}



global script TimeLimitItem{

	void run(){

		while(true){

			Waitdraw();

			UpdateTimeLimitItems();

			Waitframe();

		}

	}

}



//FFC script to control whether time limit is running for items or not.

//Place invicible FFC anywhere in the screen.

//D0 - Item to be excempt for time expiration in this screen. 0 - all time-limited items.

ffc script TimeLimitItemController{

	void run(){

		while(true){

			Waitframe();

		}

	}

}



//Function for updating time-limited items. Must be called inside main loop of global script.

void UpdateTimeLimitItems(){

	int str[] = "TimeLimitItemController";

	int scr = Game->GetFFCScript(str);

	int ffcid = FindFFCRunning(scr);

	ffc f;

	if (ffcid>0){

		f=Screen->LoadFFC(ffcid);

		if (f->InitD[0]==0) return;

	}

	bool ignore = false;

	for (int i=0;i<255;i++){

		ignore=false;

		if (ffcid>0){

			for (int j=1;j<=32;j++){

				f=Screen->LoadFFC(j);

				if (f->Script!=scr) continue;

				if (f->InitD[0]==i) ignore=true;

			}

		}

		if (ignore) continue;

		itemdata it = Game->LoadItemData(i);

		if (TIME_LIMIT_ITEM[i]<=0)continue;

		if (it->InitD[1]<0)continue;

		TIME_LIMIT_ITEM[i]--;

		if (TIME_LIMIT_ITEM[i]==0){

			Link->Item[i]=false;

			Game->PlaySound(it->InitD[2]);

			Screen->Message(it->InitD[3]);

		}

	}

}