Party member system setup

Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
master
sigonasr2 2 years ago
parent 29284803f2
commit dbc07b4eac
  1. BIN
      C++ProjectTemplate
  2. 60
      assets/maps/map0
  3. 7
      flags.h
  4. 90
      main.cpp
  5. 6
      references.h

Binary file not shown.

@ -48,38 +48,38 @@
???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
OBJECT256.000000;128.000000;2 OBJECT256.000000;128.000000;8
OBJECT224.000000;128.000000;2 OBJECT224.000000;128.000000;8
OBJECT160.000000;128.000000;2 OBJECT160.000000;128.000000;8
OBJECT192.000000;128.000000;2 OBJECT192.000000;128.000000;8
OBJECT288.000000;128.000000;2 OBJECT288.000000;128.000000;8
OBJECT313.000000;131.000000;4 OBJECT313.000000;131.000000;10
OBJECT192.000000;160.000000;2 OBJECT192.000000;160.000000;8
OBJECT160.000000;160.000000;2 OBJECT160.000000;160.000000;8
OBJECT256.000000;160.000000;2 OBJECT256.000000;160.000000;8
OBJECT224.000000;160.000000;1 OBJECT224.000000;160.000000;7
OBJECT288.000000;160.000000;1 OBJECT288.000000;160.000000;7
OBJECT313.000000;136.000000;5 OBJECT313.000000;136.000000;11
OBJECT313.000000;141.000000;6 OBJECT313.000000;141.000000;12
OBJECT313.000000;151.000000;8 OBJECT313.000000;151.000000;8
OBJECT288.000000;160.000000;3 OBJECT288.000000;160.000000;9
OBJECT224.000000;160.000000;3 OBJECT224.000000;160.000000;9
OBJECT160.000000;192.000000;2 OBJECT160.000000;192.000000;8
OBJECT256.000000;192.000000;2 OBJECT256.000000;192.000000;8
OBJECT288.000000;192.000000;2 OBJECT288.000000;192.000000;8
OBJECT224.000000;192.000000;2 OBJECT224.000000;192.000000;8
OBJECT192.000000;192.000000;1 OBJECT192.000000;192.000000;7
OBJECT192.000000;224.000000;2 OBJECT192.000000;224.000000;8
OBJECT160.000000;224.000000;2 OBJECT160.000000;224.000000;8
OBJECT288.000000;224.000000;2 OBJECT288.000000;224.000000;8
OBJECT224.000000;224.000000;2 OBJECT224.000000;224.000000;8
OBJECT256.000000;224.000000;1 OBJECT256.000000;224.000000;7
OBJECT212.000000;228.000000;0 OBJECT212.000000;228.000000;0
OBJECT288.000000;256.000000;2 OBJECT288.000000;256.000000;8
OBJECT256.000000;256.000000;2 OBJECT256.000000;256.000000;8
OBJECT224.000000;256.000000;2 OBJECT224.000000;256.000000;8
OBJECT192.000000;256.000000;2 OBJECT192.000000;256.000000;8
OBJECT160.000000;256.000000;2 OBJECT160.000000;256.000000;8
ENCOUNTER64;64;90;0 ENCOUNTER64;64;90;0
ENCOUNTER64;256;90;1 ENCOUNTER64;256;90;1
ENCOUNTER64;512;90;2 ENCOUNTER64;512;90;2

@ -3,6 +3,13 @@ enum class Flag:int{
TEST_FLAG1, TEST_FLAG1,
TEST_FLAG2, TEST_FLAG2,
TEST_FLAG3, TEST_FLAG3,
HAS_MAIN,
HAS_NESS,
HAS_PAULA,
HAS_JEFF,
HAS_ANNA,
HAS_KING,
HAS_POO,
}; };

@ -18,6 +18,7 @@
#define TILEMAP_SIZE_Y 512 #define TILEMAP_SIZE_Y 512
#define TILEMAP_EDITOR_DRAW_MULT 0.4375 #define TILEMAP_EDITOR_DRAW_MULT 0.4375
#define TILEMAP_EDITOR_TILESIZE (32*TILEMAP_EDITOR_DRAW_MULT) #define TILEMAP_EDITOR_TILESIZE (32*TILEMAP_EDITOR_DRAW_MULT)
#define PARTY_TRAIL_LENGTH 48
#define AddAsyncCutsceneAction(AsyncClass) \ #define AddAsyncCutsceneAction(AsyncClass) \
if (!((AsyncClass*)CurrentCutscene->GetAction())->InQueue()) { \ if (!((AsyncClass*)CurrentCutscene->GetAction())->InQueue()) { \
@ -128,26 +129,26 @@ class Object{
void SetPos(vd2d pos) { void SetPos(vd2d pos) {
Move(pos-this->pos); Move(pos-this->pos);
} }
void SmoothMove(vd2d move) { bool SmoothMove(vd2d move) {
const int wiggleRoom=5; const int wiggleRoom=5;
vd2d originPos = {pos.x+originPoint.x,pos.y-1+originPoint.y}; vd2d originPos = {pos.x+originPoint.x,pos.y-1+originPoint.y};
if (!Collision(originPos+move)) { if (!Collision(originPos+move)) {
Move(move); Move(move);
return; return true;
} else } else
if (move.x>0) { if (move.x>0) {
for (int i=0;i<wiggleRoom;i++) { //Search Up. for (int i=0;i<wiggleRoom;i++) { //Search Up.
if (!Collision({originPos.x+move.x,originPos.y-i})) { if (!Collision({originPos.x+move.x,originPos.y-i})) {
//There is potentially to move up-right here, so we will do so. //There is potentially to move up-right here, so we will do so.
Move({0,-1}); Move({0,-1});
return; return true;
} }
} }
for (int i=0;i<wiggleRoom;i++) { //Search Down. for (int i=0;i<wiggleRoom;i++) { //Search Down.
if (!Collision({originPos.x+move.x,originPos.y+i})) { if (!Collision({originPos.x+move.x,originPos.y+i})) {
//There is potentially to move down-right here, so we will do so. //There is potentially to move down-right here, so we will do so.
Move({0,1}); Move({0,1});
return; return true;
} }
} }
} else } else
@ -156,14 +157,14 @@ class Object{
if (!Collision({originPos.x+move.x,originPos.y-i})) { if (!Collision({originPos.x+move.x,originPos.y-i})) {
//There is potentially to move up-left here, so we will do so. //There is potentially to move up-left here, so we will do so.
Move({0,-1}); Move({0,-1});
return; return true;
} }
} }
for (int i=0;i<wiggleRoom;i++) { //Search Down. for (int i=0;i<wiggleRoom;i++) { //Search Down.
if (!Collision({originPos.x+move.x,originPos.y+i})) { if (!Collision({originPos.x+move.x,originPos.y+i})) {
//There is potentially to move down-left here, so we will do so. //There is potentially to move down-left here, so we will do so.
Move({0,1}); Move({0,1});
return; return true;
} }
} }
} else } else
@ -172,14 +173,14 @@ class Object{
if (!Collision({originPos.x-i,originPos.y+move.y})) { if (!Collision({originPos.x-i,originPos.y+move.y})) {
//There is potentially to move down-left here, so we will do so. //There is potentially to move down-left here, so we will do so.
Move({-1,0}); Move({-1,0});
return; return true;
} }
} }
for (int i=0;i<wiggleRoom;i++) { //Search Right. for (int i=0;i<wiggleRoom;i++) { //Search Right.
if (!Collision({originPos.x+i,originPos.y+move.y})) { if (!Collision({originPos.x+i,originPos.y+move.y})) {
//There is potentially to move down-right here, so we will do so. //There is potentially to move down-right here, so we will do so.
Move({1,0}); Move({1,0});
return; return true;
} }
} }
} else } else
@ -188,17 +189,18 @@ class Object{
if (!Collision({originPos.x-i,originPos.y+move.y})) { if (!Collision({originPos.x-i,originPos.y+move.y})) {
//There is potentially to move up-left here, so we will do so. //There is potentially to move up-left here, so we will do so.
Move({-1,0}); Move({-1,0});
return; return true;
} }
} }
for (int i=0;i<wiggleRoom;i++) { //Search Right. for (int i=0;i<wiggleRoom;i++) { //Search Right.
if (!Collision({originPos.x+i,originPos.y+move.y})) { if (!Collision({originPos.x+i,originPos.y+move.y})) {
//There is potentially to move up-right here, so we will do so. //There is potentially to move up-right here, so we will do so.
Move({1,0}); Move({1,0});
return; return true;
} }
} }
} }
return false;
} }
}; };
@ -256,6 +258,11 @@ class Entity{
bool dumb=false; bool dumb=false;
Object* obj; Object* obj;
std::vector<Battle::Move*> moveSet; std::vector<Battle::Move*> moveSet;
//Used for initializing players.
Entity(int HP,int maxHP,int baseAtk,std::array<int,4>resistances,int speed,std::vector<Battle::Move*>moveSet,int damageReduction=0,bool smart=false,bool dumb=false) {
Entity(nullptr,HP,maxHP,baseAtk,resistances,speed,moveSet,damageReduction,smart,dumb);
}
//Use this for initializing enemies as it lets you specify an object.
Entity(Object*obj,int HP,int maxHP,int baseAtk,std::array<int,4>resistances,int speed,std::vector<Battle::Move*>moveSet,int damageReduction=0,bool smart=false,bool dumb=false) { Entity(Object*obj,int HP,int maxHP,int baseAtk,std::array<int,4>resistances,int speed,std::vector<Battle::Move*>moveSet,int damageReduction=0,bool smart=false,bool dumb=false) {
this->obj=obj; this->obj=obj;
this->HP=this->targetHP=HP; this->HP=this->targetHP=HP;
@ -326,7 +333,7 @@ public:
int SELECTED_OBJ_ID = PLAYER; int SELECTED_OBJ_ID = PLAYER;
int OBJ_DISPLAY_OFFSET = 0; int OBJ_DISPLAY_OFFSET = 0;
bool GAME_FLAGS[128]={}; bool GAME_FLAGS[128]={};
Object* PLAYER_OBJ; std::array<Object*,4> PARTY_MEMBER_OBJ;
bool messageBoxVisible=false; bool messageBoxVisible=false;
std::string messageBoxText=""; std::string messageBoxText="";
std::string targetText=""; std::string targetText="";
@ -343,6 +350,8 @@ public:
double CUTSCENE_FADE_VALUE=0; double CUTSCENE_FADE_VALUE=0;
std::vector<CutsceneAction*>CUTSCENE_QUEUE; std::vector<CutsceneAction*>CUTSCENE_QUEUE;
std::map<BattleMoveName,Battle::Move*>MOVELIST; std::map<BattleMoveName,Battle::Move*>MOVELIST;
std::array<vd2d,PARTY_TRAIL_LENGTH> partyTrail={vd2d{0,0}};
int PARTY_MEMBER_COUNT = 1;
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.
@ -377,6 +386,10 @@ public:
SetGameFlag(Flag::TEST_FLAG1,false); SetGameFlag(Flag::TEST_FLAG1,false);
SetGameFlag(Flag::TEST_FLAG2,false); SetGameFlag(Flag::TEST_FLAG2,false);
SetGameFlag(Flag::TEST_FLAG3,false); SetGameFlag(Flag::TEST_FLAG3,false);
SetGameFlag(Flag::HAS_MAIN,true);
SetGameFlag(Flag::HAS_NESS,true);
SetGameFlag(Flag::HAS_PAULA,true);
SetGameFlag(Flag::HAS_ANNA,true);
additionalChars[0x391]={0,0}; additionalChars[0x391]={0,0};
additionalChars[0x392]={8,0}; additionalChars[0x392]={8,0};
@ -613,16 +626,24 @@ goes on a very long time, I hope you can understand this is only for testing pur
} }
if (PlayerCanMove()) { if (PlayerCanMove()) {
if (GetKey(I).bHeld) { if (GetKey(I).bHeld) {
PLAYER_OBJ->SmoothMove({0,-1}); if (PARTY_MEMBER_OBJ[0]->SmoothMove({0,-1})) {
UpdatePlayerTrail({0,-1});
}
} }
if (GetKey(K).bHeld) { if (GetKey(K).bHeld) {
PLAYER_OBJ->SmoothMove({0,1}); if (PARTY_MEMBER_OBJ[0]->SmoothMove({0,1})) {
UpdatePlayerTrail({0,1});
}
} }
if (GetKey(J).bHeld) { if (GetKey(J).bHeld) {
PLAYER_OBJ->SmoothMove({-1,0}); if (PARTY_MEMBER_OBJ[0]->SmoothMove({-1,0})) {
UpdatePlayerTrail({-1,0});
}
} }
if (GetKey(L).bHeld) { if (GetKey(L).bHeld) {
PLAYER_OBJ->SmoothMove({1,0}); if (PARTY_MEMBER_OBJ[0]->SmoothMove({1,0})) {
UpdatePlayerTrail({1,0});
}
} }
} }
int selectedTileX=(GetMouseX()+cameraPos.x)/32; int selectedTileX=(GetMouseX()+cameraPos.x)/32;
@ -989,7 +1010,9 @@ goes on a very long time, I hope you can understand this is only for testing pur
delete OBJECTS[i]; delete OBJECTS[i];
} }
OBJECTS.clear(); OBJECTS.clear();
PLAYER_OBJ=nullptr; for (int i=0;i<4;i++) {
PARTY_MEMBER_OBJ[i]=nullptr;
}
std::string data; std::string data;
while (f.good()) { while (f.good()) {
f>>data; f>>data;
@ -1189,6 +1212,12 @@ goes on a very long time, I hope you can understand this is only for testing pur
void SetupObjectInfo() { void SetupObjectInfo() {
CreateObjectInfo(PLAYER,"player",{0,0},"player.png",32,{1,1},WHITE); CreateObjectInfo(PLAYER,"player",{0,0},"player.png",32,{1,1},WHITE);
CreateObjectInfo(NESS,"Ness",{0,0},"player.png",32,{1,1},YELLOW);
CreateObjectInfo(PAULA,"Paula",{0,0},"player.png",32,{1,1},MAGENTA);
CreateObjectInfo(JEFF,"Jeff",{0,0},"player.png",32,{1,1},DARK_GREEN);
CreateObjectInfo(ANNA,"Anna",{0,0},"player.png",32,{1,1},DARK_MAGENTA);
CreateObjectInfo(KING,"King",{0,0},"player.png",32,{1,1},GREY);
CreateObjectInfo(POO,"Poo",{0,0},"player.png",32,{1,1},DARK_GREY);
CreateObjectInfo(NPC1,"npc1",{0,0},"player.png",32,{1,1},RED,Flag::NONE,Flag::NONE,60); CreateObjectInfo(NPC1,"npc1",{0,0},"player.png",32,{1,1},RED,Flag::NONE,Flag::NONE,60);
CreateObjectInfo(NPC2,"npc2",{0,0},"player.png",32,{1,1},GREEN,Flag::NONE,Flag::NONE,2); CreateObjectInfo(NPC2,"npc2",{0,0},"player.png",32,{1,1},GREEN,Flag::NONE,Flag::NONE,2);
CreateObjectInfo(NPC3,"npc3",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC3,"npc3",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0);
@ -1351,10 +1380,18 @@ goes on a very long time, I hope you can understand this is only for testing pur
CreateObjectInfo(NPC19_8,"npc20_8",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC19_8,"npc20_8",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0);
} }
void AddObjectToWorld(Object*obj) { Object* AddObjectToWorld(Object*obj) {
std::vector<Object*>::const_iterator it = OBJECTS.begin(); std::vector<Object*>::const_iterator it = OBJECTS.begin();
if (obj->id==PLAYER&&!obj->temp) { if (obj->id==PLAYER&&!obj->temp) {
PLAYER_OBJ=obj; PARTY_MEMBER_OBJ[0]=obj;
for (int i=toint(Flag::HAS_MAIN)+1;i<=toint(Flag::HAS_POO);i++) {
if (GetGameFlag(i)) {
PARTY_MEMBER_OBJ[PARTY_MEMBER_COUNT++]=AddObjectToWorld(CreateObject(toint(PLAYER)+i-toint(Flag::HAS_MAIN),PARTY_MEMBER_OBJ[0]->GetPos()));
if (PARTY_MEMBER_COUNT==4) {
break;
}
}
}
} }
bool inserted=false; bool inserted=false;
for (int i=0;i<OBJECTS.size();i++) { for (int i=0;i<OBJECTS.size();i++) {
@ -1382,6 +1419,7 @@ goes on a very long time, I hope you can understand this is only for testing pur
} }
assert(i==OBJECTS[i]->objArrElement); assert(i==OBJECTS[i]->objArrElement);
} }
return obj;
//printf("\n"); //printf("\n");
} }
@ -1427,7 +1465,7 @@ goes on a very long time, I hope you can understand this is only for testing pur
} }
bool PlayerCanMove(){ bool PlayerCanMove(){
return !messageBoxVisible&&PLAYER_OBJ!=nullptr; return !messageBoxVisible&&PARTY_MEMBER_OBJ[0]!=nullptr;
} }
void DisplayMessageBox(std::string targetText) { void DisplayMessageBox(std::string targetText) {
@ -1549,6 +1587,10 @@ goes on a very long time, I hope you can understand this is only for testing pur
GAME_FLAGS[toint(flag)]=val; GAME_FLAGS[toint(flag)]=val;
} }
bool GetGameFlag(int flag) {
return GAME_FLAGS[flag];
}
bool GetGameFlag(Flag flag) { bool GetGameFlag(Flag flag) {
return GAME_FLAGS[toint(flag)]; return GAME_FLAGS[toint(flag)];
} }
@ -1635,6 +1677,16 @@ goes on a very long time, I hope you can understand this is only for testing pur
AddObjectToWorld(data->objs[i]->obj); AddObjectToWorld(data->objs[i]->obj);
} }
} }
void UpdatePlayerTrail(vd2d newMovement) {
for (int i=PARTY_TRAIL_LENGTH-1;i>0;i--) {
partyTrail[i]=partyTrail[i-1];
}
partyTrail[0]=PARTY_MEMBER_OBJ[0]->GetPos()-newMovement;
for (int i=1;i<PARTY_MEMBER_COUNT;i++) {
PARTY_MEMBER_OBJ[i]->SetPos(partyTrail[PARTY_TRAIL_LENGTH*((double)i/4)]);
}
}
}; };

@ -1,5 +1,11 @@
enum Reference{ enum Reference{
PLAYER, PLAYER,
NESS,
PAULA,
JEFF,
ANNA,
KING,
POO,
NPC1, NPC1,
NPC2, NPC2,
NPC3, NPC3,

Loading…
Cancel
Save