generated from sigonasr2/CPlusPlusProjectTemplate
New seed mechanic, new player encounter positioning
Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
This commit is contained in:
parent
24291a31d9
commit
2d2761540d
@ -12,8 +12,8 @@ using namespace olc;
|
||||
//#define TEST_MAP1 //Toggle to just play around on map 1.
|
||||
//#define TEST_MAP2 //Toggle on to just play around on map 2.
|
||||
|
||||
#define SKIP_INTRO false
|
||||
#define SKIP_CHAPTER1 false
|
||||
#define SKIP_INTRO true
|
||||
#define SKIP_CHAPTER1 true
|
||||
#define SKIP_CHAPTER2 false
|
||||
#define SKIP_CHAPTER3 false
|
||||
|
||||
@ -49,6 +49,7 @@ enum GAMESTATE{
|
||||
CUTSCENE_4, //First rover repaired.
|
||||
CUTSCENE_4_DONE,
|
||||
LATER_THAT_NIGHTFADEIN,
|
||||
LATER_THAT_NIGHTWAIT,
|
||||
LATER_THAT_NIGHTFADEOUT,
|
||||
};
|
||||
|
||||
@ -74,6 +75,7 @@ namespace cutscene{
|
||||
GET_SOME_REST,
|
||||
IN_BED,
|
||||
SHAKE,
|
||||
INVESTIGATE_X_X,
|
||||
};
|
||||
}
|
||||
|
||||
@ -87,6 +89,7 @@ namespace battle{
|
||||
MOVE_RESOLUTION,
|
||||
PERFORM_TURN,
|
||||
WAIT_TURN_ANIMATION,
|
||||
WAIT_TURN_ANIMATION2,
|
||||
DAMAGE_RESOLUTION,
|
||||
};
|
||||
}
|
||||
@ -108,6 +111,14 @@ enum MOVEMENT_PRIORITY{
|
||||
BOTH
|
||||
};
|
||||
|
||||
class Seed{
|
||||
public:
|
||||
vf2d pos;
|
||||
Seed(vf2d pos) {
|
||||
this->pos=pos;
|
||||
}
|
||||
};
|
||||
|
||||
#define MAX_TERMINAL_NAME_LENGTH 6
|
||||
#define WIDTH 256
|
||||
#define HEIGHT 224
|
||||
@ -123,7 +134,7 @@ class DisplayNumber{
|
||||
int frame; //Frame it was created.
|
||||
float x,y;
|
||||
int alpha=255;
|
||||
DisplayNumber(int numb,int x,int y,int frameCount) {
|
||||
DisplayNumber(int numb,float x,float y,int frameCount) {
|
||||
this->number=numb;
|
||||
this->x=x;
|
||||
this->y=y;
|
||||
@ -272,6 +283,9 @@ class WEATHER_POWER{
|
||||
Pixel textcol;
|
||||
int effectTime=0;
|
||||
ParticleEffect*effect;
|
||||
int seedProduction=0; //Number of seeds to add to field.
|
||||
float seedScatter=1; //Multiplier of current seeds on field.
|
||||
bool growSeeds=false; //If set to true, will trigger a growth of all seeds.
|
||||
WEATHER_POWER(std::string name,std::string desc,Animation*icon,Animation*effect,int dmg,int dmgRoll,int range,Pixel bgcol,Pixel textcol,int effectTime,ParticleEffect*parteff) {
|
||||
this->description=desc;
|
||||
this->name=name;
|
||||
@ -293,8 +307,8 @@ class Entity{
|
||||
int hp;
|
||||
int maxhp;
|
||||
Decal*spr;
|
||||
int x;
|
||||
int y;
|
||||
float x;
|
||||
float y;
|
||||
std::string name;
|
||||
WEATHER_POWER*selectedMove;
|
||||
std::vector<WEATHER_POWER*> moveSet;
|
||||
@ -304,7 +318,7 @@ class Entity{
|
||||
int fixedTurnOrderInd=0;
|
||||
bool fixedTurnOrder=false; //If this is turned on, the selected move will increment in order of the move set (and loop accordingly.)
|
||||
vf2d sprScale;
|
||||
Entity(Decal*spr,std::string name,int x,int y,int hp,int maxhp,std::vector<WEATHER_POWER*>moveset,vf2d sprScale={1,1},bool fixedMoveset=false) {
|
||||
Entity(Decal*spr,std::string name,float x,float y,int hp,int maxhp,std::vector<WEATHER_POWER*>moveset,vf2d sprScale={1,1},bool fixedMoveset=false) {
|
||||
this->spr=spr;
|
||||
this->name=name;
|
||||
this->x=x;
|
||||
@ -321,6 +335,7 @@ class Entity{
|
||||
class Encounter{
|
||||
public:
|
||||
int x,y;
|
||||
float playerX,playerY;
|
||||
std::vector<Entity*> entities;
|
||||
std::vector<int> turnOrder;
|
||||
};
|
||||
@ -456,7 +471,7 @@ public:
|
||||
WEATHER_POWER*SANDSTORM = new WEATHER_POWER("Sandstorm","",POWER_HAILSTORM_ANIMATION,POWER_HAILSTORM_ANIMATION,5,10,64,Pixel(93, 161, 163,255),Pixel(72, 160, 212,255),120,SANDSTORM_EFF);
|
||||
WEATHER_POWER*SEED_STORM = new WEATHER_POWER("Seed Storm","",POWER_HAILSTORM_ANIMATION,POWER_HAILSTORM_ANIMATION,-10,15,30,Pixel(93, 161, 163,255),Pixel(72, 160, 212,255),120,SEED_STORM_EFF);
|
||||
WEATHER_POWER*AVALANCHE = new WEATHER_POWER("Avalanche","",POWER_HAILSTORM_ANIMATION,POWER_HAILSTORM_ANIMATION,15,10,200,Pixel(93, 161, 163,255),Pixel(72, 160, 212,255),120,AVALANCHE_EFF);
|
||||
WEATHER_POWER*LIGHT_STORM = new WEATHER_POWER("Light Storm","",POWER_HAILSTORM_ANIMATION,POWER_HAILSTORM_ANIMATION,15,10,64,Pixel(171, 151, 53,255),Pixel(237, 237, 237,255),120,LIGHT_STORM_EFF);
|
||||
WEATHER_POWER*LIGHT_STORM = new WEATHER_POWER("Light Storm","",POWER_HAILSTORM_ANIMATION,POWER_HAILSTORM_ANIMATION,50,9,64,Pixel(171, 151, 53,255),Pixel(237, 237, 237,255),120,LIGHT_STORM_EFF);
|
||||
WEATHER_POWER*SEED_BULLET = new WEATHER_POWER("Seed Bullet","",POWER_HAILSTORM_ANIMATION,POWER_HAILSTORM_ANIMATION,10,15,30,Pixel(57, 92, 63,255),Pixel(95, 232, 119,255),120,SEED_BULLET_EFF);
|
||||
WEATHER_POWER*SEED_PELLET = new WEATHER_POWER("Seed Pellet","",POWER_HAILSTORM_ANIMATION,POWER_HAILSTORM_ANIMATION,5,10,30,Pixel(57, 92, 63,255),Pixel(95, 232, 119,255),120,SEED_PELLET_EFF);
|
||||
WEATHER_POWER*SEED_OF_LIFE = new WEATHER_POWER("Seed of Life","",POWER_HAILSTORM_ANIMATION,POWER_HAILSTORM_ANIMATION,-10,15,96,Pixel(93, 161, 163,255),Pixel(72, 160, 212,255),120,SEED_OF_LIFE_EFF);
|
||||
@ -516,7 +531,7 @@ public:
|
||||
*SPIDEY_DECAL,*TARGETING_CIRCLE,*TARGETING_RANGE_CIRCLE,*HEALTHBAR_DECAL,
|
||||
*CONSUME_SNACK_DECAL,*CONSUME_MEAL_DECAL,*COMPUTER_DECAL,*BROKEN_ROVER_DECAL,
|
||||
*NADO_DECAL,*SILICON_ROCK_DECAL,*PETAL_STORM_DECAL,*ROVER_DECAL,*X_X_DECAL,
|
||||
*LATER_THAT_NIGHT_DECAL,*SLEEP_DECAL;
|
||||
*LATER_THAT_NIGHT_DECAL,*SLEEP_DECAL,*SEED_DECAL,*TREE_DECAL;
|
||||
std::map<std::string,ObjectLoadInfo*> BASE_OBJECTS;
|
||||
std::vector<Encounter> ENCOUNTERS;
|
||||
Encounter ENCOUNTER_SPIDEY_1;
|
||||
@ -525,10 +540,14 @@ public:
|
||||
std::vector<WEATHER_POWER*>MOVESET_SPIDEY;
|
||||
std::vector<WEATHER_POWER*>MOVESET_X_X;
|
||||
std::vector<WEATHER_POWER*>MOVESET_XMINION;
|
||||
std::vector<Seed*>SEEDS;
|
||||
std::vector<Seed*>TREES;
|
||||
bool SOUND_IS_MUTED=false;
|
||||
bool END_THE_GAME=false;
|
||||
bool audioFade=false;
|
||||
float audioLevel=0.6;
|
||||
int SEED_COUNT=0;
|
||||
vf2d BATTLE_PLAYER_COORDS;
|
||||
|
||||
|
||||
sound::Wave SONG_MAIN;
|
||||
@ -553,6 +572,7 @@ public:
|
||||
if (SKIP_INTRO||SKIP_CHAPTER1||SKIP_CHAPTER2||SKIP_CHAPTER3) {
|
||||
GAME_FLAGS[gameflag::TUTORIAL_WALKED_OFF_FARM]=true;
|
||||
GAME_FLAGS[gameflag::VISIT_BROKEN_ROVER]=true;
|
||||
GAME_STATE=GAMEWORLD;
|
||||
}
|
||||
if (SKIP_CHAPTER1||SKIP_CHAPTER2||SKIP_CHAPTER3) {
|
||||
GAME_FLAGS[gameflag::COLLECTED_SILICON_1]=true;
|
||||
@ -596,9 +616,11 @@ public:
|
||||
SILICON_ROCK_DECAL=new Decal(new Sprite("assets/siliconPiece.png"));
|
||||
PETAL_STORM_DECAL=new Decal(new Sprite("assets/petalstorm_icon.png"));
|
||||
ROVER_DECAL=new Decal(new Sprite("assets/ROVER.png"));
|
||||
X_X_DECAL=new Decal(new Sprite("assets/X_X.png"));
|
||||
X_X_DECAL=new Decal(new Sprite("assets/X.X.png"));
|
||||
LATER_THAT_NIGHT_DECAL=new Decal(new Sprite("assets/LaterThatNight.png"));
|
||||
SLEEP_DECAL=new Decal(new Sprite("assets/sleep.png"));
|
||||
SEED_DECAL=new Decal(new Sprite("assets/seed.png"));
|
||||
TREE_DECAL=new Decal(new Sprite("assets/tree.png"));
|
||||
|
||||
current_playerAnim->spr=PLAYER_DECAL;
|
||||
playerAnim->spr=PLAYER_DECAL;
|
||||
@ -700,6 +722,9 @@ public:
|
||||
HURRICANE->playerOwnCount=1;
|
||||
METEOR_RAIN->playerOwnCount=5;
|
||||
|
||||
PETAL_STORM->seedProduction=2; //Produce two seeds.
|
||||
HURRICANE->seedScatter=2;
|
||||
|
||||
MOVESET_SPIDEY.push_back(SANDSTORM);
|
||||
MOVESET_SPIDEY.push_back(SEED_STORM);
|
||||
MOVESET_SPIDEY.push_back(AVALANCHE);
|
||||
@ -720,18 +745,25 @@ public:
|
||||
MOVESET_XMINION.push_back(SEED_PELLET);
|
||||
MOVESET_XMINION.push_back(SEED_STORM);
|
||||
|
||||
COLLECTED_ITEMS.push_back({20,5});
|
||||
COLLECTED_ITEMS.push_back({20,6});
|
||||
|
||||
ENCOUNTER_SPIDEY_1.entities.push_back(new Entity(SPIDEY_DECAL,"Spidey",2,3,80,80,MOVESET_SPIDEY));
|
||||
ENCOUNTER_SPIDEY_1.entities.push_back(new Entity(SPIDEY_DECAL,"Spidey",4,4,80,80,MOVESET_SPIDEY));
|
||||
ENCOUNTER_SPIDEY_1.entities.push_back(new Entity(SPIDEY_DECAL,"Spidey",6,2,80,80,MOVESET_SPIDEY));
|
||||
ENCOUNTER_SPIDEY_1.x=79;
|
||||
ENCOUNTER_SPIDEY_1.y=47;
|
||||
ENCOUNTER_X_X.playerX=4;
|
||||
ENCOUNTER_X_X.playerY=3.75;
|
||||
ENCOUNTERS.push_back(ENCOUNTER_SPIDEY_1);
|
||||
ENCOUNTER_X_X.entities.push_back(new Entity(X_X_DECAL,"X_X",3,3,590,590,MOVESET_X_X,{1,1},true));
|
||||
ENCOUNTER_X_X.entities.push_back(new Entity(X_X_DECAL,"X Minion",1,5,80,80,MOVESET_XMINION,{0.4,0.4}));
|
||||
ENCOUNTER_X_X.entities.push_back(new Entity(X_X_DECAL,"X Minion",0,2,80,80,MOVESET_XMINION,{0.4,0.4}));
|
||||
ENCOUNTER_X_X.entities.push_back(new Entity(X_X_DECAL,"X Minion",4,2,80,80,MOVESET_XMINION,{0.4,0.4}));
|
||||
ENCOUNTER_X_X.entities.push_back(new Entity(X_X_DECAL,"X_X",3,2.5,590,590,MOVESET_X_X,{2,2},true));
|
||||
ENCOUNTER_X_X.entities.push_back(new Entity(X_X_DECAL,"X Minion",1,5,0,80,MOVESET_XMINION,{0.7,0.7}));
|
||||
ENCOUNTER_X_X.entities.push_back(new Entity(X_X_DECAL,"X Minion",0,2,0,80,MOVESET_XMINION,{0.7,0.7}));
|
||||
ENCOUNTER_X_X.entities.push_back(new Entity(X_X_DECAL,"X Minion",4,2,0,80,MOVESET_XMINION,{0.7,0.7}));
|
||||
ENCOUNTER_X_X.x=38;
|
||||
ENCOUNTER_X_X.y=35;
|
||||
ENCOUNTER_X_X.playerX=3;
|
||||
ENCOUNTER_X_X.playerY=2;
|
||||
//ENCOUNTERS.push_back(ENCOUNTER_X_X); //Activate at beginning of Chapter 2.
|
||||
|
||||
BASE_OBJECTS["DOME"]=new ObjectLoadInfo(DOME_DECAL);
|
||||
@ -1040,6 +1072,7 @@ public:
|
||||
fadeIn();
|
||||
GAME_STATE=GAMEWORLD;
|
||||
PlayCutscene(cutscene::IN_BED);
|
||||
PLAYER_HP=PLAYER_MAXHP;
|
||||
}break;
|
||||
}
|
||||
switch (CURRENT_CUTSCENE) {
|
||||
@ -1055,6 +1088,16 @@ public:
|
||||
}
|
||||
}break;
|
||||
case cutscene::TRANSITION_CUTSCENE_2:{
|
||||
if (GAME_FLAGS[gameflag::REST_IN_DOME]&&!GAME_FLAGS[gameflag::SLEEP]) {
|
||||
for (int i=0;i<COLLECTED_ITEMS.size();i++) {
|
||||
if (COLLECTED_ITEMS[i].x==20&&COLLECTED_ITEMS[i].y==5) {
|
||||
COLLECTED_ITEMS.erase(COLLECTED_ITEMS.begin()+i--);
|
||||
} else
|
||||
if (COLLECTED_ITEMS[i].x==20&&COLLECTED_ITEMS[i].y==6) {
|
||||
COLLECTED_ITEMS.erase(COLLECTED_ITEMS.begin()+i--);
|
||||
}
|
||||
}
|
||||
}
|
||||
LoadMap("assets/maps/map2");
|
||||
TeleportToMapFileCoords(8,17);
|
||||
fadeIn();
|
||||
@ -1073,6 +1116,7 @@ public:
|
||||
case cutscene::REPAIR_ROVER_1:{
|
||||
ResetTerminal(STORY_TEXT3);
|
||||
GAME_STATE=CUTSCENE_4;
|
||||
REPAIRED_ROVERS.push_back({33,35});
|
||||
fadeIn();
|
||||
}break;
|
||||
case cutscene::END_VOLCANIC_AREA_CUTSCENE:{
|
||||
@ -1087,8 +1131,8 @@ public:
|
||||
void fadeInCompleted() {
|
||||
switch (GAME_STATE) {
|
||||
case LATER_THAT_NIGHTFADEIN:{
|
||||
fadeOut();
|
||||
GAME_STATE=LATER_THAT_NIGHTFADEOUT;
|
||||
TIMER=0;
|
||||
GAME_STATE=LATER_THAT_NIGHTWAIT;
|
||||
}break;
|
||||
}
|
||||
switch (CURRENT_CUTSCENE) {
|
||||
@ -1142,6 +1186,12 @@ public:
|
||||
case cutscene::IN_BED:{
|
||||
CUTSCENE_OBJS[0]=CreateObject({20,2},SLEEP_DECAL,SLEEP_ANIMATION,true);
|
||||
}break;
|
||||
case cutscene::INVESTIGATE_X_X:{
|
||||
CUTSCENE_OBJS[0]->anim=EMPTY_BED_ANIMATION;
|
||||
CUTSCENE_OBJS[1]=CreateObject({19,3},PLAYER_DECAL,{32,0},{32,32},true);
|
||||
CUTSCENE_OBJS[1]->flipped=true;
|
||||
DisplayMessageBox(20);
|
||||
}break;
|
||||
}
|
||||
for (int i=0;i<8;i++) {
|
||||
CUTSCENE_FLAGS[i]=false;
|
||||
@ -1364,6 +1414,7 @@ public:
|
||||
availablePowers.push_back(WEATHER_POWERS[i]);
|
||||
}
|
||||
}
|
||||
BATTLE_PLAYER_COORDS={PLAYER_COORDS[0],PLAYER_COORDS[1]};
|
||||
BATTLE_CARD_SELECTION_IND=0;
|
||||
BATTLE_CARD_SELECTION=availablePowers[BATTLE_CARD_SELECTION_IND];
|
||||
PLAYER_SELECTED_TARGET=-1;
|
||||
@ -1389,11 +1440,12 @@ public:
|
||||
if (BATTLE_ENTRY_TIMER>45) {
|
||||
int TARGET_COORDS_X=CURRENT_ENCOUNTER.x+WIDTH/32/2;
|
||||
int TARGET_COORDS_Y=CURRENT_ENCOUNTER.y+HEIGHT/32/2;
|
||||
if (PLAYER_COORDS[0]==TARGET_COORDS_X&&PLAYER_COORDS[1]==TARGET_COORDS_Y) {
|
||||
if (PLAYER_COORDS[0]==TARGET_COORDS_X&&PLAYER_COORDS[1]==TARGET_COORDS_Y
|
||||
&&BATTLE_PLAYER_COORDS.x==CURRENT_ENCOUNTER.playerX&&BATTLE_PLAYER_COORDS.y==CURRENT_ENCOUNTER.playerY) {
|
||||
BATTLE_STATE = battle::PLAYER_SELECTION;
|
||||
clearPixelEffect();
|
||||
EFFECT_TIMER = 0;
|
||||
} else
|
||||
}
|
||||
if (PLAYER_COORDS[0]!=TARGET_COORDS_X) {
|
||||
if (PLAYER_COORDS[0]<TARGET_COORDS_X) {
|
||||
PLAYER_COORDS[0]+=BATTLE_CAMERA_SCROLL_SPD;
|
||||
@ -1420,6 +1472,32 @@ public:
|
||||
}
|
||||
}
|
||||
}
|
||||
if (BATTLE_PLAYER_COORDS.x!=CURRENT_ENCOUNTER.x+CURRENT_ENCOUNTER.playerX) {
|
||||
if (BATTLE_PLAYER_COORDS.x<CURRENT_ENCOUNTER.x+CURRENT_ENCOUNTER.playerX) {
|
||||
BATTLE_PLAYER_COORDS.x+=BATTLE_CAMERA_SCROLL_SPD;
|
||||
if (BATTLE_PLAYER_COORDS.x>CURRENT_ENCOUNTER.x+CURRENT_ENCOUNTER.playerX) {
|
||||
BATTLE_PLAYER_COORDS.x=CURRENT_ENCOUNTER.x+CURRENT_ENCOUNTER.playerX;
|
||||
}
|
||||
} else {
|
||||
BATTLE_PLAYER_COORDS.x-=BATTLE_CAMERA_SCROLL_SPD;
|
||||
if (BATTLE_PLAYER_COORDS.x<CURRENT_ENCOUNTER.x+CURRENT_ENCOUNTER.playerX) {
|
||||
BATTLE_PLAYER_COORDS.x=CURRENT_ENCOUNTER.x+CURRENT_ENCOUNTER.playerX;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (BATTLE_PLAYER_COORDS.y!=CURRENT_ENCOUNTER.y+CURRENT_ENCOUNTER.playerY) {
|
||||
if (BATTLE_PLAYER_COORDS.y<CURRENT_ENCOUNTER.y+CURRENT_ENCOUNTER.playerY) {
|
||||
BATTLE_PLAYER_COORDS.y+=BATTLE_CAMERA_SCROLL_SPD;
|
||||
if (BATTLE_PLAYER_COORDS.y>CURRENT_ENCOUNTER.y+CURRENT_ENCOUNTER.playerY) {
|
||||
BATTLE_PLAYER_COORDS.y=CURRENT_ENCOUNTER.y+CURRENT_ENCOUNTER.playerY;
|
||||
}
|
||||
} else {
|
||||
BATTLE_PLAYER_COORDS.y-=BATTLE_CAMERA_SCROLL_SPD;
|
||||
if (BATTLE_PLAYER_COORDS.y<CURRENT_ENCOUNTER.y+CURRENT_ENCOUNTER.playerY) {
|
||||
BATTLE_PLAYER_COORDS.y=CURRENT_ENCOUNTER.y+CURRENT_ENCOUNTER.playerY;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}break;
|
||||
case battle::WAIT_TURN_ANIMATION:{
|
||||
@ -1427,7 +1505,7 @@ public:
|
||||
PIXEL_EFFECT_TRANSPARENCY=0;
|
||||
if (BATTLE_CURRENT_TURN_ENTITY==-1) {
|
||||
if (PLAYER_SELECTED_TARGET==-2) {
|
||||
applyPixelEffect(BATTLE_CARD_SELECTION,{PLAYER_COORDS[0],PLAYER_COORDS[1]},0);
|
||||
applyPixelEffect(BATTLE_CARD_SELECTION,{CURRENT_ENCOUNTER.x+CURRENT_ENCOUNTER.playerX,CURRENT_ENCOUNTER.x+CURRENT_ENCOUNTER.playerY},0);
|
||||
} else {
|
||||
applyPixelEffect(BATTLE_CARD_SELECTION,{(float)(CURRENT_ENCOUNTER.x+CURRENT_ENCOUNTER.entities[PLAYER_SELECTED_TARGET]->x),(float)(CURRENT_ENCOUNTER.y+CURRENT_ENCOUNTER.entities[PLAYER_SELECTED_TARGET]->y)},0);
|
||||
}
|
||||
@ -1435,7 +1513,7 @@ public:
|
||||
if (CURRENT_ENCOUNTER.entities[BATTLE_CURRENT_TURN_ENTITY]->selectedMove->damage<0) {
|
||||
applyPixelEffect(CURRENT_ENCOUNTER.entities[BATTLE_CURRENT_TURN_ENTITY]->selectedMove,{(float)CURRENT_ENCOUNTER.x+CURRENT_ENCOUNTER.entities[BATTLE_CURRENT_TURN_ENTITY]->x,(float)CURRENT_ENCOUNTER.y+CURRENT_ENCOUNTER.entities[BATTLE_CURRENT_TURN_ENTITY]->y},0);
|
||||
} else {
|
||||
applyPixelEffect(CURRENT_ENCOUNTER.entities[BATTLE_CURRENT_TURN_ENTITY]->selectedMove,{PLAYER_COORDS[0],PLAYER_COORDS[1]},0);
|
||||
applyPixelEffect(CURRENT_ENCOUNTER.entities[BATTLE_CURRENT_TURN_ENTITY]->selectedMove,{CURRENT_ENCOUNTER.x+CURRENT_ENCOUNTER.playerX,CURRENT_ENCOUNTER.x+CURRENT_ENCOUNTER.playerY},0);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1468,16 +1546,23 @@ public:
|
||||
if (FOOD_REGEN_TURNS>0) {
|
||||
FOOD_REGEN_TURNS--;
|
||||
PLAYER_HP=std::clamp(PLAYER_HP+(int)(PLAYER_MAXHP*0.33),0,PLAYER_MAXHP);
|
||||
DisplayNumber*numb = new DisplayNumber((int)(-PLAYER_MAXHP*0.33),PLAYER_COORDS[0],PLAYER_COORDS[1],frameCount);
|
||||
DisplayNumber*numb = CreateDisplayNumber((int)(-PLAYER_MAXHP*0.33),CURRENT_ENCOUNTER.x+CURRENT_ENCOUNTER.playerX,CURRENT_ENCOUNTER.x+CURRENT_ENCOUNTER.playerY,frameCount);
|
||||
BATTLE_DISPLAY_NUMBERS.push_back(numb);
|
||||
}
|
||||
if (PLAYER_SELECTED_TARGET==-2) {
|
||||
effectRadius({(int)PLAYER_COORDS[0],(int)PLAYER_COORDS[1]},ref,true);
|
||||
effectRadius({CURRENT_ENCOUNTER.x+CURRENT_ENCOUNTER.playerX,CURRENT_ENCOUNTER.x+CURRENT_ENCOUNTER.playerY},ref,true);
|
||||
} else {
|
||||
effectRadius({CURRENT_ENCOUNTER.entities[PLAYER_SELECTED_TARGET]->x+CURRENT_ENCOUNTER.x,CURRENT_ENCOUNTER.entities[PLAYER_SELECTED_TARGET]->y+CURRENT_ENCOUNTER.y},ref,true);
|
||||
}
|
||||
} else {
|
||||
effectRadius({(int)PLAYER_COORDS[0],(int)PLAYER_COORDS[1]},ref,false);
|
||||
effectRadius({CURRENT_ENCOUNTER.x+CURRENT_ENCOUNTER.playerX,CURRENT_ENCOUNTER.x+CURRENT_ENCOUNTER.playerY},ref,false);
|
||||
}
|
||||
} else
|
||||
if (EFFECT_TIMER==ref->effectTime/2){
|
||||
addSeeds(ref->seedProduction);
|
||||
int newSeedCount=SEEDS.size()*ref->seedScatter;
|
||||
while (SEEDS.size()<newSeedCount) {
|
||||
addSeeds(1);
|
||||
}
|
||||
}
|
||||
if (EFFECT_TIMER>ref->effectTime) {
|
||||
@ -1526,9 +1611,12 @@ public:
|
||||
break;
|
||||
}
|
||||
}
|
||||
PLAYER_COORDS[0]=CURRENT_ENCOUNTER.x+BATTLE_PLAYER_COORDS.x;
|
||||
PLAYER_COORDS[1]=CURRENT_ENCOUNTER.y+BATTLE_PLAYER_COORDS.y;
|
||||
BATTLE_STATE=battle::WAIT_TURN_ANIMATION;
|
||||
PIXEL_EFFECT_TRANSPARENCY=0;
|
||||
EFFECT_TIMER=0;
|
||||
clearSeeds();
|
||||
}
|
||||
}
|
||||
}break;
|
||||
@ -1742,6 +1830,7 @@ public:
|
||||
}
|
||||
}break;
|
||||
case cutscene::SHAKE:{
|
||||
if (CUTSCENE_TIMER<60*4) {
|
||||
if (frameCount%4==0) {
|
||||
PLAYER_COORDS[1]+=0.25;
|
||||
} else
|
||||
@ -1754,6 +1843,22 @@ public:
|
||||
if (frameCount%4==3) {
|
||||
PLAYER_COORDS[1]-=0.25;
|
||||
}
|
||||
} else {
|
||||
StartCutscene(cutscene::INVESTIGATE_X_X);
|
||||
}
|
||||
}break;
|
||||
case cutscene::INVESTIGATE_X_X:{
|
||||
if (!messageBoxVisible) {
|
||||
if (!CUTSCENE_FLAGS[0]) {
|
||||
CUTSCENE_FLAGS[0]=true;
|
||||
DisplayMessageBox(21);
|
||||
} else {
|
||||
PLAYER_COORDS[0]=CUTSCENE_OBJS[1]->x;
|
||||
PLAYER_COORDS[1]=CUTSCENE_OBJS[1]->y;
|
||||
EndCutscene();
|
||||
ENCOUNTERS.push_back(ENCOUNTER_X_X);
|
||||
}
|
||||
}
|
||||
}break;
|
||||
}
|
||||
|
||||
@ -1833,6 +1938,12 @@ public:
|
||||
}
|
||||
}
|
||||
}break;
|
||||
case LATER_THAT_NIGHTWAIT:{
|
||||
if (TIMER>180) {
|
||||
fadeOut();
|
||||
GAME_STATE=LATER_THAT_NIGHTFADEOUT;
|
||||
}
|
||||
}break;
|
||||
}
|
||||
|
||||
if (PIXEL_EFFECT_TRANSPARENCY>0) {
|
||||
@ -1933,9 +2044,20 @@ public:
|
||||
meterYOffset+=(2+48*0.4);
|
||||
}
|
||||
SetDrawTarget(2);
|
||||
if (IN_BATTLE_ENCOUNTER) {
|
||||
const vi2d CENTER = {(float)((BATTLE_PLAYER_COORDS.x-PLAYER_COORDS[0])*32+WIDTH/2+(current_playerAnim->flipped?32:0)),(float)((BATTLE_PLAYER_COORDS.y-PLAYER_COORDS[1])*32+HEIGHT/2)};
|
||||
for (int i=0;i<SEEDS.size();i++) {
|
||||
DrawDecal(SEEDS[i]->pos+CENTER,SEED_DECAL,{0.5,0.5});
|
||||
}
|
||||
for (int i=0;i<TREES.size();i++) {
|
||||
DrawDecal(TREES[i]->pos+CENTER,TREE_DECAL,{1,1});
|
||||
}
|
||||
DrawPartialDecal({(float)((BATTLE_PLAYER_COORDS.x-PLAYER_COORDS[0])*32+WIDTH/2-16+(current_playerAnim->flipped?32:0)),(float)((BATTLE_PLAYER_COORDS.y-PLAYER_COORDS[1])*32+HEIGHT/2-16)},current_playerAnim->spr,current_playerAnim->getCurrentFrame(),{32,32},{(float)(current_playerAnim->flipped?-1:1),1});
|
||||
} else {
|
||||
DrawPartialDecal({(float)(WIDTH/2-16+(current_playerAnim->flipped?32:0)),(float)(HEIGHT/2-16)},current_playerAnim->spr,current_playerAnim->getCurrentFrame(),{32,32},{(float)(current_playerAnim->flipped?-1:1),1});
|
||||
}
|
||||
if (IN_BATTLE_ENCOUNTER&&BATTLE_ENTRY_TIMER<45) {
|
||||
DrawStringDecal({(float)(WIDTH/2-16+(current_playerAnim->flipped?32:0)+8),(float)(HEIGHT/2-16-sin(frameCount*12/60.0)*4-12)},"!!",RED);
|
||||
DrawStringDecal({(float)(WIDTH/2-16),(float)(HEIGHT/2-16-sin(frameCount*12/60.0)*4-12)},"!!",RED);
|
||||
}
|
||||
}
|
||||
}break;
|
||||
@ -1959,7 +2081,8 @@ public:
|
||||
GradientFillRectDecal({WIDTH/2,HEIGHT/2},{WIDTH/2,HEIGHT/2},{100, 10, 255,ALPHA_SCREEN2},{100, 10, 255,ALPHA_SCREEN1},{100, 10, 255,ALPHA_SCREEN1},{100, 10, 255,ALPHA_SCREEN1});
|
||||
}break;
|
||||
case LATER_THAT_NIGHTFADEIN:
|
||||
case LATER_THAT_NIGHTFADEOUT:{
|
||||
case LATER_THAT_NIGHTFADEOUT:
|
||||
case LATER_THAT_NIGHTWAIT:{
|
||||
DrawDecal({(float)(WIDTH/2-LATER_THAT_NIGHT_DECAL->sprite->width/2),(float)(HEIGHT/2-LATER_THAT_NIGHT_DECAL->sprite->height/2)},LATER_THAT_NIGHT_DECAL);
|
||||
}break;
|
||||
}
|
||||
@ -1995,11 +2118,11 @@ public:
|
||||
for (int x=-1;x<=1;x++) {
|
||||
for (int y=-1;y<=1;y++) {
|
||||
if (x!=0&&y!=0) {
|
||||
DrawStringDecal({((numb->x-PLAYER_COORDS[0])*32+WIDTH/2)-GetTextSize(display).x/2+x-8,((numb->y-PLAYER_COORDS[1])*32+HEIGHT/2)-12-GetTextSize(display).y/2+y},display,(numb->number>0)?Pixel(255,0,0,numb->alpha):Pixel(0,255,0,numb->alpha),{2,2});
|
||||
DrawStringDecal({((numb->x-PLAYER_COORDS[0])*32+WIDTH/2)-GetTextSize(display).x*1.3/2+x-8,((numb->y-PLAYER_COORDS[1])*32+HEIGHT/2)-12-GetTextSize(display).y*1.3/2+y},display,(numb->number>0)?Pixel(255,0,0,numb->alpha):Pixel(0,255,0,numb->alpha),{1.3,1.3});
|
||||
}
|
||||
}
|
||||
}
|
||||
DrawStringDecal({((numb->x-PLAYER_COORDS[0])*32+WIDTH/2)-GetTextSize(display).x/2-8,((numb->y-PLAYER_COORDS[1])*32+HEIGHT/2)-12-GetTextSize(display).y/2},display,Pixel(255,255,255,numb->alpha),{2,2});
|
||||
DrawStringDecal({((numb->x-PLAYER_COORDS[0])*32+WIDTH/2)-GetTextSize(display).x*1.3/2-8,((numb->y-PLAYER_COORDS[1])*32+HEIGHT/2)-12-GetTextSize(display).y*1.3/2},display,Pixel(255,255,255,numb->alpha),{1.3,1.3});
|
||||
//std::cout<<numb->x<<"/"<<numb->y<<" "<<(((numb->x-PLAYER_COORDS[0])*32+WIDTH/2)-GetTextSize(display).x/2)<<","<<(((numb->y-PLAYER_COORDS[1])*32+HEIGHT/2)-8-GetTextSize(display).y/2)<<": ("<<numb->alpha<<")"<<display<<"\n";
|
||||
}
|
||||
}
|
||||
@ -2089,7 +2212,7 @@ public:
|
||||
int targetX=-1,targetY=-1;
|
||||
for (auto&ent:enc.entities) {
|
||||
if (BATTLE_STATE==battle::PLAYER_TARGET_SELECTION&&PLAYER_SELECTED_TARGET>=0&&CURRENT_ENCOUNTER.entities[PLAYER_SELECTED_TARGET]->hp>0&&CURRENT_ENCOUNTER.entities[PLAYER_SELECTED_TARGET]->x==ent->x&&CURRENT_ENCOUNTER.entities[PLAYER_SELECTED_TARGET]->y==ent->y) {
|
||||
DrawDecal({(enc.x+ent->x-PLAYER_COORDS[0])*32+WIDTH/2,(enc.y+ent->y-PLAYER_COORDS[1])*32+HEIGHT/2},TARGETING_CIRCLE,{(float)(ent->spr->sprite->width/32),(float)(ent->spr->sprite->height/32)},{255,210,0,255});
|
||||
DrawDecal({(enc.x+ent->x-PLAYER_COORDS[0])*32+WIDTH/2,(enc.y+ent->y-PLAYER_COORDS[1])*32+HEIGHT/2},TARGETING_CIRCLE,{(float)(ent->spr->sprite->width*ent->sprScale.x/32),(float)(ent->spr->sprite->height*ent->sprScale.y/32)},{255,210,0,255});
|
||||
DrawDecal({(enc.x+ent->x-PLAYER_COORDS[0])*32+WIDTH/2,(enc.y+ent->y-PLAYER_COORDS[1])*32+HEIGHT/2},ent->spr,ent->sprScale,{(uint8_t)((0.5*(float)sin(frameCount*4/60.0)+0.5)*80+175),(uint8_t)((0.5*(float)sin(frameCount*4/60.0)+0.5)*80+175),(uint8_t)((0.5*(float)sin(frameCount*4/60.0)+0.5)*80+175),255});
|
||||
targetX=ent->x;targetY=ent->y;
|
||||
} else {
|
||||
@ -2102,7 +2225,7 @@ public:
|
||||
}
|
||||
}
|
||||
if (targetX!=-1&&targetY!=-1) {
|
||||
DrawDecal({(enc.x+targetX-PLAYER_COORDS[0])*32+WIDTH/2-BATTLE_CARD_SELECTION->range+16,(enc.y+targetY-PLAYER_COORDS[1])*32+HEIGHT/2-BATTLE_CARD_SELECTION->range+16},TARGETING_RANGE_CIRCLE,{(float)(BATTLE_CARD_SELECTION->range*2/32.0),(float)(BATTLE_CARD_SELECTION->range*2/32.0)},{255,60,0,(uint8_t)((0.5*(float)sin(frameCount*4/60.0)+0.5)*100)});
|
||||
DrawDecal({(enc.x+targetX-PLAYER_COORDS[0])*32+enc.entities[PLAYER_SELECTED_TARGET]->spr->sprite->width/2*enc.entities[PLAYER_SELECTED_TARGET]->sprScale.x+WIDTH/2-BATTLE_CARD_SELECTION->range,(enc.y+targetY-PLAYER_COORDS[1])*32+enc.entities[PLAYER_SELECTED_TARGET]->spr->sprite->height/2*enc.entities[PLAYER_SELECTED_TARGET]->sprScale.y+HEIGHT/2-BATTLE_CARD_SELECTION->range},TARGETING_RANGE_CIRCLE,{(float)(BATTLE_CARD_SELECTION->range*2/32.0),(float)(BATTLE_CARD_SELECTION->range*2/32.0)},{255,60,0,(uint8_t)((0.5*(float)sin(frameCount*4/60.0)+0.5)*100)});
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2194,6 +2317,7 @@ public:
|
||||
}
|
||||
|
||||
void DisplayMessageBox(int dialogNumber) {
|
||||
performCropUpdate(10);
|
||||
messageBoxVisible=true;
|
||||
messageBoxCursor=0;
|
||||
std::string split1=STORY_DIALOG[dialogNumber].substr(0,STORY_DIALOG[dialogNumber].find('\n')); //Unused for now.
|
||||
@ -2426,15 +2550,15 @@ public:
|
||||
foodCount--;
|
||||
}
|
||||
PLAYER_HP=std::clamp(PLAYER_HP-finalDamage,0,PLAYER_MAXHP);
|
||||
DisplayNumber*numb = new DisplayNumber(finalDamage,PLAYER_COORDS[0],PLAYER_COORDS[1],frameCount);
|
||||
DisplayNumber*numb = CreateDisplayNumber(finalDamage,PLAYER_COORDS[0],PLAYER_COORDS[1],frameCount);
|
||||
BATTLE_DISPLAY_NUMBERS.push_back(numb);
|
||||
} else {
|
||||
for (int i=0;i<CURRENT_ENCOUNTER.entities.size();i++) {
|
||||
finalDamage=power->damage+rand()%power->damageRoll*sign(power->damage);
|
||||
Entity*ent=CURRENT_ENCOUNTER.entities[i];
|
||||
if (ent->hp>0&&distancetoCoords({(float)((ent->x+CURRENT_ENCOUNTER.x)*32),(float)((ent->y+CURRENT_ENCOUNTER.y)*32)},coords*32)<=power->range) {
|
||||
if (distancetoCoords({(float)((ent->x+CURRENT_ENCOUNTER.x)*32),(float)((ent->y+CURRENT_ENCOUNTER.y)*32)},coords*32)<=power->range) {
|
||||
ent->hp=std::clamp(ent->hp-finalDamage,0,ent->maxhp);
|
||||
DisplayNumber*numb = new DisplayNumber(finalDamage,ent->x+CURRENT_ENCOUNTER.x,ent->y+CURRENT_ENCOUNTER.y,frameCount);
|
||||
DisplayNumber*numb = CreateDisplayNumber(finalDamage,ent->x+CURRENT_ENCOUNTER.x+ent->spr->sprite->width*ent->sprScale.x/2,ent->y+CURRENT_ENCOUNTER.y+ent->spr->sprite->height*ent->sprScale.y/2,frameCount);
|
||||
BATTLE_DISPLAY_NUMBERS.push_back(numb);
|
||||
ent->damageFrame=frameCount;
|
||||
}
|
||||
@ -2449,14 +2573,14 @@ public:
|
||||
std::cout<<"Distance was "<<distancetoCoords({(float)((ent->x+CURRENT_ENCOUNTER.x)*32),(float)((ent->y+CURRENT_ENCOUNTER.y)*32)},coords*32)<<"\n";
|
||||
if (ent->hp>0&&distancetoCoords({(float)((ent->x+CURRENT_ENCOUNTER.x)*32),(float)((ent->y+CURRENT_ENCOUNTER.y)*32)},coords*32)<=power->range) {
|
||||
ent->hp=std::clamp(ent->hp-finalDamage,0,ent->maxhp);
|
||||
DisplayNumber*numb = new DisplayNumber(finalDamage,ent->x+CURRENT_ENCOUNTER.x,ent->y+CURRENT_ENCOUNTER.y,frameCount);
|
||||
DisplayNumber*numb = CreateDisplayNumber(finalDamage,ent->x+CURRENT_ENCOUNTER.x+ent->spr->sprite->width*ent->sprScale.x/2,ent->y+CURRENT_ENCOUNTER.y+ent->spr->sprite->height*ent->sprScale.y/2,frameCount);
|
||||
BATTLE_DISPLAY_NUMBERS.push_back(numb);
|
||||
ent->damageFrame=frameCount;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
PLAYER_HP=std::clamp(PLAYER_HP-finalDamage,0,PLAYER_MAXHP);
|
||||
DisplayNumber*numb = new DisplayNumber(finalDamage,PLAYER_COORDS[0],PLAYER_COORDS[1],frameCount);
|
||||
DisplayNumber*numb = CreateDisplayNumber(finalDamage,PLAYER_COORDS[0],PLAYER_COORDS[1],frameCount);
|
||||
BATTLE_DISPLAY_NUMBERS.push_back(numb);
|
||||
}
|
||||
}
|
||||
@ -2762,7 +2886,8 @@ public:
|
||||
bool isPriorityMove(WEATHER_POWER*power) {
|
||||
return
|
||||
power->name.compare("Seed Storm")==0||
|
||||
power->name.compare("Seed of Life")==0;
|
||||
power->name.compare("Seed of Life")==0||
|
||||
power->name.compare("Petal Storm")==0;
|
||||
}
|
||||
|
||||
bool isFoodMove(WEATHER_POWER*power) {
|
||||
@ -2770,6 +2895,36 @@ public:
|
||||
power->name.compare("Meal")==0||
|
||||
power->name.compare("Snack")==0;
|
||||
}
|
||||
|
||||
void addSeeds(int seedCount) {
|
||||
for (int i=0;i<seedCount;i++) {
|
||||
SEEDS.push_back(new Seed({range(-32,32),range(-32,32)}));
|
||||
}
|
||||
}
|
||||
|
||||
void clearSeeds() {
|
||||
for (int i=0;i<SEEDS.size();i++) {
|
||||
delete SEEDS[i];
|
||||
}
|
||||
SEEDS.clear();
|
||||
}
|
||||
|
||||
void addTrees(int treeCount) {
|
||||
for (int i=0;i<treeCount;i++) {
|
||||
TREES.push_back(new Seed({range(-64,64),range(-64,64)}));
|
||||
}
|
||||
}
|
||||
|
||||
void clearTrees() {
|
||||
for (int i=0;i<TREES.size();i++) {
|
||||
delete TREES[i];
|
||||
}
|
||||
TREES.clear();
|
||||
}
|
||||
|
||||
DisplayNumber*CreateDisplayNumber(int numb,float x,float y,int frameCount) {
|
||||
return new DisplayNumber(numb,x+range(-0.5,0.5),y+range(-0.5,0.5),frameCount);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
Binary file not shown.
Binary file not shown.
Before Width: | Height: | Size: 10 MiB After Width: | Height: | Size: 10 MiB |
File diff suppressed because one or more lines are too long
Binary file not shown.
@ -33,3 +33,5 @@
|
||||
15;6;EXIT
|
||||
16;6;EXIT
|
||||
20;4;COMPUTER
|
||||
20;5;PETALSTORM_NODE
|
||||
20;6;HURRICANE_NODE
|
BIN
assets/seed.png
Normal file
BIN
assets/seed.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 803 B |
BIN
assets/tree.png
Normal file
BIN
assets/tree.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.0 KiB |
15
data.h
15
data.h
@ -88,6 +88,21 @@ Huh, it still doesn't work. At least the signaling is fixed. Maybe it'll work to
|
||||
R"(
|
||||
$PLAYER
|
||||
I'll go inside and get some rest in the meantime.)",//19
|
||||
R"(
|
||||
$PLAYER
|
||||
Ugh..Why now?)",//20
|
||||
R"(
|
||||
$PLAYER
|
||||
Of course now would be a GREAT time for an invasion.)",//21
|
||||
R"(
|
||||
$PLAYER
|
||||
What's with that weird sigil on its body..?)",//22
|
||||
R"(
|
||||
$PLAYER
|
||||
Urgh...Not good, seems dangerous. Time to use Petal Storm. It allows me to regenerate health while setting up seeds!)",//23
|
||||
R"(
|
||||
$PLAYER
|
||||
Then I'll be able to use Hurricane powers in order to grow them, nourishing me while dealing additional damage!)",//24
|
||||
};
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user