New seed mechanic, new player encounter positioning

Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
master
sigonasr2 3 years ago
parent 24291a31d9
commit 2d2761540d
  1. 247
      SeasonsOfLoneliness.cpp
  2. BIN
      Seasons_of_Loneliness
  3. BIN
      Seasons_of_Loneliness.data
  4. 2
      Seasons_of_Loneliness.js
  5. BIN
      Seasons_of_Loneliness.wasm
  6. 4
      assets/maps/map2
  7. BIN
      assets/seed.png
  8. BIN
      assets/tree.png
  9. 15
      data.h

@ -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,17 +1830,34 @@ public:
}
}break;
case cutscene::SHAKE:{
if (frameCount%4==0) {
PLAYER_COORDS[1]+=0.25;
} else
if (frameCount%4==1) {
PLAYER_COORDS[1]+=0.25;
} else
if (frameCount%4==2) {
PLAYER_COORDS[1]-=0.25;
} else
if (frameCount%4==3) {
PLAYER_COORDS[1]-=0.25;
if (CUTSCENE_TIMER<60*4) {
if (frameCount%4==0) {
PLAYER_COORDS[1]+=0.25;
} else
if (frameCount%4==1) {
PLAYER_COORDS[1]+=0.25;
} else
if (frameCount%4==2) {
PLAYER_COORDS[1]-=0.25;
} else
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);
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) {
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.

@ -32,4 +32,6 @@
11;5;PLANT
15;6;EXIT
16;6;EXIT
20;4;COMPUTER
20;4;COMPUTER
20;5;PETALSTORM_NODE
20;6;HURRICANE_NODE

Binary file not shown.

After

Width:  |  Height:  |  Size: 803 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

@ -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…
Cancel
Save