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.
This commit is contained in:
parent
bcc71601b6
commit
57f482016f
@ -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
|
||||
{
|
||||
|
BIN
Adventures in Lestoria/assets/monsters/Frog.png
Normal file
BIN
Adventures in Lestoria/assets/monsters/Frog.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 5.8 KiB |
BIN
Adventures in Lestoria/assets/music/foresty_boss.ogg
Normal file
BIN
Adventures in Lestoria/assets/music/foresty_boss.ogg
Normal file
Binary file not shown.
BIN
Adventures in Lestoria/assets/music/overworld.ogg
Normal file
BIN
Adventures in Lestoria/assets/music/overworld.ogg
Normal file
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user