Sync up monster names with in-game values. Spawners loaded from map data. Spawners now are ellipses instead of circles. Added yellow slime missing death animation. New release build.

pull/28/head
sigonasr2 2 years ago
parent d254e169c4
commit b2eda563f2
  1. 53
      Crawler/Crawler.cpp
  2. 7
      Crawler/Crawler.tiled-project
  3. 7
      Crawler/Monster.cpp
  4. 12
      Crawler/Monster.h
  5. 2
      Crawler/MonsterData.cpp
  6. 2
      Crawler/Player.cpp
  7. 4
      Crawler/TMXParser.h
  8. 2
      Crawler/Version.h
  9. BIN
      Crawler/pge.data
  10. 2
      Crawler/pge.js
  11. BIN
      Crawler/pge.wasm

@ -92,47 +92,6 @@ bool Crawler::OnUserCreate(){
player.SetClass(WARRIOR); player.SetClass(WARRIOR);
player.SetPos({4*24,4*24}); player.SetPos({4*24,4*24});
SPAWNER_LIST.push_back(MonsterSpawner({360*1,96},4*24,{{
{MonsterName::SLIME_GREEN,{(rand()%20/2.f-5)*24,(rand()%20/2.f-5)*24}}
,{MonsterName::SLIME_GREEN,{(rand()%20/2.f-5)*24,(rand()%20/2.f-5)*24}}
}}));
SPAWNER_LIST.push_back(MonsterSpawner({360*2,96},4*24,{{
{MonsterName::SLIME_GREEN,{(rand()%20/2.f-5)*24,(rand()%20/2.f-5)*24}}
,{MonsterName::SLIME_GREEN,{(rand()%20/2.f-5)*24,(rand()%20/2.f-5)*24}}
,{MonsterName::SLIME_RED,{(rand()%20/2.f-5)*24,(rand()%20/2.f-5)*24}}
}}));
SPAWNER_LIST.push_back(MonsterSpawner({360*3,96},4*24,{{
{MonsterName::SLIME_BLUE,{(rand()%20/2.f-5)*24,(rand()%20/2.f-5)*24}}
,{MonsterName::SLIME_BLUE,{(rand()%20/2.f-5)*24,(rand()%20/2.f-5)*24}}
}}));
SPAWNER_LIST.push_back(MonsterSpawner({360*4,96},4*24,{{
{MonsterName::SLIME_BLUE,{(rand()%20/2.f-5)*24,(rand()%20/2.f-5)*24}}
,{MonsterName::SLIME_BLUE,{(rand()%20/2.f-5)*24,(rand()%20/2.f-5)*24}}
,{MonsterName::SLIME_GREEN,{(rand()%20/2.f-5)*24,(rand()%20/2.f-5)*24}}
,{MonsterName::SLIME_GREEN,{(rand()%20/2.f-5)*24,(rand()%20/2.f-5)*24}}
,{MonsterName::SLIME_GREEN,{(rand()%20/2.f-5)*24,(rand()%20/2.f-5)*24}}
}}));
SPAWNER_LIST.push_back(MonsterSpawner({360*5,96},4*24,{{
{MonsterName::SLIME_BLUE,{(rand()%20/2.f-5)*24,(rand()%20/2.f-5)*24}}
,{MonsterName::SLIME_BLUE,{(rand()%20/2.f-5)*24,(rand()%20/2.f-5)*24}}
,{MonsterName::SLIME_RED,{(rand()%20/2.f-5)*24,(rand()%20/2.f-5)*24}}
,{MonsterName::SLIME_RED,{(rand()%20/2.f-5)*24,(rand()%20/2.f-5)*24}}
}}));
SPAWNER_LIST.push_back(MonsterSpawner({360*6,96},4*24,{{
{MonsterName::SLIME_RED,{(rand()%20/2.f-5)*24,(rand()%20/2.f-5)*24}}
,{MonsterName::SLIME_RED,{(rand()%20/2.f-5)*24,(rand()%20/2.f-5)*24}}
,{MonsterName::SLIME_RED,{(rand()%20/2.f-5)*24,(rand()%20/2.f-5)*24}}
,{MonsterName::SLIME_RED,{(rand()%20/2.f-5)*24,(rand()%20/2.f-5)*24}}
,{MonsterName::SLIME_RED,{(rand()%20/2.f-5)*24,(rand()%20/2.f-5)*24}}
}}));
SPAWNER_LIST.push_back(MonsterSpawner({360*7,96},4*24,{{
{MonsterName::SLIME_BLUE,{(rand()%20/2.f-5)*24,(rand()%20/2.f-5)*24}}
,{MonsterName::SLIME_BLUE,{(rand()%20/2.f-5)*24,(rand()%20/2.f-5)*24}}
,{MonsterName::SLIME_BLUE,{(rand()%20/2.f-5)*24,(rand()%20/2.f-5)*24}}
,{MonsterName::SLIME_BLUE,{(rand()%20/2.f-5)*24,(rand()%20/2.f-5)*24}}
,{MonsterName::SLIME_BLUE,{(rand()%20/2.f-5)*24,(rand()%20/2.f-5)*24}}
}}));
LoadLevel(LEVEL2); LoadLevel(LEVEL2);
return true; return true;
@ -829,8 +788,20 @@ void Crawler::InitializeLevel(std::string mapFile,MapName map){
} }
void Crawler::LoadLevel(MapName map){ void Crawler::LoadLevel(MapName map){
SPAWNER_LIST.clear();
currentLevel=map; currentLevel=map;
WORLD_SIZE={MAP_DATA[map].MapData.width,MAP_DATA[map].MapData.height}; WORLD_SIZE={MAP_DATA[map].MapData.width,MAP_DATA[map].MapData.height};
for(SpawnerTag&spawner:MAP_DATA[map].SpawnerData){
std::vector<std::pair<MonsterName,vf2d>>monster_list;
vf2d spawnerRadius=vf2d{spawner.ObjectData.GetFloat("width"),spawner.ObjectData.GetFloat("height")}/2;
for(XMLTag&property:spawner.properties){
int monsterTypeID=property.GetInteger("value")-1;
if(monsterTypeID>=0&&monsterTypeID<MonsterName::END){
monster_list.push_back({MonsterName(monsterTypeID),{rand()%int(spawnerRadius.x)-spawnerRadius.x/2,rand()%int(spawnerRadius.y)-spawnerRadius.y/2}});
}
}
SPAWNER_LIST.push_back(MonsterSpawner{{spawner.ObjectData.GetFloat("x")+spawnerRadius.x,spawner.ObjectData.GetFloat("y")+spawnerRadius.y},spawnerRadius,monster_list});
}
} }
vi2d Crawler::GetWorldSize(){ vi2d Crawler::GetWorldSize(){

@ -62,9 +62,10 @@
"type": "enum", "type": "enum",
"values": [ "values": [
"None", "None",
"Monster A", "Green Slime",
"Monster B", "Blue Slime",
"Monster C" "Red Slime",
"Yellow Slime"
], ],
"valuesAsFlags": false "valuesAsFlags": false
}, },

@ -320,6 +320,9 @@ AnimationState Monster::GetDeathAnimationName(){
case SLIME_RED:{ case SLIME_RED:{
return AnimationState::RED_SLIME_DIE; return AnimationState::RED_SLIME_DIE;
} }
case SLIME_YELLOW:{
return AnimationState::YELLOW_SLIME_DIE;
}
default:{ default:{
return AnimationState::WARRIOR_IDLE_S; return AnimationState::WARRIOR_IDLE_S;
} }
@ -347,13 +350,13 @@ vf2d&Monster::GetTargetPos(){
} }
MonsterSpawner::MonsterSpawner(){} MonsterSpawner::MonsterSpawner(){}
MonsterSpawner::MonsterSpawner(vf2d pos,int range,std::vector<std::pair<MonsterName,vf2d>>monsters): MonsterSpawner::MonsterSpawner(vf2d pos,vf2d range,std::vector<std::pair<MonsterName,vf2d>>monsters):
pos(pos),range(range),monsters(monsters){ pos(pos),range(range),monsters(monsters){
} }
bool MonsterSpawner::SpawnTriggered(){ bool MonsterSpawner::SpawnTriggered(){
return triggered; return triggered;
} }
int MonsterSpawner::GetRange(){ vf2d MonsterSpawner::GetRange(){
return range; return range;
} }
vf2d MonsterSpawner::GetPos(){ vf2d MonsterSpawner::GetPos(){

@ -15,6 +15,11 @@ enum MonsterName{
SLIME_BLUE, SLIME_BLUE,
SLIME_RED, SLIME_RED,
SLIME_YELLOW, SLIME_YELLOW,
///////////////////////////////////////////////////////////////////////////////////////////////////////////
/*//*/END,//Used for detecting the end of the list, DO NOT USE OR TOUCH. Add all monsters above this//*//*/
///////////////////////////////////////////////////////////////////////////////////////////////////////////
}; };
struct MonsterData{ struct MonsterData{
@ -100,15 +105,16 @@ struct Monster{
struct MonsterSpawner{ struct MonsterSpawner{
private: private:
vf2d pos; vf2d pos;
int range; vf2d range;
std::vector<std::pair<MonsterName,vf2d>>monsters; std::vector<std::pair<MonsterName,vf2d>>monsters;
bool triggered=false; bool triggered=false;
public: public:
MonsterSpawner(); MonsterSpawner();
//For the monster list, the second pair item is the position relative to the spawner to spawn the monster. //For the monster list, the second pair item is the position relative to the spawner to spawn the monster.
MonsterSpawner(vf2d pos,int range,std::vector<std::pair<MonsterName,vf2d>>MONSTER_LIST); MonsterSpawner(vf2d pos,vf2d range,std::vector<std::pair<MonsterName,vf2d>>MONSTER_LIST);
bool SpawnTriggered(); bool SpawnTriggered();
int GetRange(); vf2d GetRange();
vf2d GetPos(); vf2d GetPos();
void SetTriggered(bool trigger,bool spawnMonsters=true); void SetTriggered(bool trigger,bool spawnMonsters=true);
friend std::ostream&operator<<(std::ostream&os,MonsterSpawner&rhs);
}; };

@ -6,5 +6,5 @@ std::map<MonsterName,MonsterData>MONSTER_DATA={
{SLIME_GREEN,MonsterData(MonsterName::SLIME_GREEN,10,5,{{AnimationState::GREEN_SLIME_IDLE,AnimationState::GREEN_SLIME_JUMP,AnimationState::GREEN_SLIME_ROLL,AnimationState::GREEN_SLIME_DIE,AnimationState::GREEN_SLIME_SPIT}},1.1f,0.8f,MonsterStrategy::RUN_TOWARDS,5)}, {SLIME_GREEN,MonsterData(MonsterName::SLIME_GREEN,10,5,{{AnimationState::GREEN_SLIME_IDLE,AnimationState::GREEN_SLIME_JUMP,AnimationState::GREEN_SLIME_ROLL,AnimationState::GREEN_SLIME_DIE,AnimationState::GREEN_SLIME_SPIT}},1.1f,0.8f,MonsterStrategy::RUN_TOWARDS,5)},
{SLIME_BLUE,MonsterData(MonsterName::SLIME_BLUE,30,10,{{AnimationState::BLUE_SLIME_IDLE,AnimationState::BLUE_SLIME_JUMP,AnimationState::BLUE_SLIME_ROLL,AnimationState::BLUE_SLIME_DIE,AnimationState::BLUE_SLIME_SPIT}},0.8f,1.0f,MonsterStrategy::SHOOT_AFAR)}, {SLIME_BLUE,MonsterData(MonsterName::SLIME_BLUE,30,10,{{AnimationState::BLUE_SLIME_IDLE,AnimationState::BLUE_SLIME_JUMP,AnimationState::BLUE_SLIME_ROLL,AnimationState::BLUE_SLIME_DIE,AnimationState::BLUE_SLIME_SPIT}},0.8f,1.0f,MonsterStrategy::SHOOT_AFAR)},
{SLIME_RED,MonsterData(MonsterName::SLIME_RED,25,10,{{AnimationState::RED_SLIME_IDLE,AnimationState::RED_SLIME_JUMP,AnimationState::RED_SLIME_ROLL,AnimationState::RED_SLIME_DIE,AnimationState::RED_SLIME_SPIT}},0.95f,1.2f,MonsterStrategy::RUN_TOWARDS,10)}, {SLIME_RED,MonsterData(MonsterName::SLIME_RED,25,10,{{AnimationState::RED_SLIME_IDLE,AnimationState::RED_SLIME_JUMP,AnimationState::RED_SLIME_ROLL,AnimationState::RED_SLIME_DIE,AnimationState::RED_SLIME_SPIT}},0.95f,1.2f,MonsterStrategy::RUN_TOWARDS,10)},
//{SLIME_YELLOW,{}}, {SLIME_YELLOW,MonsterData(MonsterName::SLIME_YELLOW,175,10,{{AnimationState::YELLOW_SLIME_IDLE,AnimationState::YELLOW_SLIME_JUMP,AnimationState::YELLOW_SLIME_ROLL,AnimationState::YELLOW_SLIME_DIE,AnimationState::YELLOW_SLIME_SPIT}},0.4f,1.6f,MonsterStrategy::RUN_TOWARDS,15)},
}; };

@ -464,7 +464,7 @@ Key Player::GetFacingDirection(){
void Player::Moved(){ void Player::Moved(){
for(MonsterSpawner&spawner:SPAWNER_LIST){ for(MonsterSpawner&spawner:SPAWNER_LIST){
if(!spawner.SpawnTriggered()&&geom2d::overlaps(geom2d::circle<float>(pos-vf2d{size*12,size*12},size*12),geom2d::circle<float>(spawner.GetPos(),spawner.GetRange()))){ if(!spawner.SpawnTriggered()&&geom2d::contains(geom2d::ellipse<float>{spawner.GetPos(),spawner.GetRange()},pos)){
spawner.SetTriggered(true); spawner.SetTriggered(true);
} }
} }

@ -11,6 +11,7 @@ struct XMLTag{
friend std::ostream& operator << (std::ostream& os, XMLTag& rhs); friend std::ostream& operator << (std::ostream& os, XMLTag& rhs);
std::string str(); std::string str();
int GetInteger(std::string dataTag); int GetInteger(std::string dataTag);
float GetFloat(std::string dataTag);
double GetDouble(std::string dataTag); double GetDouble(std::string dataTag);
bool GetBool(std::string dataTag); bool GetBool(std::string dataTag);
}; };
@ -79,6 +80,9 @@ class TMXParser{
int XMLTag::GetInteger(std::string dataTag) { int XMLTag::GetInteger(std::string dataTag) {
return std::stoi(data[dataTag]); return std::stoi(data[dataTag]);
} }
float XMLTag::GetFloat(std::string dataTag) {
return std::stof(data[dataTag]);
}
double XMLTag::GetDouble(std::string dataTag) { double XMLTag::GetDouble(std::string dataTag) {
return std::stod(data[dataTag]); return std::stod(data[dataTag]);
} }

@ -2,7 +2,7 @@
#define VERSION_MAJOR 0 #define VERSION_MAJOR 0
#define VERSION_MINOR 2 #define VERSION_MINOR 2
#define VERSION_PATCH 0 #define VERSION_PATCH 0
#define VERSION_BUILD 180 #define VERSION_BUILD 193
#define stringify(a) stringify_(a) #define stringify(a) stringify_(a)
#define stringify_(a) #a #define stringify_(a) #a

Binary file not shown.

Before

Width:  |  Height:  |  Size: 179 KiB

After

Width:  |  Height:  |  Size: 706 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.
Loading…
Cancel
Save