Implement a custom object with Interaction

Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
master
sigonasr2 2 years ago
parent fcdfc8065b
commit 46b113d3bb
  1. BIN
      C++ProjectTemplate
  2. 3
      assets/maps/map0
  3. 58
      main.cpp
  4. 16
      object.h

Binary file not shown.

@ -69,6 +69,7 @@ OBJECT256.000000;192.000000;8
OBJECT288.000000;192.000000;8 OBJECT288.000000;192.000000;8
OBJECT224.000000;192.000000;8 OBJECT224.000000;192.000000;8
OBJECT192.000000;192.000000;7 OBJECT192.000000;192.000000;7
OBJECT352.000000;192.000000;159
OBJECT192.000000;224.000000;8 OBJECT192.000000;224.000000;8
OBJECT160.000000;224.000000;8 OBJECT160.000000;224.000000;8
OBJECT288.000000;224.000000;8 OBJECT288.000000;224.000000;8
@ -79,9 +80,9 @@ OBJECT256.000000;256.000000;8
OBJECT224.000000;256.000000;8 OBJECT224.000000;256.000000;8
OBJECT192.000000;256.000000;8 OBJECT192.000000;256.000000;8
OBJECT160.000000;256.000000;8 OBJECT160.000000;256.000000;8
OBJECT322.000000;255.000000;0
OBJECT256.000000;288.000000;90 OBJECT256.000000;288.000000;90
OBJECT128.000000;288.000000;90 OBJECT128.000000;288.000000;90
OBJECT322.000000;288.000000;0
OBJECT192.000000;320.000000;90 OBJECT192.000000;320.000000;90
OBJECT96.000000;320.000000;90 OBJECT96.000000;320.000000;90
OBJECT160.000000;384.000000;90 OBJECT160.000000;384.000000;90

@ -149,6 +149,8 @@ public:
std::vector<Item*> BATTLE_SPOILS_LIST; std::vector<Item*> BATTLE_SPOILS_LIST;
std::wstring BATTLE_SPOILS_MESSAGE; std::wstring BATTLE_SPOILS_MESSAGE;
int OVERWORLD_MENU_SELECTION=0; int OVERWORLD_MENU_SELECTION=0;
std::vector<std::string> INTERACTION_MESSAGES;
bool CLOSE_OVERWORLD_WINDOW=false; //When set to true, should cause the overworld menu to close as well once the dialog box is closed.
bool MOUSE_PRESSED_DOWN=false,MOUSE_DOWN=false,MOUSE_RELEASED=false; //TODO Implement Mouse things. bool MOUSE_PRESSED_DOWN=false,MOUSE_DOWN=false,MOUSE_RELEASED=false; //TODO Implement Mouse things.
@ -299,6 +301,10 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"),
messageBoxLoad=true; messageBoxLoad=true;
} else { } else {
messageBoxVisible=false; messageBoxVisible=false;
if (CLOSE_OVERWORLD_WINDOW) {
GAME_STATE=GameState::GAME_WORLD;
}
CLOSE_OVERWORLD_WINDOW=false;
} }
} else { } else {
while (messageBoxMarker<messageBoxFinalText.length()) { while (messageBoxMarker<messageBoxFinalText.length()) {
@ -322,6 +328,11 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"),
} }
} }
if (PlayerCanMove()&&INTERACTION_MESSAGES.size()>0) {
DisplayMessageBox(INTERACTION_MESSAGES.front());
INTERACTION_MESSAGES.erase(INTERACTION_MESSAGES.begin());
}
for (int i=0;i<DAMAGE_NUMBERS.size();i++) { for (int i=0;i<DAMAGE_NUMBERS.size();i++) {
DamageNumber*numb=DAMAGE_NUMBERS[i]; DamageNumber*numb=DAMAGE_NUMBERS[i];
if (numb->timer>0) { if (numb->timer>0) {
@ -1031,6 +1042,53 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"),
OVERWORLD_MENU_SELECTION+=5; OVERWORLD_MENU_SELECTION+=5;
} }
} }
if (ACTIONKEYPRESSED) {
switch (OVERWORLD_MENU_SELECTION) {
case 0:{//Check is selected.
Object*closest=nullptr;
float closestDist=999999;
for (int i=0;i<OBJECTS.size();i++) {
float dist;
for (int j=0;j<PARTY_MEMBER_COUNT;j++) {
if (OBJECTS[i]==PARTY_MEMBER_OBJ[j]) {
goto next;
}
} //Make sure it's not a party member.
dist = abs(PARTY_MEMBER_OBJ[0]->GetPos().x-OBJECTS[i]->GetPos().x)+abs(PARTY_MEMBER_OBJ[0]->GetPos().y-OBJECTS[i]->GetPos().y);
if (dist<closestDist) {
closestDist=dist;
closest=OBJECTS[i];
}
next:
continue;
}
if (closest!=nullptr) {
//Run the Interaction for this object.
Interaction interaction = closest->Interact();
if (interaction.messages.size()>0) {
INTERACTION_MESSAGES=interaction.messages;
DisplayMessageBox(INTERACTION_MESSAGES.front());
INTERACTION_MESSAGES.erase(INTERACTION_MESSAGES.begin());
} else {
DisplayMessageBox("No problem here.");
}
CLOSE_OVERWORLD_WINDOW=true;
}
}break;
case 1:{//Power is selected.
}break;
case 2:{//Items is selected.
}break;
case 3:{//Equip is selected.
}break;
case 4:{//Status is selected.
}break;
}
}
}break; }break;
case GameState::EDITOR:{ case GameState::EDITOR:{
if (IsTextEntryEnabled()) { if (IsTextEntryEnabled()) {

@ -5,8 +5,15 @@
#include "animation.h" #include "animation.h"
#include "defines.h" #include "defines.h"
#include "layers.h" #include "layers.h"
#include "item.h"
using namespace olc; using namespace olc;
struct Interaction{
std::vector<std::string> messages={};
Item*item=nullptr;
Flag flag=Flag::NONE;
};
class Object{ class Object{
private: private:
vd2d scale={1,1}; vd2d scale={1,1};
@ -49,7 +56,8 @@ class Object{
this->temp=temp; 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; 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;
virtual bool Interact()=0; //When the player tries to interact with this object.
virtual Interaction Interact()=0;
void SetScale(vd2d scale) { void SetScale(vd2d scale) {
this->scale=scale; this->scale=scale;
if (spr!=nullptr) { if (spr!=nullptr) {
@ -162,11 +170,13 @@ class Object{
class Standard_Obj : public Object{ class Standard_Obj : public Object{
DynamicObject(Standard_Obj) DynamicObject(Standard_Obj)
bool Interact()override{return false;} Interaction Interact()override{return {};}
}; };
class TrashCan_Obj : public Object{ class TrashCan_Obj : public Object{
DynamicObject(TrashCan_Obj) DynamicObject(TrashCan_Obj)
bool Interact()override{return false;} Interaction Interact()override{
frameIndex=1;
return {{"You dig around the trash can.","Nope! Just looks like good ol' trash."}};}
}; };
#endif #endif
Loading…
Cancel
Save