Added error handling for when creatures are specified in spawn zones but do not have a corresponding image. Gracefully handle random extra zones that are accidentally added with no type specified. Add in foresty boss/overworld sample themes. Add in placeholder frog info. Refactor MapName to just use strings instead of an enum since we don't want manual upkeep.

pull/29/head
sigonasr2 1 year ago
parent bcc71601b6
commit 57f482016f
  1. 8
      Adventures in Lestoria/Adventures in Lestoria.tiled-project
  2. 4
      Adventures in Lestoria/Adventures in Lestoria.vcxproj
  3. 3
      Adventures in Lestoria/Adventures in Lestoria.vcxproj.filters
  4. 21
      Adventures in Lestoria/AdventuresInLestoria.cpp
  5. 2
      Adventures in Lestoria/AdventuresInLestoria.h
  6. 22
      Adventures in Lestoria/Audio.cpp
  7. 1
      Adventures in Lestoria/DEFINES.h
  8. 1
      Adventures in Lestoria/EncountersSpawnListScrollableWindowComponent.h
  9. 3
      Adventures in Lestoria/Map.cpp
  10. 3
      Adventures in Lestoria/Map.h
  11. 48
      Adventures in Lestoria/MapName.h
  12. 4
      Adventures in Lestoria/MonsterData.cpp
  13. 1
      Adventures in Lestoria/OverworldMapLevelWindow.cpp
  14. 3
      Adventures in Lestoria/State_GameRun.cpp
  15. 1
      Adventures in Lestoria/State_MainMenu.cpp
  16. 2
      Adventures in Lestoria/State_OverworldMap.cpp
  17. 20
      Adventures in Lestoria/TMXParser.h
  18. 2
      Adventures in Lestoria/TSXParser.h
  19. 8
      Adventures in Lestoria/Test.cpp
  20. 1
      Adventures in Lestoria/TitleScreen.cpp
  21. 2
      Adventures in Lestoria/Version.h
  22. 7
      Adventures in Lestoria/assets/Campaigns/1_1_v2.tmx
  23. 9
      Adventures in Lestoria/assets/Campaigns/1_2.tmx
  24. 1
      Adventures in Lestoria/assets/Campaigns/1_3.tmx
  25. 1
      Adventures in Lestoria/assets/Campaigns/1_4.tmx
  26. 1
      Adventures in Lestoria/assets/Campaigns/1_5.tmx
  27. 9
      Adventures in Lestoria/assets/Campaigns/1_6.tmx
  28. 6
      Adventures in Lestoria/assets/Campaigns/1_7.tmx
  29. 6
      Adventures in Lestoria/assets/Campaigns/1_8.tmx
  30. 1
      Adventures in Lestoria/assets/Campaigns/Boss_1_v2.tmx
  31. 1
      Adventures in Lestoria/assets/Campaigns/World_Map.tmx
  32. 34
      Adventures in Lestoria/assets/config/Monsters.txt
  33. 60
      Adventures in Lestoria/assets/config/audio/bgm.txt
  34. 1
      Adventures in Lestoria/assets/config/audio/events.txt
  35. BIN
      Adventures in Lestoria/assets/monsters/Frog.png
  36. BIN
      Adventures in Lestoria/assets/music/foresty_boss.ogg
  37. BIN
      Adventures in Lestoria/assets/music/overworld.ogg

@ -40,7 +40,9 @@
"type": "enum",
"values": [
"None",
"foresty1_1"
"foresty1_1",
"overworld",
"foresty_boss"
],
"valuesAsFlags": false
},
@ -273,7 +275,9 @@
"Yellow Slime",
"Flower Turret",
"Slime King",
"Wolf"
"Wolf",
"Bear",
"Frog"
],
"valuesAsFlags": false
},

@ -383,10 +383,6 @@
<SubType>
</SubType>
</ClInclude>
<ClInclude Include="MapName.h">
<SubType>
</SubType>
</ClInclude>
<ClInclude Include="olcPGEX_SplashScreen.h" />
<ClInclude Include="PlayerMoneyLabel.h">
<SubType>

@ -417,9 +417,6 @@
<ClInclude Include="EnvironmentalAudio.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="MapName.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="stb_vorbis.h">
<Filter>Header Files</Filter>
</ClInclude>

@ -86,7 +86,6 @@ std::vector<MonsterSpawner>SPAWNER_LIST;
std::vector<std::shared_ptr<DamageNumber>>DAMAGENUMBER_LIST;
std::vector<std::unique_ptr<Bullet>>BULLET_LIST;
safemap<std::string,Renderable>GFX;
safemap<std::string,MapName>LEVEL_NAMES;
utils::datafile DATA;
AiL*game;
InputGroup AiL::KEY_LEFT;
@ -240,7 +239,7 @@ bool AiL::OnUserCreate(){
EnvironmentalAudio::Initialize();
SoundEffect::Initialize();
LoadLevel(LEVEL_NAMES["starting_map"_S]);
LoadLevel("starting_map"_S);
ChangePlayerClass(WARRIOR);
GameState::Initialize();
@ -1587,7 +1586,7 @@ void AiL::InitializeLevel(std::string mapFile,MapName map){
if(VisualNovel::storyLevelData.count(cp.map)){ //Visual novel story data for story levels.
cp.levelDataExists=true;
}
if(LEVEL_NAMES.count(cp.map)&&&MapHelper::MapFromString(cp.map)==&MAP_DATA[map]){
if(MAP_DATA.find(cp.map)!=MAP_DATA.end()){
MAP_DATA[map].name=cp.name;
for(std::string spawn:MAP_DATA[map].spawns){
cp.spawns.push_back(spawn);
@ -2176,21 +2175,11 @@ bool AiL::OnUserDestroy(){
}
void AiL::InitializeLevels(){
#define INITLEVEL(map) \
LEVEL_NAMES[#map]=map; \
InitializeLevel("map_path"_S + "Levels."#map ## _S,map);
INITLEVEL(WORLD_MAP);
INITLEVEL(CAMPAIGN_1_1);
INITLEVEL(BOSS_1);
INITLEVEL(CAMPAIGN_1_2);
INITLEVEL(CAMPAIGN_1_3);
INITLEVEL(CAMPAIGN_1_4);
INITLEVEL(CAMPAIGN_1_5);
for(auto&[key,size]:DATA["Levels"]){
InitializeLevel("map_path"_S+operator""_S(("Levels."+key).c_str(),("Levels."+key).size()),key);
}
Test::RunMapTests();
LEVEL_NAMES.SetInitialized();
}
void AiL::SpawnMonster(vf2d pos,MonsterData&data,bool upperLevel,bool isBossSpawn){

@ -89,7 +89,7 @@ private:
float lastWorldShakeAdjust=0;
vf2d worldShakeVel={};
const float WORLD_SHAKE_ADJUST_MAX_TIME=0.4f;
MapName currentLevel=MapName::CAMPAIGN_1_1;
MapName currentLevel="CAMPAIGN_1_1";
std::vector<TileGroup>foregroundTileGroups;
std::vector<TileGroup>upperForegroundTileGroups;
int bridgeLayerIndex=-1;

@ -81,12 +81,21 @@ void Audio::Initialize(){
if(data.HasProperty("Events")){
for(auto&eventName:Self().events){
auto&eventData=data["Events"][eventName];
if(eventData.GetValueCount()!=bgm.GetChannelCount())ERR(std::format("WARNING! {} parameters do not match channel count. {} != {}",eventName,eventData.GetValueCount(),bgm.GetChannelCount()));
VolumeList volumes;
for(int i=0;i<eventData.GetValueCount();i++){
volumes.push_back(eventData.GetInt(i)/100.f);
if(eventData.GetValueCount()==0){ //We assume we'll inherit from the default volume instead.
VolumeList volumes;
for(int i=0;i<eventData.GetValueCount();i++){
volumes.push_back(data["Events"]["Default Volume"].GetInt(i)/100.f);
}
bgm.AddEventVolumes(eventName,volumes);
}else{
if(eventData.GetValueCount()!=bgm.GetChannelCount())ERR(std::format("WARNING! {} parameters do not match channel count. {} != {}",eventName,eventData.GetValueCount(),bgm.GetChannelCount()));
VolumeList volumes;
for(int i=0;i<eventData.GetValueCount();i++){
volumes.push_back(eventData.GetInt(i)/100.f);
}
bgm.AddEventVolumes(eventName,volumes);
}
bgm.AddEventVolumes(eventName,volumes);
}
}
}else{
@ -135,7 +144,8 @@ const Volume&Audio::BGM::GetVolume(const Event&eventName,const ChannelID&id)cons
void Audio::BGM::Load(){
if(Self().BGMIsPlaying()){
BGM&bgm=Self().bgm[Self().currentBGM];
if(Self().GetTrackName()==songFileName)return; //We are already playing the current track.
BGM&bgm=Self().bgm[Self().GetTrackName()];
if(Self().BGMIsPlaying()){
bgm.Unload();
}

@ -51,7 +51,6 @@ All rights reserved.
#define INCLUDE_ITEM_DATA extern safemap<std::string,ItemInfo>ITEM_DATA;
#define INCLUDE_ITEM_CATEGORIES extern safemap<std::string,std::set<std::string>>ITEM_CATEGORIES;
#define DO_NOTHING [](MenuFuncData data){return true;}
#define INCLUDE_LEVEL_NAMES extern safemap<std::string,MapName>LEVEL_NAMES;
#define INCLUDE_WINDOW_SIZE extern vi2d WINDOW_SIZE;
#define INCLUDE_CENTERED extern const vf2d Menu::CENTERED;

@ -45,7 +45,6 @@ All rights reserved.
#include "Error.h"
INCLUDE_MONSTER_DATA
INCLUDE_LEVEL_NAMES
class EncountersSpawnListScrollableWindowComponent:public ScrollableWindowComponent{
protected:

@ -40,13 +40,12 @@ All rights reserved.
#include "safemap.h"
INCLUDE_game
INCLUDE_LEVEL_NAMES
float TileGroup::FADE_TIME=0.3f;
uint8_t TileGroup::FADE_AMT=160;
Map&MapHelper::MapFromString(std::string mapName){
return game->MAP_DATA.at(LEVEL_NAMES.at(mapName));
return game->MAP_DATA.at(mapName);
}
void TileGroup::InsertTile(TileRenderData tile){

@ -39,10 +39,11 @@ All rights reserved.
#include "olcUTIL_Geometry2D.h"
#include <set>
#include "TMXParser.h"
#include "MapName.h"
struct XMLTag;
using MapName=std::string;
class MapHelper{
public:
static Map&MapFromString(std::string mapName);

@ -1,48 +0,0 @@
#pragma region License
/*
License (OLC-3)
~~~~~~~~~~~~~~~
Copyright 2024 Joshua Sigona <sigonasr2@gmail.com>
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
1. Redistributions or derivations of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions or derivative works in binary form must reproduce the above
copyright notice. This list of conditions and the following disclaimer must be
reproduced in the documentation and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its contributors may
be used to endorse or promote products derived from this software without specific
prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.
Portions of this software are copyright © 2023 The FreeType
Project (www.freetype.org). Please see LICENSE_FT.txt for more information.
All rights reserved.
*/
#pragma endregion
#pragma once
enum MapName{
CAMPAIGN_1_1,
CAMPAIGN_1_2,
CAMPAIGN_1_3,
CAMPAIGN_1_4,
CAMPAIGN_1_5,
BOSS_1,
WORLD_MAP
};

@ -69,7 +69,9 @@ void MonsterData::InitializeMonsterData(){
};
MonsterData::imgs[MonsterName]=NEW Renderable();
MonsterData::imgs[MonsterName]->Load("assets/monsters/"+MonsterName+".png");
const rcode imgLoadResult=MonsterData::imgs[MonsterName]->Load("assets/monsters/"+MonsterName+".png");
if(imgLoadResult!=OK)ERR(std::format("WARNING! Image loading for Monster {} failed with result {}",MonsterName,int(imgLoadResult)));
EventName hurtSound="";
EventName deathSound="";

@ -45,7 +45,6 @@ All rights reserved.
#include "Map.h"
INCLUDE_game
INCLUDE_LEVEL_NAMES
INCLUDE_MONSTER_DATA
using A=Attribute;

@ -45,7 +45,6 @@ All rights reserved.
INCLUDE_MONSTER_LIST
INCLUDE_game
INCLUDE_LEVEL_NAMES
void State_GameRun::OnStateChange(GameState*prevState){
if(Menu::IsMenuOpen()){
@ -71,7 +70,7 @@ void State_GameRun::OnStateChange(GameState*prevState){
}
#pragma endregion
game->LoadLevel(LEVEL_NAMES.at(State_OverworldMap::GetCurrentConnectionPoint().map));
game->LoadLevel(State_OverworldMap::GetCurrentConnectionPoint().map);
}
void State_GameRun::OnUserUpdate(AiL*game){
game->bossDisplayTimer=std::max(0.f,game->bossDisplayTimer-game->GetElapsedTime());

@ -44,6 +44,7 @@ All rights reserved.
INCLUDE_game
void State_MainMenu::OnStateChange(GameState*prevState){
Audio::PlayBGM("title_screen");
TitleScreen::Reset();
game->UpdateDiscordStatus("Main Menu","");
};

@ -59,7 +59,7 @@ State_OverworldMap::State_OverworldMap(){
SetStageMarker("Stage I-I"); //Eventually we will load the game from a file and this will not be necessary. We just set it to this for now.
}
void State_OverworldMap::OnStateChange(GameState*prevState){
game->LoadLevel(WORLD_MAP);
game->LoadLevel("WORLD_MAP");
if(Menu::IsMenuOpen()){
Menu::CloseAllMenus();
}

@ -42,11 +42,9 @@ All rights reserved.
#include <set>
#include "EnvironmentalAudio.h"
#include "DEFINES.h"
#include "MapName.h"
#include "safemap.h"
INCLUDE_LEVEL_NAMES
using MapName=std::string;
using namespace olc;
struct XMLTag{
@ -132,6 +130,7 @@ class TMXParser{
Map GetData();
private:
Map parsedMapInfo;
std::string fileName;
bool buildingSpawner=false;
SpawnerTag obj;
int prevSpawner;
@ -246,7 +245,7 @@ class TMXParser{
return displayStr;
}
const MapName&Map::GetMapName()const{
return LEVEL_NAMES[name];
return name;
}
std::ostream& operator <<(std::ostream& os, std::vector<XMLTag>& rhs) {
for(XMLTag&tag:rhs){
@ -329,8 +328,11 @@ class TMXParser{
if (newTag.tag=="map"){
if(stoi(newTag.data["infinite"])==1){
infiniteMap=true;
ERR(std::format("WARNING! Infinite maps are not supported! Invalid map: {}",fileName));
return;
}
if(newTag.data.find("class")==newTag.data.end())ERR(std::format("WARNING! Map {} does not have a class set!",fileName));
if(newTag.data["class"]!="Map")ERR(std::format("WARNING! Map {} is not set to the map class! Class is set to {} instead.",fileName,newTag.data["class"]));
parsedMapInfo.MapData={stoi(newTag.data["width"]),stoi(newTag.data["height"]),stoi(newTag.data["tilewidth"]),stoi(newTag.data["tileheight"])};
} else
if (newTag.tag=="tileset"){
@ -381,6 +383,7 @@ class TMXParser{
monsterPropertyTagCount=0;
} else
if (newTag.tag=="property"&&monsterPropertyTagCount==0) {
if(newTag.data["value"]=="None")ERR(std::format("WARNING! Invalid monster type provided: {} in map {}",newTag.data["value"],fileName));
monsterTag.data["value"]=newTag.data["value"];
parsedMapInfo.spawns.insert(newTag.GetString("value"));
monsterPropertyTagCount++;
@ -407,9 +410,11 @@ class TMXParser{
zones.emplace_back(geom2d::rect<int>{{newTag.GetInteger("x"),newTag.GetInteger("y")},{newTag.GetInteger("width"),newTag.GetInteger("height")}});
prevZoneData=&zones.back();
} else {
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();
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{
#if _DEBUG
@ -421,6 +426,7 @@ class TMXParser{
#endif
}
TMXParser::TMXParser(std::string file){
fileName=file;
std::ifstream f(file,std::ios::in);
std::string accumulator="";

@ -130,7 +130,7 @@ class TSXParser{
}
}
}
if (newTag.tag=="tileset") {
parsedTilesetInfo.tilewidth=stoi(newTag.data["tilewidth"]);
parsedTilesetInfo.tileheight=stoi(newTag.data["tileheight"]);

@ -54,13 +54,13 @@ void Test::is(std::string conditionStr,bool testResult){
void Test::RunMapTests(){
is("There are two LowerBridgeCollision zones in Campaign I-I",
game->MAP_DATA.at(CAMPAIGN_1_1).ZoneData.count("LowerBridgeCollision")
&&game->MAP_DATA.at(CAMPAIGN_1_1).ZoneData.at("LowerBridgeCollision").size()>=2);
game->MAP_DATA.at("CAMPAIGN_1_1").ZoneData.count("LowerBridgeCollision")
&&game->MAP_DATA.at("CAMPAIGN_1_1").ZoneData.at("LowerBridgeCollision").size()>=2);
for(auto&[key,value]:game->MAP_DATA){
is("A Map type has been selected for map "+std::to_string(key),
is("A Map type has been selected for map "+key,
value.mapType!=""&&value.mapType!="Unspecified");
if(value.mapType=="Dungeon"){
is("There is an EndZone in Dungeon "+std::to_string(key),
is("There is an EndZone in Dungeon "+key,
value.ZoneData.count("EndZone"));
}
}

@ -111,6 +111,7 @@ void TitleScreen::Update(){
state=FINAL;
currentAnimationTime=0.f;
Menu::OpenMenu(MAIN_MENU,false);
Audio::SetAudioEvent("TitleScreenLoaded");
}
}break;
}

@ -39,7 +39,7 @@ All rights reserved.
#define VERSION_MAJOR 0
#define VERSION_MINOR 2
#define VERSION_PATCH 1
#define VERSION_BUILD 5499
#define VERSION_BUILD 5517
#define stringify(a) stringify_(a)
#define stringify_(a) #a

@ -1951,13 +1951,6 @@
<point/>
</object>
<object id="167" name="Player Spawn" type="PlayerSpawnLocation" x="624" y="4272" width="24" height="24"/>
<object id="176" name="Wolf" type="Monster" x="1290" y="4296">
<properties>
<property name="Type" propertytype="MonsterName" value="Wolf"/>
<property name="spawner" type="object" value="2"/>
</properties>
<point/>
</object>
</objectgroup>
<objectgroup id="9" name="Environmental Audio">
<object id="166" name="Waterfall Sound" type="AudioEnvironmentalSound" x="3204" y="4152">

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.10.1" class="Map" orientation="orthogonal" renderorder="right-down" width="174" height="144" tilewidth="24" tileheight="24" infinite="0" nextlayerid="6" nextobjectid="108">
<properties>
<property name="Background Music" propertytype="BGM" value="foresty1_1"/>
<property name="Level Type" propertytype="LevelType" value="Dungeon"/>
</properties>
<tileset firstgid="1" source="../maps/Tilesheet_No_Shadow24x24.tsx"/>
@ -1189,28 +1190,28 @@
</object>
<object id="104" name="Wolf (+)" type="Monster" x="3304" y="2060">
<properties>
<property name="Type" propertytype="MonsterName" value="None"/>
<property name="Type" propertytype="MonsterName" value="Wolf"/>
<property name="spawner" type="object" value="33"/>
</properties>
<point/>
</object>
<object id="105" name="Frog (+)" type="Monster" x="1228" y="1396">
<properties>
<property name="Type" propertytype="MonsterName" value="None"/>
<property name="Type" propertytype="MonsterName" value="Frog"/>
<property name="spawner" type="object" value="30"/>
</properties>
<point/>
</object>
<object id="106" name="Frog (+)" type="Monster" x="1546" y="1398">
<properties>
<property name="Type" propertytype="MonsterName" value="None"/>
<property name="Type" propertytype="MonsterName" value="Frog"/>
<property name="spawner" type="object" value="30"/>
</properties>
<point/>
</object>
<object id="107" name="Frog (+)" type="Monster" x="1400" y="1238">
<properties>
<property name="Type" propertytype="MonsterName" value="None"/>
<property name="Type" propertytype="MonsterName" value="Frog"/>
<property name="spawner" type="object" value="30"/>
</properties>
<point/>

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.10.1" class="Map" orientation="orthogonal" renderorder="right-down" width="240" height="120" tilewidth="24" tileheight="24" infinite="0" nextlayerid="7" nextobjectid="18">
<properties>
<property name="Background Music" propertytype="BGM" value="foresty1_1"/>
<property name="Level Type" propertytype="LevelType" value="Dungeon"/>
</properties>
<tileset firstgid="1" source="../maps/Tilesheet_No_Shadow24x24.tsx"/>

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.10.1" class="Map" orientation="orthogonal" renderorder="right-down" width="200" height="120" tilewidth="24" tileheight="24" infinite="0" nextlayerid="9" nextobjectid="23">
<properties>
<property name="Background Music" propertytype="BGM" value="foresty1_1"/>
<property name="Level Type" propertytype="LevelType" value="Dungeon"/>
</properties>
<tileset firstgid="1" source="../maps/Tilesheet_No_Shadow24x24.tsx"/>

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.10.1" class="Map" orientation="orthogonal" renderorder="right-down" width="200" height="250" tilewidth="24" tileheight="24" infinite="0" nextlayerid="7" nextobjectid="30">
<properties>
<property name="Background Music" propertytype="BGM" value="foresty1_1"/>
<property name="Level Type" propertytype="LevelType" value="Dungeon"/>
</properties>
<tileset firstgid="1" source="../maps/Tilesheet_No_Shadow24x24.tsx"/>

@ -1,5 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.10.1" orientation="orthogonal" renderorder="right-down" width="250" height="175" tilewidth="24" tileheight="24" infinite="0" nextlayerid="6" nextobjectid="31">
<map version="1.10" tiledversion="1.10.1" class="Map" orientation="orthogonal" renderorder="right-down" width="250" height="175" tilewidth="24" tileheight="24" infinite="0" nextlayerid="6" nextobjectid="31">
<properties>
<property name="Background Music" propertytype="BGM" value="foresty1_1"/>
<property name="Level Type" propertytype="LevelType" value="Dungeon"/>
</properties>
<tileset firstgid="1" source="../maps/Decorations_c1_No_Shadow24x24.tsx"/>
<tileset firstgid="1621" source="../maps/Tilesheet_No_Shadow24x24.tsx"/>
<layer id="2" name="Layer 1" width="250" height="175">
@ -543,9 +547,6 @@
<object id="1" name="Spawn 1" type="SpawnGroup" x="722" y="2884" width="358" height="332">
<ellipse/>
</object>
<object id="2" x="1784" y="2896">
<ellipse/>
</object>
<object id="3" name="Spawn 2" type="SpawnGroup" x="721" y="2482" width="358" height="332">
<ellipse/>
</object>

@ -1,5 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.10.1" orientation="orthogonal" renderorder="right-down" width="225" height="150" tilewidth="24" tileheight="24" infinite="0" nextlayerid="7" nextobjectid="24">
<map version="1.10" tiledversion="1.10.1" class="Map" orientation="orthogonal" renderorder="right-down" width="225" height="150" tilewidth="24" tileheight="24" infinite="0" nextlayerid="7" nextobjectid="24">
<properties>
<property name="Background Music" propertytype="BGM" value="foresty1_1"/>
<property name="Level Type" propertytype="LevelType" value="Dungeon"/>
</properties>
<tileset firstgid="1" source="../maps/Decorations_c1_No_Shadow24x24.tsx"/>
<tileset firstgid="1621" source="../maps/Tilesheet_No_Shadow24x24.tsx"/>
<tileset firstgid="4533" source="../maps/24x24_Waterfall.tsx"/>

@ -1,5 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.10.1" orientation="orthogonal" renderorder="right-down" width="250" height="125" tilewidth="24" tileheight="24" infinite="0" nextlayerid="6" nextobjectid="26">
<map version="1.10" tiledversion="1.10.1" class="Map" orientation="orthogonal" renderorder="right-down" width="250" height="125" tilewidth="24" tileheight="24" infinite="0" nextlayerid="6" nextobjectid="26">
<properties>
<property name="Background Music" propertytype="BGM" value="foresty1_1"/>
<property name="Level Type" propertytype="LevelType" value="Dungeon"/>
</properties>
<tileset firstgid="1" source="../maps/Tilesheet_No_Shadow24x24.tsx"/>
<tileset firstgid="2913" source="../maps/Decorations_c1_No_Shadow24x24.tsx"/>
<layer id="2" name="Layer 1" width="250" height="125">

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.10.1" class="Map" orientation="orthogonal" renderorder="right-down" width="64" height="80" tilewidth="24" tileheight="24" infinite="0" nextlayerid="5" nextobjectid="6">
<properties>
<property name="Background Music" propertytype="BGM" value="foresty_boss"/>
<property name="Level Type" propertytype="LevelType" value="Boss"/>
</properties>
<tileset firstgid="1" source="../maps/Tilesheet_No_Shadow24x24.tsx"/>

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.10.1" class="Map" orientation="orthogonal" renderorder="left-down" width="250" height="177" tilewidth="4" tileheight="4" infinite="0" nextlayerid="5" nextobjectid="17">
<properties>
<property name="Background Music" propertytype="BGM" value="overworld"/>
<property name="Level Type" propertytype="LevelType" value="World Map"/>
<property name="Optimize" type="bool" value="true"/>
</properties>

@ -239,6 +239,40 @@ Monsters
Death Sound = Slime Dead
Walk Sound = Slime Walk
#Additional custom animations go down below. Start with ANIMATION[0]. Order is:
# Frame Count, Frame Speed (s), Frame Cycling (Repeat,OneShot,PingPong,Reverse)
#ANIMATION[0] = 6, 0.1, Repeat
}
Frog
{
Health = 110
Attack = 12
CollisionDmg = 12
MoveSpd = 120%
Size = 90%
XP = 14
Strategy = Run Towards
#Size of each animation frame
SheetFrameSize = 24,24
# Frame Count, Frame Speed (s), Frame Cycling (Repeat,OneShot,PingPong,Reverse)
IdleAnimation = 3, 0.2, PingPong
JumpAnimation = 4, 0.06, PingPong
ShootAnimation = 10, 0.1, OneShot
DeathAnimation = 4, 0.1, OneShot
# Drop Item Name, Drop Percentage(0-100%), Drop Min Quantity, Drop Max Quantity
DROP[0] = Wolf Skin,35%,1,2
Hurt Sound = Monster Hurt
Death Sound = Slime Dead
Walk Sound = Slime Walk
#Additional custom animations go down below. Start with ANIMATION[0]. Order is:
# Frame Count, Frame Speed (s), Frame Cycling (Repeat,OneShot,PingPong,Reverse)
#ANIMATION[0] = 6, 0.1, Repeat

@ -29,4 +29,64 @@ BGM
Underwater = 10%,10%,10%,60%,80%,80%,10%,10%,70%,10%
}
}
#Song title followed by filenames for individual parts
overworld
{
Track Name = Overworld
channel[0]=overworld.ogg
# Transition time between one phase to the next.
Fade Time = 2.0
Events
{
Default Volume = 70%
LowHealth = 100%
InCombat = 100%
Underwater = 100%
}
}
#Song title followed by filenames for individual parts
foresty_boss
{
Track Name = Foresty Boss
channel[0]=foresty_boss.ogg
# Transition time between one phase to the next.
Fade Time = 2.0
Events
{
Default Volume = 70%
LowHealth = 100%
InCombat = 100%
Underwater = 100%
}
}
#Song title followed by filenames for individual parts
title_screen
{
Track Name = Foresty Loop 2
channel[0]=loop2/foresty1_1_loop2_bass.ogg
channel[1]=loop2/foresty1_1_loop2_drums.ogg
channel[2]=loop2/foresty1_1_loop2_piano 1.ogg
channel[3]=loop2/foresty1_1_loop2_piano 2.ogg
channel[4]=loop2/foresty1_1_loop2_staccato.ogg
channel[5]=loop2/foresty1_1_loop2_strings.ogg
# Transition time between one phase to the next.
Fade Time = 2.0
Events
{
Default Volume = 0%,0%,0%,0%,0%,70%
TitleScreenLoaded = 70%,0%,0%,0%,70%,70%
}
}
}

@ -3,6 +3,7 @@ Events
LowHealth = "Occurs when the player is low in health."
InCombat = "Occurs when the player is in combat."
Underwater = "Occurs when the player is in water."
TitleScreenLoaded = "Occurs when the title screen intro is done"
SFX
{

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Loading…
Cancel
Save