Teleport code added in Wizard. Needs more debugging.

pull/28/head
sigonasr2 2 years ago
parent ba6bc74f1f
commit 888d2a91a6
  1. 16
      Crawler/Class.cpp
  2. 12
      Crawler/Crawler.cpp
  3. 2
      Crawler/Crawler.h
  4. 34
      Crawler/Player.cpp
  5. 9
      Crawler/Player.h
  6. 2
      Crawler/Version.h

@ -300,7 +300,21 @@ bool Wizard::Ability3(){
}
bool Wizard::RightClickAbility(){
return true;
ACCESS_PLAYER
float pointMouseDirection=atan2(game->GetWorldMousePos().y-p.GetPos().y,game->GetWorldMousePos().x-p.GetPos().x);
vf2d pointTowardsMouse={cos(pointMouseDirection),sin(pointMouseDirection)};
float dist=std::clamp(geom2d::line<float>{p.GetPos(),game->GetWorldMousePos()}.length(),0.f,650.f);
vf2d teleportPoint=p.GetPos()+pointTowardsMouse*dist;
while(dist>0&&game->HasTileCollision(game->GetCurrentLevel(),teleportPoint)){
dist--;
teleportPoint=p.GetPos()+pointTowardsMouse*dist;
}
if(dist>0){
p.SetPos(teleportPoint);
return true;
} else {
return false;
}
}
Witch::Witch(std::string name,Class cl,Ability rightClickAbility,Ability ability1,Ability ability2,Ability ability3,

@ -107,11 +107,10 @@ bool Crawler::OnUserCreate(){
player.AddAnimation(AnimationState::WIZARD_ATTACK_W);
view=TileTransformedView{GetScreenSize(),{1,1}};
player.SetClass(WARRIOR);
player.SetPos({4*24,4*24});
LoadLevel(CAMPAIGN_1_1);
player.SetClass(WARRIOR);
return true;
}
@ -875,7 +874,6 @@ void Crawler::LoadLevel(MapName map){
SPAWNER_LIST.clear();
foregroundTileGroups.clear();
currentLevel=map;
player.SetPos(MAP_DATA[map].MapData.playerSpawnLocation);
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;
@ -919,6 +917,7 @@ void Crawler::LoadLevel(MapName map){
}
}
}
player.SetPos(MAP_DATA[map].MapData.playerSpawnLocation);
}
vi2d Crawler::GetWorldSize(){
@ -949,6 +948,11 @@ TilesheetData Crawler::GetTileSheet(MapName map,int tileID){
}
}
bool Crawler::HasTileCollision(MapName map,vf2d pos){
geom2d::rect<int>collisionRect=GetTileCollision(map,pos);
return collisionRect.pos==NO_COLLISION.pos&&collisionRect.size==NO_COLLISION.size;
}
geom2d::rect<int>Crawler::GetTileCollision(MapName map,vf2d pos){
for(LayerTag&layer:MAP_DATA[map].LayerData){
int tileID=layer.tiles[int(pos.y)/24][int(pos.x)/24]-1;

@ -42,6 +42,7 @@ public:
Crawler();
public:
geom2d::rect<int>NO_COLLISION={{0,0},{1,1}};
vi2d WORLD_SIZE={120,8};
TileTransformedView view;
bool OnUserCreate() override;
@ -76,5 +77,6 @@ public:
//tileID is the tile number from the tilesets.
TilesheetData GetTileSheet(MapName map,int tileID);
geom2d::rect<int>GetTileCollision(MapName map,vf2d pos);
bool HasTileCollision(MapName map,vf2d pos);
MapName GetCurrentLevel();
};

@ -29,42 +29,60 @@ void Player::SetClass(Class cl){
UpdateIdleAnimation(DOWN);
}
void Player::SetX(float x){
bool Player::SetX(float x){
vf2d newPos={x,pos.y};
vi2d tilePos=vi2d(newPos/24)*24;
geom2d::rect<int>collisionRect=game->GetTileCollision(game->GetCurrentLevel(),newPos);
if(collisionRect.pos==vi2d{0,0}&&collisionRect.size==vi2d{1,1}){
#pragma region lambdas
auto NoTileCollisionExistsHere=[&](){return collisionRect.pos==game->NO_COLLISION.pos&&collisionRect.size==game->NO_COLLISION.size;};
#pragma endregion
if(NoTileCollisionExistsHere()){
pos.x=std::clamp(x,12.f*GetSizeMult(),float(game->WORLD_SIZE.x*24-12*GetSizeMult()));
return true;
} else {
geom2d::rect<float>collision={collisionRect.pos,collisionRect.size};
#pragma region lambdas
auto NoPlayerCollisionWithTile=[&](){return !geom2d::overlaps(newPos,collision);};
#pragma endregion
collision.pos+=tilePos;
if(!geom2d::overlaps(newPos,collision)){
if(NoPlayerCollisionWithTile()){
pos.x=std::clamp(x,12.f*GetSizeMult(),float(game->WORLD_SIZE.x*24-12*GetSizeMult()));
return true;
}
}
return false;
};
void Player::SetY(float y){
bool Player::SetY(float y){
vf2d newPos={pos.x,y};
vi2d tilePos=vi2d(newPos/24)*24;
geom2d::rect<int>collisionRect=game->GetTileCollision(game->GetCurrentLevel(),newPos);
if(collisionRect.pos==vi2d{0,0}&&collisionRect.size==vi2d{1,1}){
#pragma region lambdas
auto NoTileCollisionExistsHere=[&](){return collisionRect.pos==game->NO_COLLISION.pos&&collisionRect.size==game->NO_COLLISION.size;};
#pragma endregion
if(NoTileCollisionExistsHere()){
pos.y=std::clamp(y,12.f*GetSizeMult(),float(game->WORLD_SIZE.y*24-12*GetSizeMult()));
return true;
} else {
geom2d::rect<float>collision={collisionRect.pos,collisionRect.size};
#pragma region lambdas
auto NoPlayerCollisionWithTile=[&](){return !geom2d::overlaps(newPos,collision);};
#pragma endregion
collision.pos+=tilePos;
if(!geom2d::overlaps(newPos,collision)){
if(NoPlayerCollisionWithTile()){
pos.y=std::clamp(y,12.f*GetSizeMult(),float(game->WORLD_SIZE.y*24-12*GetSizeMult()));
return true;
}
}
return false;
}
void Player::SetZ(float z){
this->z=z;
}
void Player::SetPos(vf2d pos){
this->pos=pos;
bool Player::SetPos(vf2d pos){
return SetX(pos.x)|SetY(pos.y);
}
vf2d&Player::GetPos(){

@ -51,10 +51,13 @@ struct Player{
void SetFacingDirection(Key direction);
void SetLastReleasedMovementKey(Key k);
void Spin(float duration,float spinSpd);
void SetX(float x);
void SetY(float y);
//Returns true if the move was valid and successful.
bool SetX(float x);
//Returns true if the move was valid and successful.
bool SetY(float y);
void SetZ(float z);
void SetPos(vf2d pos);
//Returns true if the move was valid and successful.
bool SetPos(vf2d pos);
void SetClass(Class cl);
std::vector<Buff>buffList;
protected:

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

Loading…
Cancel
Save