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]);
}
}
}