diff --git a/C++ProjectTemplate b/C++ProjectTemplate index ba31dac..8516c28 100755 Binary files a/C++ProjectTemplate and b/C++ProjectTemplate differ diff --git a/assets/maps/map0 b/assets/maps/map0 index 7aecd45..901eaed 100644 --- a/assets/maps/map0 +++ b/assets/maps/map0 @@ -80,7 +80,8 @@ OBJECT256.000000;256.000000;8 OBJECT224.000000;256.000000;8 OBJECT192.000000;256.000000;8 OBJECT160.000000;256.000000;8 -OBJECT322.000000;255.000000;0 +OBJECT512.000000;288.000000;158 +OBJECT333.000000;286.000000;0 OBJECT256.000000;288.000000;90 OBJECT128.000000;288.000000;90 OBJECT192.000000;320.000000;90 diff --git a/main.cpp b/main.cpp index e3a4827..b17fce5 100644 --- a/main.cpp +++ b/main.cpp @@ -165,6 +165,30 @@ EquipSlot::Equip EQUIP_MENU_SLOT=EquipSlot::WEAPON; int EQUIP_ITEM_MENU_CURSOR=0; int EQUIP_ITEM_MENU_OFFSET=0; std::vector EQUIP_ITEM_MENU_CONTENTS={}; +std::vector> SHOP_MENU_CONTENTS={}; +std::array MESSAGE_BOX_DIALOG_ANSWERS={}; +std::array MESSAGE_BOX_CHOICE_LIST={"","",""}; +bool waitingForChoice=false; + +/* + [Choice1,Choice2,Choice3] + After a choice, dialog parser will jump to appropriate branch labeled as: + 0: Stuff + 1: Stuff + 2: Stuff + + In addition, each branch will store its choice selector in an incrementing variable. +*/ +void DisplayMessageBox(std::string targetT) { + targetText=targetT; + messageBoxText=""; + messageBoxFinalText=""; + messageBoxLoad=true; + messageBoxVisible=true; + messageBoxMarker=0; + messageBoxStartMarker=0; + messageBoxStopMarker=0; +} bool MOUSE_PRESSED_DOWN=false,MOUSE_DOWN=false,MOUSE_RELEASED=false; //TODO Implement Mouse things. @@ -406,7 +430,7 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"), } } } else { - while (messageBoxMarkerSetDrawTarget(layer::COLLISION); - Pixel collisionData = GAME->GetDrawTarget()->GetPixel((int)pos.x-cameraPos.x,(int)pos.y-cameraPos.y); - return collisionData!=MAGENTA; + int id; + Animation*spr; + int frameIndex=0; + int frameCount=0; + int animationSpd=12; //How many frames to wait between each frame. Setting to 0 pauses the animation. + std::string name; + Pixel color=WHITE; + vd2d originPoint={0,0}; + bool drawn=false; + Flag disableFlag=Flag::NONE; + Flag enableFlag=Flag::NONE; + int objArrElement; //Which element in the object array this object is located in. For sorting purposes. + bool temp=false; //If set to true, it's marked for deletion after cutscene handling. + bool enc=false; //If set to true, it's not included in the main list of entities for map saving because it's from an encounter. + bool dead=false; //If set to true, this object was properly part of an Entity and got declared as dead. + int blinkFrames=0; //Frame count of how much time is left for the image to be blinking. Used when enemies take damage. + //animationSpd is how long to wait before switching frames. + bool highlighted=false; //Whether or not this object has been declared as highlighted by a target range selector. + bool Collision(vd2d pos) { + GAME->SetDrawTarget(layer::COLLISION); + Pixel collisionData = GAME->GetDrawTarget()->GetPixel((int)pos.x-cameraPos.x,(int)pos.y-cameraPos.y); + return collisionData!=MAGENTA; + } + //A grid version of the constructor. used ONLY for battle setups. + Object(int id,std::string name,int gridx,int gridy,Animation*spr,vd2d scale={1,1},Pixel color=WHITE,int animationSpd=1,bool temp=false) + :Object(id,name,{gridx*32-(spr->width*0.5)*(scale.x-1),gridy*32-(spr->spr->sprite->height-4)*(scale.y-1)},spr,scale,color,animationSpd,temp) {} + Object(int id,std::string name,vd2d pos,Animation*spr,vd2d scale={1,1},Pixel color=WHITE,int animationSpd=1,bool temp=false) { + this->spr=spr; + this->pos=pos; + this->id=id; + this->name=name; + this->color=color; + this->animationSpd=animationSpd; + SetScale(scale); + this->temp=temp; + } + virtual Object* CreateType(int id,std::string name,vd2d pos,Animation*spr,vd2d scale={1,1},Pixel color=WHITE,int animationSpd=1,bool temp=false)=0; + //When the player tries to interact with this object. + virtual Interaction Interact()=0; + void SetScale(vd2d scale) { + this->scale=scale; + if (spr!=nullptr) { + this->originPoint={spr->width/2*scale.x,(spr->spr->sprite->height-4)*scale.y}; } - //A grid version of the constructor. used ONLY for battle setups. - Object(int id,std::string name,int gridx,int gridy,Animation*spr,vd2d scale={1,1},Pixel color=WHITE,int animationSpd=1,bool temp=false) - :Object(id,name,{gridx*32-(spr->width*0.5)*(scale.x-1),gridy*32-(spr->spr->sprite->height-4)*(scale.y-1)},spr,scale,color,animationSpd,temp) {} - Object(int id,std::string name,vd2d pos,Animation*spr,vd2d scale={1,1},Pixel color=WHITE,int animationSpd=1,bool temp=false) { - this->spr=spr; - this->pos=pos; - this->id=id; - this->name=name; - this->color=color; - this->animationSpd=animationSpd; - SetScale(scale); - this->temp=temp; + } + vd2d GetScale() { + return scale; + } + vd2d GetPos() { + return pos; + } + void Move(vd2d move); + void SetPos(vd2d pos) { + Move(pos-this->pos); + } + vd2d GetPosWithOrigin() { + return GetPos()+originPoint; + } + bool SmoothMove(vd2d move) { + const int wiggleRoom=5; + vd2d originPos = {pos.x+originPoint.x,pos.y-1+originPoint.y}; + if (!Collision(originPos+move)) { + Move(move); + return true; + } else + if (move.x!=0&&!Collision({originPos.x+move.x,originPos.y})) { + Move({move.x,0}); + return true; + } else + if (move.y!=0&&!Collision({originPos.x,originPos.y+move.y})) { + Move({0,move.y}); + return true; } - virtual Object* CreateType(int id,std::string name,vd2d pos,Animation*spr,vd2d scale={1,1},Pixel color=WHITE,int animationSpd=1,bool temp=false)=0; - //When the player tries to interact with this object. - virtual Interaction Interact()=0; - void SetScale(vd2d scale) { - this->scale=scale; - if (spr!=nullptr) { - this->originPoint={spr->width/2*scale.x,(spr->spr->sprite->height-4)*scale.y}; - } - } - vd2d GetScale() { - return scale; - } - vd2d GetPos() { - return pos; - } - void Move(vd2d move); - void SetPos(vd2d pos) { - Move(pos-this->pos); - } - vd2d GetPosWithOrigin() { - return GetPos()+originPoint; - } - bool SmoothMove(vd2d move) { - const int wiggleRoom=5; - vd2d originPos = {pos.x+originPoint.x,pos.y-1+originPoint.y}; - if (!Collision(originPos+move)) { - Move(move); - return true; - } else - if (move.x!=0&&!Collision({originPos.x+move.x,originPos.y})) { - Move({move.x,0}); - return true; - } else - if (move.y!=0&&!Collision({originPos.x,originPos.y+move.y})) { - Move({0,move.y}); - return true; - } - else - if (move.x>0) { - for (int i=0;i0) { + for (int i=0;i0) { - for (int i=0;i0) { + for (int i=0;i> itemList; + std::string welcomeMessage="Welcome! Please choose an option: [BUY,SELL]"; + Interaction Interact()override{ + return {{welcomeMessage}}; + } +}; #endif \ No newline at end of file diff --git a/references.h b/references.h index 58080f8..bf183fd 100644 --- a/references.h +++ b/references.h @@ -159,7 +159,7 @@ enum Reference{ NPC16_8, NPC17_8, NPC18_8, - NPC19_8, + SHOPKEEPER, TRASH_CAN }; diff --git a/states.h b/states.h index b4dc715..edaa8a3 100644 --- a/states.h +++ b/states.h @@ -17,6 +17,8 @@ namespace GameState{ OVERWORLD_EQUIP_PLAYER_MENU, OVERWORLD_STATUS_MENU, OVERWORLD_TARGET_MENU, + SHOPKEEPER_MENU, + SHOPKEEPER_ASK_MENU, }; }