Added intro camera movement and transition changing. Release Build 7603.
This commit is contained in:
parent
99049d6fa0
commit
57bad057ed
@ -2288,10 +2288,6 @@ const MapName&AiL::GetCurrentLevel()const{
|
|||||||
return currentLevel;
|
return currentLevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::map<std::string,std::vector<ZoneData>>&AiL::GetZoneData(MapName map){
|
|
||||||
return MAP_DATA[map].ZoneData;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AiL::ChangePlayerClass(Class cl){
|
void AiL::ChangePlayerClass(Class cl){
|
||||||
Ability itemAbility1=player->useItem1;
|
Ability itemAbility1=player->useItem1;
|
||||||
Ability itemAbility2=player->useItem2;
|
Ability itemAbility2=player->useItem2;
|
||||||
|
@ -231,7 +231,6 @@ public:
|
|||||||
bool HasTileCollision(MapName map,vf2d pos,bool upperLevel=false);
|
bool HasTileCollision(MapName map,vf2d pos,bool upperLevel=false);
|
||||||
const MapName&GetCurrentLevel()const;
|
const MapName&GetCurrentLevel()const;
|
||||||
bool IsBridgeLayer(LayerTag&layer);
|
bool IsBridgeLayer(LayerTag&layer);
|
||||||
std::map<std::string,std::vector<ZoneData>>&GetZoneData(MapName map);
|
|
||||||
void PopulateRenderLists();
|
void PopulateRenderLists();
|
||||||
void ChangePlayerClass(Class cl);
|
void ChangePlayerClass(Class cl);
|
||||||
std::string GetString(std::string key);
|
std::string GetString(std::string key);
|
||||||
|
@ -118,13 +118,13 @@ void ItemDrop::UpdateDrops(float fElapsedTime){
|
|||||||
|
|
||||||
#pragma region Handle Upper/Lower Level Zone Intersecting
|
#pragma region Handle Upper/Lower Level Zone Intersecting
|
||||||
if(drop.speed.mag()>0){
|
if(drop.speed.mag()>0){
|
||||||
std::map<std::string,std::vector<ZoneData>>&zoneData=game->GetZoneData(game->GetCurrentLevel());
|
const std::map<std::string,std::vector<ZoneData>>&zoneData=game->GetZones(game->GetCurrentLevel());
|
||||||
for(ZoneData&upperLevelZone:zoneData["UpperZone"]){
|
for(const ZoneData&upperLevelZone:zoneData.at("UpperZone")){
|
||||||
if(geom2d::overlaps(upperLevelZone.zone,drop.pos)){
|
if(geom2d::overlaps(upperLevelZone.zone,drop.pos)){
|
||||||
drop.upperLevel=true;
|
drop.upperLevel=true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for(ZoneData&lowerLevelZone:zoneData["LowerZone"]){
|
for(const ZoneData&lowerLevelZone:zoneData.at("LowerZone")){
|
||||||
if(geom2d::overlaps(lowerLevelZone.zone,drop.pos)){
|
if(geom2d::overlaps(lowerLevelZone.zone,drop.pos)){
|
||||||
drop.upperLevel=false;
|
drop.upperLevel=false;
|
||||||
}
|
}
|
||||||
|
@ -455,13 +455,13 @@ bool Monster::SetPos(vf2d pos){
|
|||||||
return resultX||resultY;
|
return resultX||resultY;
|
||||||
}
|
}
|
||||||
void Monster::Moved(){
|
void Monster::Moved(){
|
||||||
std::map<std::string,std::vector<ZoneData>>&zoneData=game->GetZoneData(game->GetCurrentLevel());
|
const std::map<std::string,std::vector<ZoneData>>&zoneData=game->GetZones(game->GetCurrentLevel());
|
||||||
for(ZoneData&upperLevelZone:zoneData["UpperZone"]){
|
for(const ZoneData&upperLevelZone:zoneData.at("UpperZone")){
|
||||||
if(geom2d::overlaps(upperLevelZone.zone,pos)){
|
if(geom2d::overlaps(upperLevelZone.zone,pos)){
|
||||||
upperLevel=true;
|
upperLevel=true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for(ZoneData&lowerLevelZone:zoneData["LowerZone"]){
|
for(const ZoneData&lowerLevelZone:zoneData.at("LowerZone")){
|
||||||
if(geom2d::overlaps(lowerLevelZone.zone,pos)){
|
if(geom2d::overlaps(lowerLevelZone.zone,pos)){
|
||||||
upperLevel=false;
|
upperLevel=false;
|
||||||
}
|
}
|
||||||
|
@ -783,13 +783,13 @@ void Player::Moved(){
|
|||||||
spawner.SetTriggered(true);
|
spawner.SetTriggered(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
std::map<std::string,std::vector<ZoneData>>&zoneData=game->GetZoneData(game->GetCurrentLevel());
|
const std::map<std::string,std::vector<ZoneData>>&zoneData=game->GetZones(game->GetCurrentLevel());
|
||||||
for(ZoneData&upperLevelZone:zoneData["UpperZone"]){
|
for(const ZoneData&upperLevelZone:zoneData.at("UpperZone")){
|
||||||
if(geom2d::overlaps(upperLevelZone.zone,pos)){
|
if(geom2d::overlaps(upperLevelZone.zone,pos)){
|
||||||
upperLevel=true;
|
upperLevel=true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for(ZoneData&lowerLevelZone:zoneData["LowerZone"]){
|
for(const ZoneData&lowerLevelZone:zoneData.at("LowerZone")){
|
||||||
if(geom2d::overlaps(lowerLevelZone.zone,pos)){
|
if(geom2d::overlaps(lowerLevelZone.zone,pos)){
|
||||||
upperLevel=false;
|
upperLevel=false;
|
||||||
}
|
}
|
||||||
|
@ -41,6 +41,7 @@ All rights reserved.
|
|||||||
#include "TitleScreen.h"
|
#include "TitleScreen.h"
|
||||||
#include "Key.h"
|
#include "Key.h"
|
||||||
#include "ItemDrop.h"
|
#include "ItemDrop.h"
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
INCLUDE_game
|
INCLUDE_game
|
||||||
|
|
||||||
@ -53,8 +54,12 @@ void State_MainMenu::OnStateChange(GameState*prevState){
|
|||||||
void State_MainMenu::OnLevelLoad(){
|
void State_MainMenu::OnLevelLoad(){
|
||||||
game->GetPlayer()->SetIframes(999999.f);
|
game->GetPlayer()->SetIframes(999999.f);
|
||||||
game->GetPlayer()->SetInvisible(true);
|
game->GetPlayer()->SetInvisible(true);
|
||||||
|
SelectAndMoveToNewFocusArea();
|
||||||
}
|
}
|
||||||
void State_MainMenu::OnUserUpdate(AiL*game){
|
void State_MainMenu::OnUserUpdate(AiL*game){
|
||||||
|
game->GetPlayer()->ForceSetPos(game->GetPlayer()->GetPos()+cameraMoveDir*8*game->GetElapsedTime());
|
||||||
|
lastMoveTime+=game->GetElapsedTime();
|
||||||
|
if(lastMoveTime>8.f)SelectAndMoveToNewFocusArea();
|
||||||
TitleScreen::Update();
|
TitleScreen::Update();
|
||||||
if(AiL::KEY_CONFIRM.Released()){
|
if(AiL::KEY_CONFIRM.Released()){
|
||||||
TitleScreen::Skip();
|
TitleScreen::Skip();
|
||||||
@ -71,3 +76,37 @@ void State_MainMenu::OnUserUpdate(AiL*game){
|
|||||||
void State_MainMenu::Draw(AiL*game){
|
void State_MainMenu::Draw(AiL*game){
|
||||||
TitleScreen::Draw();
|
TitleScreen::Draw();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const ZoneData&State_MainMenu::ChooseRandomFocusArea(){
|
||||||
|
//std::vector<ZoneData>
|
||||||
|
if(game->GetZones().count("Focus Area")>0){
|
||||||
|
const std::vector<ZoneData>&zones=game->GetZones().at("Focus Area");
|
||||||
|
newSelectedFocusAreaIndex=util::random()%zones.size();
|
||||||
|
return zones[newSelectedFocusAreaIndex];
|
||||||
|
}else ERR("WARNING! No focus areas included in the intro map!");
|
||||||
|
|
||||||
|
return game->GetZones().at("Focus Area")[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
void State_MainMenu::SelectAndMoveToNewFocusArea(){
|
||||||
|
const ZoneData&newFocusArea=ChooseRandomFocusArea();
|
||||||
|
if(lastSelectedFocusAreaIndex==newSelectedFocusAreaIndex)return;
|
||||||
|
game->camera.MoveCamera(newFocusArea.zone.pos);
|
||||||
|
game->GetPlayer()->ForceSetPos(newFocusArea.zone.pos);
|
||||||
|
cameraMoveDir={};
|
||||||
|
for(const XMLTag&tag:newFocusArea.properties){
|
||||||
|
if(tag.data.at("name")=="Scroll Direction"){
|
||||||
|
std::string_view dir=tag.data.at("value");
|
||||||
|
if(dir=="NORTH"sv)cameraMoveDir={0.f,-1.f};else
|
||||||
|
if(dir=="NORTHEAST"sv)cameraMoveDir={1.f,-1.f};else
|
||||||
|
if(dir=="EAST"sv)cameraMoveDir={1.f,0.f};else
|
||||||
|
if(dir=="SOUTHEAST"sv)cameraMoveDir={1.f,1.f};else
|
||||||
|
if(dir=="SOUTH"sv)cameraMoveDir={0.f,1.f};else
|
||||||
|
if(dir=="SOUTHWEST"sv)cameraMoveDir={-1.f,1.f};else
|
||||||
|
if(dir=="WEST"sv)cameraMoveDir={-1.f,0.f};else
|
||||||
|
if(dir=="NORTHWEST"sv)cameraMoveDir={-1.f,-1.f};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
lastMoveTime=0.f;
|
||||||
|
lastSelectedFocusAreaIndex=newSelectedFocusAreaIndex;
|
||||||
|
}
|
@ -36,10 +36,18 @@ All rights reserved.
|
|||||||
*/
|
*/
|
||||||
#pragma endregion
|
#pragma endregion
|
||||||
#include "GameState.h"
|
#include "GameState.h"
|
||||||
|
#include "TMXParser.h"
|
||||||
|
|
||||||
class State_MainMenu:public GameState{
|
class State_MainMenu:public GameState{
|
||||||
virtual void OnStateChange(GameState*prevState)override final;
|
virtual void OnStateChange(GameState*prevState)override final;
|
||||||
virtual void OnUserUpdate(AiL*game)override final;
|
virtual void OnUserUpdate(AiL*game)override final;
|
||||||
virtual void Draw(AiL*game)override final;
|
virtual void Draw(AiL*game)override final;
|
||||||
virtual void OnLevelLoad()override final;
|
virtual void OnLevelLoad()override final;
|
||||||
|
|
||||||
|
const ZoneData&ChooseRandomFocusArea();
|
||||||
|
vf2d cameraMoveDir;
|
||||||
|
float lastMoveTime=0.f;
|
||||||
|
size_t newSelectedFocusAreaIndex=0;
|
||||||
|
size_t lastSelectedFocusAreaIndex=0;
|
||||||
|
void SelectAndMoveToNewFocusArea();
|
||||||
};
|
};
|
@ -98,6 +98,7 @@ struct SpawnerTag{
|
|||||||
struct ZoneData{
|
struct ZoneData{
|
||||||
geom2d::rect<int>zone;
|
geom2d::rect<int>zone;
|
||||||
bool isUpper=false;
|
bool isUpper=false;
|
||||||
|
std::vector<XMLTag>properties;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct NPCData{
|
struct NPCData{
|
||||||
@ -517,23 +518,19 @@ class TMXParser{
|
|||||||
if(newTag.tag=="property"&¤tStagePlate!=nullptr){
|
if(newTag.tag=="property"&¤tStagePlate!=nullptr){
|
||||||
currentStagePlate->properties[newTag.data["name"]]={newTag.data["name"],newTag.data["value"]};
|
currentStagePlate->properties[newTag.data["name"]]={newTag.data["name"],newTag.data["value"]};
|
||||||
}else
|
}else
|
||||||
|
if(newTag.tag=="property"&&prevZoneData!=nullptr){
|
||||||
|
//This is a property for a zone that doesn't fit into the other categories, we add it to the previous zone data encountered.
|
||||||
|
prevZoneData->properties.push_back(newTag);
|
||||||
|
}else
|
||||||
if (newTag.tag=="object"&&newTag.data.find("type")!=newTag.data.end()){
|
if (newTag.tag=="object"&&newTag.data.find("type")!=newTag.data.end()){
|
||||||
//This is an object with a type that doesn't fit into other categories, we can add it to ZoneData.
|
//This is an object with a type that doesn't fit into other categories, we can add it to ZoneData.
|
||||||
if(parsedMapInfo.ZoneData.find(newTag.data["type"])!=parsedMapInfo.ZoneData.end()){
|
std::vector<ZoneData>&zones=parsedMapInfo.ZoneData[newTag.data["type"]];
|
||||||
std::vector<ZoneData>&zones=parsedMapInfo.ZoneData.at(newTag.data["type"]);
|
float width=1.f;
|
||||||
float width=1.f;
|
float height=1.f;
|
||||||
float height=1.f;
|
if(newTag.data.count("width")>0)width=newTag.GetFloat("width");
|
||||||
if(newTag.data.count("width")>0)width=newTag.GetFloat("width");
|
if(newTag.data.count("height")>0)height=newTag.GetFloat("height");
|
||||||
if(newTag.data.count("height")>0)height=newTag.GetFloat("height");
|
zones.emplace_back(geom2d::rect<int>{{newTag.GetInteger("x"),newTag.GetInteger("y")},{int(width),int(height)}});
|
||||||
zones.emplace_back(geom2d::rect<int>{{newTag.GetInteger("x"),newTag.GetInteger("y")},{int(width),int(height)}});
|
prevZoneData=&zones.back();
|
||||||
prevZoneData=&zones.back();
|
|
||||||
} else {
|
|
||||||
if(newTag.data["width"].length()>0&&newTag.data["height"].length()>0){ //This ensures the zone is valid to begin with.
|
|
||||||
std::vector<ZoneData>&zones=parsedMapInfo.ZoneData[newTag.data["type"]];
|
|
||||||
zones.emplace_back(geom2d::rect<int>{{newTag.GetInteger("x"),newTag.GetInteger("y")},{newTag.GetInteger("width"),newTag.GetInteger("height")}});
|
|
||||||
prevZoneData=&zones.back();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}else{
|
}else{
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
if(_DEBUG_MAP_LOAD_INFO)std::cout<<"Unsupported tag format! Ignoring."<<"\n";
|
if(_DEBUG_MAP_LOAD_INFO)std::cout<<"Unsupported tag format! Ignoring."<<"\n";
|
||||||
|
@ -13,8 +13,6 @@ March 30th -> Public Demo Release
|
|||||||
|
|
||||||
Add Bonus XP when completing a stage
|
Add Bonus XP when completing a stage
|
||||||
|
|
||||||
- Title Screen setpieces
|
|
||||||
|
|
||||||
- Hide mouse cursor during controller play. Reveal it again during mouse play.
|
- Hide mouse cursor during controller play. Reveal it again during mouse play.
|
||||||
|
|
||||||
- Auto aim causes retreat-type moves to aim away from the auto target, and prefer the direction the player's moving in.
|
- Auto aim causes retreat-type moves to aim away from the auto target, and prefer the direction the player's moving in.
|
||||||
|
@ -54,8 +54,8 @@ void Test::is(std::string conditionStr,bool testResult){
|
|||||||
|
|
||||||
void Test::RunMapTests(){
|
void Test::RunMapTests(){
|
||||||
is("There are two LowerBridgeCollision zones in Campaign I-I",
|
is("There are two LowerBridgeCollision zones in Campaign I-I",
|
||||||
game->GetZoneData("CAMPAIGN_1_1").count("LowerBridgeCollision")
|
game->GetZones("CAMPAIGN_1_1").count("LowerBridgeCollision")
|
||||||
&&game->GetZoneData("CAMPAIGN_1_1").at("LowerBridgeCollision").size()>=2);
|
&&game->GetZones("CAMPAIGN_1_1").at("LowerBridgeCollision").size()>=2);
|
||||||
for(auto&[key,value]:game->MAP_DATA){
|
for(auto&[key,value]:game->MAP_DATA){
|
||||||
is("A Map type has been selected for map "+key,
|
is("A Map type has been selected for map "+key,
|
||||||
value.GetMapType()!=""&&value.GetMapType()!="Unspecified");
|
value.GetMapType()!=""&&value.GetMapType()!="Unspecified");
|
||||||
|
@ -39,7 +39,7 @@ All rights reserved.
|
|||||||
#define VERSION_MAJOR 0
|
#define VERSION_MAJOR 0
|
||||||
#define VERSION_MINOR 3
|
#define VERSION_MINOR 3
|
||||||
#define VERSION_PATCH 0
|
#define VERSION_PATCH 0
|
||||||
#define VERSION_BUILD 7587
|
#define VERSION_BUILD 7603
|
||||||
|
|
||||||
#define stringify(a) stringify_(a)
|
#define stringify(a) stringify_(a)
|
||||||
#define stringify_(a) #a
|
#define stringify_(a) #a
|
||||||
|
@ -1285,7 +1285,7 @@
|
|||||||
</data>
|
</data>
|
||||||
</layer>
|
</layer>
|
||||||
<objectgroup id="23" name="Spawn Zones">
|
<objectgroup id="23" name="Spawn Zones">
|
||||||
<object id="9" name="Spawn 15" type="SpawnGroup" x="2989" y="2105" width="358" height="358">
|
<object id="9" name="Spawn 15" type="SpawnGroup" x="2611" y="1915" width="1130" height="668">
|
||||||
<ellipse/>
|
<ellipse/>
|
||||||
</object>
|
</object>
|
||||||
<object id="10" name="Windhound" type="Monster" x="3142" y="2233">
|
<object id="10" name="Windhound" type="Monster" x="3142" y="2233">
|
||||||
@ -1330,7 +1330,7 @@
|
|||||||
</properties>
|
</properties>
|
||||||
<point/>
|
<point/>
|
||||||
</object>
|
</object>
|
||||||
<object id="16" name="Spawn 15" type="SpawnGroup" x="2629" y="2091" width="358" height="358">
|
<object id="16" name="Spawn 15" type="SpawnGroup" x="2629" y="1921" width="1104" height="655">
|
||||||
<ellipse/>
|
<ellipse/>
|
||||||
</object>
|
</object>
|
||||||
<object id="22" name="Bear" type="Monster" x="2748.5" y="2237.5">
|
<object id="22" name="Bear" type="Monster" x="2748.5" y="2237.5">
|
||||||
@ -1347,7 +1347,7 @@
|
|||||||
</properties>
|
</properties>
|
||||||
<point/>
|
<point/>
|
||||||
</object>
|
</object>
|
||||||
<object id="24" name="Spawn 15" type="SpawnGroup" x="3352" y="2120" width="358" height="358">
|
<object id="24" name="Spawn 15" type="SpawnGroup" x="2638" y="1912" width="1072" height="664">
|
||||||
<ellipse/>
|
<ellipse/>
|
||||||
</object>
|
</object>
|
||||||
<object id="25" name="Bear" type="Monster" x="3471.5" y="2266.5">
|
<object id="25" name="Bear" type="Monster" x="3471.5" y="2266.5">
|
||||||
@ -1364,7 +1364,7 @@
|
|||||||
</properties>
|
</properties>
|
||||||
<point/>
|
<point/>
|
||||||
</object>
|
</object>
|
||||||
<object id="27" name="Spawn 15" type="SpawnGroup" x="1607" y="288" width="358" height="358">
|
<object id="27" name="Spawn 15" type="SpawnGroup" x="849" y="34" width="2028" height="808">
|
||||||
<ellipse/>
|
<ellipse/>
|
||||||
</object>
|
</object>
|
||||||
<object id="28" name="Green Slime" type="Monster" x="2285.5" y="401.5">
|
<object id="28" name="Green Slime" type="Monster" x="2285.5" y="401.5">
|
||||||
@ -1555,7 +1555,7 @@
|
|||||||
<object id="66" type="EndZone" x="733" y="780"/>
|
<object id="66" type="EndZone" x="733" y="780"/>
|
||||||
</objectgroup>
|
</objectgroup>
|
||||||
<objectgroup id="22" name="Environmental Sounds">
|
<objectgroup id="22" name="Environmental Sounds">
|
||||||
<object id="1" name="Spawn 12" type="SpawnGroup" x="353" y="2381" width="498" height="402">
|
<object id="1" name="Spawn 12" type="SpawnGroup" x="86" y="1890" width="1058" height="893">
|
||||||
<ellipse/>
|
<ellipse/>
|
||||||
</object>
|
</object>
|
||||||
<object id="2" name="Frog" type="Monster" x="562.33" y="2518.33">
|
<object id="2" name="Frog" type="Monster" x="562.33" y="2518.33">
|
||||||
|
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user