PDA

View Full Version : MSU's Individual Item Shop Script



MasterSwordUltima
02-01-2014, 08:35 PM
So I'm sure this has been done before in various ways - this is just my method. There is definitely room for improvement, but I don't see anything listed here on AGN specifically, so here goes.

[UPDATE]: Added option for buying ammo types, which you can keep buying without leaving the screen.



ffc script MSUShop {
void run(int M_BUY, int I_ITEM, int I_COST, int M_BROKE, int M_SOLDOUT, int I_TYPE) {
// D0 - M_BUY = the message when you make the buy
// D1 - I_ITEM = the item number
// D2 - I_COST = the amount of rupees item costs
// D3 - M_BROKE = the message that plays if you haven't enough cash!
// D4 - M_SOLDOUT = the message that plays if you already have that item
// D5 - I_TYPE = 0 for reg item, 1 for keys, 2 for arrows, 3 for bombs

while(true) {
while(Link->X < this->X - 8 || Link->X > this->X + 24 || Link->Y < this->Y || Link->Y > this->Y + 24 ||

Link->Dir != DIR_UP || !Link->InputA) {
Waitframe();
}

Link->InputA = false;


if(Link->Item[I_ITEM] && I_TYPE == 0)
{
Screen->Rectangle(1, 26, 9, 232, 22, 0, 1, 0, 0, 0, 1, OP_OPAQUE);
Screen->Message(M_SOLDOUT);
}
else if(Game->Counter[CR_RUPEES]<I_COST && !Link->Item[I_ITEM] == 1)
{
Screen->Rectangle(1, 26, 9, 232, 22, 0, 1, 0, 0, 0, 1, OP_OPAQUE);
Screen->Message(M_BROKE);
}
else if(Game->Counter[CR_RUPEES]>=I_COST && (!Link->Item[I_ITEM] || I_TYPE != 0))
{
Screen->Rectangle(1, 26, 9, 232, 22, 0, 1, 0, 0, 0, 1, OP_OPAQUE);
Screen->Message(M_BUY);
if(I_TYPE != 0){
if(I_TYPE == 1){Game->Counter[CR_KEYS]++;}
if(I_TYPE == 2){Game->Counter[CR_ARROWS]++;}
if(I_TYPE == 3){Game->Counter[CR_BOMBS]++;}
}
else if(I_TYPE == 0){
Link->Item[I_ITEM] = true;
this->Data = 0;
}
Game->PlaySound(20);
Game->Counter[CR_RUPEES] = Game->Counter[CR_RUPEES] - I_COST;
}



while(Link->X >= this->X - 8 && Link->X <= this->X + 24 && Link->Y >= this->Y && Link->Y <= this->Y + 24 &&

Link->Dir == DIR_UP) {
Waitframe();
}

Screen->Message(0);
Link->InputA = true;
}


}
}


As explained in the code itself;

D0 = the string that will show when you successfully buy the item
D1 = the item number itself
D2 = the cost of the item (in rupees)
D3 = the string that will show if you don't have enough rupees
D4 = the string that will show if you already have the item
D5 = determines if the item is an ammo type. 0 = regular item. 1 = keys. 2 = arrows. 3 = bombs. 4 = superbombs.

I've also used font SS3, with a Y axis of 4 for this to line up properly. I should probably add a sound in there, but haven't brushed up on the particulars of those variables. All feedback is welcome.

SUCCESSOR
02-02-2014, 12:30 AM
Looks good. There are a couple things I don't like. I wish your variables were more desciptive. r, m, i, etc. are not very readable. Also, "Link->Item[i] == 1".

MasterSwordUltima
02-02-2014, 11:53 AM
Would "!Link->Item[i] != 1" be a better logic flow?

OH, now I see what you meant. Is there any real difference between using 0/1 as opposed to false/true? They both accomplish the same thing, correct?

Saffith
02-02-2014, 01:17 PM
Link->Item[x] is already a bool, so there's no need to compare it against anything.

if(Link->Item[I_ITEM] && I_TYPE == 0)

Functionally, there's no difference between comparing a bool against true/false or 1/0; it's just more logical to compare two data of the same type.

MasterSwordUltima
02-02-2014, 01:42 PM
*nod* Redundancy department of redundancy.

SUCCESSOR
02-02-2014, 07:01 PM
Link->Item[x] is already a bool, so there's no need to compare it against anything.

if(Link->Item[I_ITEM] && I_TYPE == 0)

Functionally, there's no difference between comparing a bool against true/false or 1/0; it's just more logical to compare two data of the same type.

Yes, this is what I was talking about. The redundancy only bothers me a little, but compairing a bool to 0 or 1 could be confusing to people and if you are sharing a script the less confusing and easier it is to read the better. I do prefer letting a bool stand on it's own. I mean, you did it with Link->Input but not Link->Item? Be consistant.

SUCCESSOR
02-22-2014, 03:13 AM
MasterSwordUltima, I noticed when you purchase the items you are setting the item to true or increasing the counter. You could alternatively create the item right on top of Link that way(if the item is set up for it) Link will hold it above his head and the "Got something" SFX will play. Also if the item has a pickup script it will run.

Shadowblitz16
12-28-2016, 10:05 PM
So I'm sure this has been done before in various ways - this is just my method. There is definitely room for improvement, but I don't see anything listed here on AGN specifically, so here goes.

[UPDATE]: Added option for buying ammo types, which you can keep buying without leaving the screen.



ffc script MSUShop {
void run(int M_BUY, int I_ITEM, int I_COST, int M_BROKE, int M_SOLDOUT, int I_TYPE) {
// D0 - M_BUY = the message when you make the buy
// D1 - I_ITEM = the item number
// D2 - I_COST = the amount of rupees item costs
// D3 - M_BROKE = the message that plays if you haven't enough cash!
// D4 - M_SOLDOUT = the message that plays if you already have that item
// D5 - I_TYPE = 0 for reg item, 1 for keys, 2 for arrows, 3 for bombs

while(true) {
while(Link->X < this->X - 8 || Link->X > this->X + 24 || Link->Y < this->Y || Link->Y > this->Y + 24 ||

Link->Dir != DIR_UP || !Link->InputA) {
Waitframe();
}

Link->InputA = false;


if(Link->Item[I_ITEM] && I_TYPE == 0)
{
Screen->Rectangle(1, 26, 9, 232, 22, 0, 1, 0, 0, 0, 1, OP_OPAQUE);
Screen->Message(M_SOLDOUT);
}
else if(Game->Counter[CR_RUPEES]<I_COST && !Link->Item[I_ITEM] == 1)
{
Screen->Rectangle(1, 26, 9, 232, 22, 0, 1, 0, 0, 0, 1, OP_OPAQUE);
Screen->Message(M_BROKE);
}
else if(Game->Counter[CR_RUPEES]>=I_COST && (!Link->Item[I_ITEM] || I_TYPE != 0))
{
Screen->Rectangle(1, 26, 9, 232, 22, 0, 1, 0, 0, 0, 1, OP_OPAQUE);
Screen->Message(M_BUY);
if(I_TYPE != 0){
if(I_TYPE == 1){Game->Counter[CR_KEYS]++;}
if(I_TYPE == 2){Game->Counter[CR_ARROWS]++;}
if(I_TYPE == 3){Game->Counter[CR_BOMBS]++;}
}
else if(I_TYPE == 0){
Link->Item[I_ITEM] = true;
this->Data = 0;
}
Game->PlaySound(20);
Game->Counter[CR_RUPEES] = Game->Counter[CR_RUPEES] - I_COST;
}



while(Link->X >= this->X - 8 && Link->X <= this->X + 24 && Link->Y >= this->Y && Link->Y <= this->Y + 24 &&

Link->Dir == DIR_UP) {
Waitframe();
}

Screen->Message(0);
Link->InputA = true;
}


}
}


As explained in the code itself;

D0 = the string that will show when you successfully buy the item
D1 = the item number itself
D2 = the cost of the item (in rupees)
D3 = the string that will show if you don't have enough rupees
D4 = the string that will show if you already have the item
D5 = determines if the item is an ammo type. 0 = regular item. 1 = keys. 2 = arrows. 3 = bombs. 4 = superbombs.

I've also used font SS3, with a Y axis of 4 for this to line up properly. I should probably add a sound in there, but haven't brushed up on the particulars of those variables. All feedback is welcome.

is this a gameboy styled shop?
it could be made into one by creating a npc ffc and allowing the option to make players have to pick up the item and talk to the shop keeper

MasterSwordUltima
12-29-2016, 04:34 PM
Uh, kinda sorta. You don't pick up the item and carry it to a cashier. It's basically you stand underneath it and press A to purchase it if you have enough cash.

Tim
12-29-2016, 08:48 PM
Sounds more like LttP.

Sweet