commit 17799309a9edd43331579f218fcbc6d904df29b6 Author: kin fuyuki Date: Sat Dec 20 20:06:58 2025 -0300 rewriting and organizing the code diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..16b3e79 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "lib/raylib"] + path = lib/raylib + url = https://github.com/raysan5/raylib.git +[submodule "lib/tiny"] + path = lib/tiny + url = https://github.com/kin-fuyuki/tiny-cpp.git diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..97c924c --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 3.20) + +if(WIN32) + set(PLATFORM_DIR "windows") +else() + set(PLATFORM_DIR "linux") +endif() + +add_subdirectory(lib/raylib) +add_subdirectory(engine) +add_subdirectory(games/forespend) +include(ExternalProject) + +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/build/objs/${PLATFORM_DIR}) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/out/${PLATFORM_DIR}) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/built/runtime/${PLATFORM_DIR}) \ No newline at end of file diff --git a/engine/CMakeLists.txt b/engine/CMakeLists.txt new file mode 100644 index 0000000..f69dace --- /dev/null +++ b/engine/CMakeLists.txt @@ -0,0 +1,25 @@ +cmake_minimum_required(VERSION 3.20) +file(GLOB_RECURSE ENGINE_SOURCES "src/*.cpp") +add_library(engine STATIC ${ENGINE_SOURCES}) +target_include_directories(engine PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/raylib/include + +) + +set(ENGINE_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src") +set(ENGINE_EXPORT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include") +file(GLOB_RECURSE HEADER_FILES "${ENGINE_SRC_DIR}/*.h" "${ENGINE_SRC_DIR}/*.hpp") +foreach(HEADER ${HEADER_FILES}) + file(RELATIVE_PATH REL_PATH "${ENGINE_SRC_DIR}" "${HEADER}") + + set(DEST "${ENGINE_EXPORT_DIR}/${REL_PATH}") + + get_filename_component(DEST_DIR "${DEST}" DIRECTORY) + + add_custom_command( + TARGET engine PRE_BUILD + COMMAND ${CMAKE_COMMAND} -E make_directory "${DEST_DIR}" + COMMAND ${CMAKE_COMMAND} -E copy_if_different "${HEADER}" "${DEST}" + ) +endforeach() \ No newline at end of file diff --git a/engine/src/engine.cpp b/engine/src/engine.cpp new file mode 100644 index 0000000..e69de29 diff --git a/games/forespend/CMakeLists.txt b/games/forespend/CMakeLists.txt new file mode 100644 index 0000000..9bac99b --- /dev/null +++ b/games/forespend/CMakeLists.txt @@ -0,0 +1,14 @@ +cmake_minimum_required(VERSION 3.20) + +file(GLOB_RECURSE FORESPEND_SOURCES "src/*.cpp") +add_executable(forespend ${FORESPEND_SOURCES}) + +set_target_properties(forespend PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/built/forespend/${PLATFORM_DIR}" +) +target_link_libraries(forespend PRIVATE engine raylib) +target_include_directories(engine PUBLIC + ${CMAKE_SOURCE_DIR}/include + ${CMAKE_SOURCE_DIR}/raylib/include + ${CMAKE_SOURCE_DIR}/engine/include +) \ No newline at end of file diff --git a/games/forespend/src/common/program.cpp b/games/forespend/src/common/program.cpp new file mode 100644 index 0000000..80690ef --- /dev/null +++ b/games/forespend/src/common/program.cpp @@ -0,0 +1 @@ +#include "program.h" diff --git a/games/forespend/src/common/program.h b/games/forespend/src/common/program.h new file mode 100644 index 0000000..4582f47 --- /dev/null +++ b/games/forespend/src/common/program.h @@ -0,0 +1,12 @@ +#pragma once + +class program { +public: + virtual static const char* CONF; + static const char* COMMONCONFIG="common.tdf"; + const bool client; + virtual void boot(); + virtual void tick(); + virtual void draw(); + virtual void exit(); +}; \ No newline at end of file diff --git a/games/forespend/src/server/server.cpp b/games/forespend/src/server/server.cpp new file mode 100644 index 0000000..e9ea187 --- /dev/null +++ b/games/forespend/src/server/server.cpp @@ -0,0 +1 @@ +#include "server.h" \ No newline at end of file diff --git a/games/forespend/src/server/server.h b/games/forespend/src/server/server.h new file mode 100644 index 0000000..bdbb5dd --- /dev/null +++ b/games/forespend/src/server/server.h @@ -0,0 +1,8 @@ +#pragma once + + +class server : public program{ +public: + static const char* CONF="server.tdf"; + +}; \ No newline at end of file diff --git a/include/incmgr.h b/include/incmgr.h new file mode 100644 index 0000000..330bf61 --- /dev/null +++ b/include/incmgr.h @@ -0,0 +1,5 @@ +#include +#include +#include +#include +#include diff --git a/include/tiny/tdf.h b/include/tiny/tdf.h new file mode 100644 index 0000000..f6ad408 --- /dev/null +++ b/include/tiny/tdf.h @@ -0,0 +1,412 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef TINYDATAFORMAT_H +#define TINYDATAFORMAT_H +#define TINYDEFINEHEADER "0000_TDF_HEADER_DEFINE" +#include "term.h" + +#define GENSTART {int LAST = trimmed.find(' ', 3);if (LAST == std::string::npos) goto FAILTOPARSE;std::string KEY = trimmed.substr(2, LAST - 2); +#define GENEND (VALUE)};todelete.push_back(DAT.datapointer); (*current)[KEY]=DAT;break;} +#define GENMID ); if (idx != sub.size()) goto FAILTOPARSE;}catch(const std::invalid_argument&){goto FAILTOPARSE;}TDF_DATA DAT={ + +#define INTGENSTART GENSTART std::string sub = trimmed.substr(LAST + 1);size_t idx; int VALUE; try{ VALUE=stoi(sub, &idx, +#define INTGENEND , new int GENEND + +#define SETSTART value){boost::unordered_map*current=data;for(size_t i=0;ifind(path[i]);if(it==current->end()){if(i==path.size()-1){TDF_DATA DAT={ +#define SETMID (value)};todelete.push_back(DAT.datapointer);(*current)[path[i]]=DAT;return;}else{\ + boost::unordered_map*newmap=new boost::unordered_map();TDF_DATA DAT={TDF_CLASS,newmap}\ + ;todelete.push_back(DAT.datapointer);(*current)[path[i]]=DAT;current=newmap;}}else{if(i==path.size()-1){if(it->second.type!= +#define SETEND *>(it->second.datapointer)=value;return;}if(it->second.type!=TDF_CLASS)throw TDF_ERR(SET_MISMATCH,filepath,path);\ + current=(boost::unordered_map*)(it->second.datapointer);}}} + + +#define GETSTART (std::vectorpath){boost::unordered_map*current=data;for(size_t i=0;ifind(path[i]);if(it==current->end())throw TDF_ERR(PATH_NOT_FOUND,filepath,path);if(i==path.size()-1){if(it->second.type!= +#define GETMID )throw TDF_ERR(GET_MISMATCH,filepath,path);return *static_cast< +#define GETEND *>(it->second.datapointer);}\ + if(it->second.type!=TDF_CLASS)throw TDF_ERR(GET_MISMATCH,filepath,path);current=(boost::unordered_map*)(it->second.datapointer);}\ + throw TDF_ERR(PATH_NOT_FOUND,filepath,path);} + +#define DEFAULTGET(TYPE_NAME, ACTUAL_TYPE) ACTUAL_TYPE TYPE_NAME(std::vector path, ACTUAL_TYPE defaultval) {try { return\ + TYPE_NAME(path); } catch (TDF_ERR &e) { warning((char*)e.what()); return defaultval; } } + +namespace tiny { +enum TDF_ERROR{ + SET_MISMATCH=1, + GET_MISMATCH=2, + PATH_NOT_FOUND=3, + UNKNOWN_ERROR=-1, + FILE_NOT_FOUND=4, + FAILED_TO_PARSE=5, + NULL_POINTER=6, +}; +class TDF_ERR : public std::exception + { + public: + std::string message; + + explicit TDF_ERR(TDF_ERROR err,std::string file,std::vectorpath) _GLIBCXX_TXN_SAFE{ + message="TDF ERROR: "; + + switch(err){ + case SET_MISMATCH: + message+="SET TYPE MISMATCH "; + break; + case GET_MISMATCH: + message+="GET TYPE MISMATCH "; + break; + case PATH_NOT_FOUND: + message+="PATH NOT FOUND "; + break; + case FILE_NOT_FOUND: + message+="FILE NOT FOUND "+file; + return; + case FAILED_TO_PARSE: + message+="FAILED TO PARSE "+file+" AT LINE :"+path[0]; + return; + case NULL_POINTER: + message+="NULL POINTER of selector "+path[0]; + message+="FAILED TO PARSE "+file+" AT LINE :"+path[1]; + return; + default: + message+="UNKNOWN ERROR "; + break; + } + + message+=" ON FILE: "+file+" AT PATH: "; + for(size_t i=0;i + TDF_CLASS = 9, //class +}; +struct TDF_DATA { + TDF_Type type; + void* datapointer; +}; +struct TDF_FUNCS{ + boost::unordered_mapfuncs; + TDF_DATA(*FUNCS[])(std::string); +}; +struct TDF_FILE{ + boost::unordered_map* data=nullptr; + char*filepath; + TDF_FUNCS FUNCS; + std::vector todelete; + void close(){ + for(size_t i=0;i(); + todelete.push_back(data); + boost::unordered_map*current=data; + + std::vector*>stack={}; + std::vectorpathvec={}; + bool textblock=false; + std::string BLOCK; + std::string BLOCKKEY; + std::vector *defines=new std::vector(); + TDF_DATA defdat={TDF_DEFINES,defines}; + (*current)[TINYDEFINEHEADER]=defdat; + + std::string line; + while (std::getline(file, line)) { + ++INDEX; + if (line.length()==0){continue;} + if (textblock){ + std::string blockline = line; + size_t lead = blockline.find_first_not_of(' '); + if(lead != std::string::npos){ + blockline = blockline.substr(lead); + } + if (blockline=="\\"){ + textblock=false; + TDF_DATA DAT={TDF_BLOCK,new std::string(BLOCK)}; + todelete.push_back(DAT.datapointer); + (*current)[BLOCKKEY]=DAT; + }else{ + BLOCK+=line+"\n"; + } + } + else{ + std::string trimmed = line; + size_t lead = trimmed.find_first_not_of(' '); + if(lead != std::string::npos){ + trimmed = trimmed.substr(lead); + }else{ + continue; + } + if (trimmed.empty() || trimmed[0]=='#'){continue;} + if (trimmed.size() > 1 && trimmed[1]==' '){ + CCHAR=trimmed[0]; + switch (CCHAR) { + + case '"':GENSTART std::string VALUE; VALUE=trimmed.substr(LAST + 1); TDF_DATA DAT = { TDF_STR, new std::string GENEND + + + case 'S':{ + int LAST = trimmed.find(' ', 2); + std::string KEY; + if (LAST != std::string::npos){ + KEY = trimmed.substr(2, LAST - 2); + }else{ + KEY = trimmed.substr(2); + } + BLOCKKEY=KEY; + BLOCK=""; + textblock=true; + break;} + + + case '\'':GENSTART if (LAST + 1 >= trimmed.size()) goto FAILTOPARSE;char VALUE=trimmed.at(LAST + 1); + if (LAST + 2 < trimmed.size()) goto FAILTOPARSE;TDF_DATA DAT = { TDF_CHAR, new char GENEND + + + case 'i': INTGENSTART 0 GENMID TDF_INT INTGENEND + + + case 'h':INTGENSTART 16 GENMID TDF_HEX INTGENEND + + + case 'b':INTGENSTART 2 GENMID TDF_BINARY INTGENEND + + + case 'B': GENSTART if (LAST + 1 >= trimmed.size()) goto FAILTOPARSE; char c=trimmed.at(LAST + 1); + bool VALUE = c=='T'; if (LAST + 2 < trimmed.size()) goto FAILTOPARSE; TDF_DATA DAT={TDF_BOOL,new bool GENEND + + + case 'f':GENSTART std::string sub = trimmed.substr(LAST + 1);size_t idx;float VALUE; try{VALUE=stof(sub, &idx); + if (idx != sub.size()) goto FAILTOPARSE;}catch(std::invalid_argument&){goto FAILTOPARSE;}TDF_DATA DAT={TDF_FLOAT,new float GENEND + + + case '@':GENSTART + std::string VALUE=trimmed.substr(LAST + 1); + std::vector*ptr=new std::vector(); + size_t pos=0; + std::string token; + while((pos=VALUE.find('.'))!=std::string::npos){ + token=VALUE.substr(0,pos); + ptr->push_back(token); + VALUE.erase(0,pos+1); + } + ptr->push_back(VALUE); + TDF_DATA DAT={TDF_POINTER,ptr}; + todelete.push_back(DAT.datapointer); + (*current)[KEY]=DAT; + break;} + + + case '{':{ + int LAST = trimmed.find(' ', 3); + std::string KEY; + if (LAST != std::string::npos){ + KEY = trimmed.substr(2, LAST - 2); + }else{ + KEY = trimmed.substr(2); + } + boost::unordered_map*newmap=new boost::unordered_map(); + TDF_DATA DAT={TDF_CLASS,newmap}; + todelete.push_back(DAT.datapointer); + (*current)[KEY]=DAT; + std::vector *defines=new std::vector(); + TDF_DATA defdat={TDF_DEFINES,defines}; + (*newmap)[TINYDEFINEHEADER]=defdat; + stack.push_back(current); + pathvec.push_back(KEY); + current=newmap; + break;} + + + default:{ + try { + int PATH=FUNCS.funcs.at(trimmed[0]); + int LAST = trimmed.find(' ', 3); + if (LAST == std::string::npos)goto FAILTOPARSE; + std::string KEY = trimmed.substr(2, LAST - 2); + (*current)[KEY]=FUNCS.FUNCS[PATH](trimmed); + todelete.push_back((*current)[KEY].datapointer); + if ((*current)[KEY].datapointer==nullptr) goto FAILTOPARSE; + }catch(const std::out_of_range&){ + break; + } + break;} + } + }else if(trimmed == "}"){ + if(stack.empty())goto FAILTOPARSE; + current=stack.back(); + stack.pop_back(); + if(!pathvec.empty())pathvec.pop_back(); + }else{ + auto it = current->find(TINYDEFINEHEADER); + if (it == current->end() || it->second.type != TDF_DEFINES) goto FAILTOPARSE; + std::vector* defines = static_cast*>(it->second.datapointer); + defines->push_back(line); + } + } + } + return data; + }else{ + throw TDF_ERR(FILE_NOT_FOUND,filepath,{}); + } + NULLPOINTER: + throw TDF_ERR(NULL_POINTER,filepath,{std::string(1,CCHAR),std::to_string(INDEX)}); + FAILTOPARSE: + throw TDF_ERR(FAILED_TO_PARSE,filepath,{std::to_string(INDEX)}); + delete data; + data=nullptr; + return nullptr; + } + //get + + #define ITSNOT it->second.type!= + float getfloat GETSTART ITSNOT TDF_FLOAT GETMID float GETEND DEFAULTGET(getfloat, float) + + bool getbool GETSTART ITSNOT TDF_BOOL GETMID bool GETEND DEFAULTGET(getbool, bool) + + int getint GETSTART (ITSNOT TDF_INT)&&(ITSNOT TDF_HEX)&&(ITSNOT TDF_BINARY) GETMID int GETEND DEFAULTGET(getint, int) + + std::string getstring GETSTART (ITSNOT TDF_STR)&&(ITSNOT TDF_BLOCK) GETMID std::string GETEND DEFAULTGET(getstring, std::string) + + std::vector getpointer GETSTART ITSNOT TDF_POINTER GETMID std::vector GETEND DEFAULTGET(getpointer, std::vector) + + char getchar GETSTART ITSNOT TDF_CHAR GETMID char GETEND DEFAULTGET(getchar, char) + + bool defined(std::vectorpath){ + boost::unordered_map*current=data; + for(size_t i=0;ifind(path[i]); + if(it==current->end())return false; + if(i==path.size()-1)return true; + if(it->second.type!=TDF_CLASS)return false; + current=(boost::unordered_map*)it->second.datapointer;} + return false;} + DEFAULTGET(defined, bool) + + boost::unordered_map* getclass(std::vectorpath){ + boost::unordered_map*current=data; + for(size_t i=0;ifind(path[i]); + if(it==current->end())throw TDF_ERR(PATH_NOT_FOUND,filepath,path); + if(i==path.size()-1){ + if(ITSNOT TDF_CLASS)throw TDF_ERR(GET_MISMATCH,filepath,path); + return (boost::unordered_map*)(it->second.datapointer); + } + if(ITSNOT TDF_CLASS)throw TDF_ERR(GET_MISMATCH,filepath,path); + current=(boost::unordered_map*)(it->second.datapointer); + } + throw TDF_ERR(PATH_NOT_FOUND,filepath,path); + } + boost::unordered_map* getclass(std::vectorpath,boost::unordered_map* defaultval){ + try { + return getclass(path);} + catch(TDF_ERR e) { + warning((char*)e.what()); + return defaultval; + } + } +//set + + void setbool(std::vectorpath, bool SETSTART TDF_BOOL, new bool SETMID TDF_BOOL) throw TDF_ERR(SET_MISMATCH, filepath, path); *static_castpath, int SETSTART TDF_INT, new int SETMID TDF_INT) throw TDF_ERR(SET_MISMATCH, filepath, path); *static_castpath, std::string SETSTART TDF_STR, new std::string SETMID TDF_STR) throw TDF_ERR(SET_MISMATCH, filepath, path); *static_castpath, std::string SETSTART TDF_BLOCK, new std::string SETMID TDF_BLOCK) throw TDF_ERR(SET_MISMATCH, filepath, path); *static_castpath, float SETSTART TDF_FLOAT, new float SETMID TDF_FLOAT) throw TDF_ERR(SET_MISMATCH, filepath, path); *static_castpath, char SETSTART TDF_CHAR, new char SETMID TDF_CHAR) throw TDF_ERR(SET_MISMATCH, filepath, path); *static_castpath, std::vector SETSTART TDF_POINTER, new std::vector SETMID TDF_POINTER) throw TDF_ERR(SET_MISMATCH, filepath, path); *static_cast SETEND + + void define(std::vectordefines,char* name){ + auto it = data->find(TINYDEFINEHEADER); + if (it == data->end() || it->second.type != TDF_DEFINES) { + std::vector* newdefines = new std::vector(); + TDF_DATA defdat = { TDF_DEFINES, newdefines }; + (*data)[TINYDEFINEHEADER] = defdat; + todelete.push_back(defdat.datapointer); + it = data->find(TINYDEFINEHEADER); + } + std::vector* currentdefines = static_cast*>(it->second.datapointer); + for (size_t i = 0; i < defines.size(); i++) { + currentdefines->push_back(defines[i]); + } + currentdefines->push_back(std::string("#define ") + name); + } + + void save(){ + std::ofstream file(filepath, std::ios::out | std::ios::trunc); + std::string DATA=""; + crawl(data,&DATA,""); + file<*map,std::string*STR,std::string indent){ + auto it = map->find(TINYDEFINEHEADER); + if (it != map->end() && it->second.type == TDF_DEFINES) { + std::vector* defines = static_cast*>(it->second.datapointer); + for (auto& def : *defines) { + *STR += def + "\n"; + } + } + for(auto&[key,val]:*map){ + if(key==TINYDEFINEHEADER)continue; + switch(val.type){ + case TDF_STR:*STR+="\" "+key+" "+*static_cast(val.datapointer)+"\n";break; + case TDF_CHAR:*STR+="' "+key+" "+*static_cast(val.datapointer)+"\n";break; + case TDF_BLOCK:*STR+="S "+key+"\n"+*static_cast(val.datapointer)+"\n\\\n";break; + case TDF_BOOL:*STR+="B "+key+" "+(*static_cast(val.datapointer)?"T":"F")+"\n";break; + case TDF_BINARY:*STR+="b "+key+" "+std::to_string(*static_cast(val.datapointer))+"\n";break; + case TDF_INT:*STR+="i "+key+" "+std::to_string(*static_cast(val.datapointer))+"\n";break; + case TDF_FLOAT:*STR+="f "+key+" "+std::to_string(*static_cast(val.datapointer))+"\n";break; + case TDF_HEX:*STR+="h "+key+" "+std::to_string(*static_cast(val.datapointer))+"\n";break; + + case TDF_POINTER:{std::vector*ptr=static_cast*>(val.datapointer); + *STR+="@ "+key+" ";for(size_t i=0;isize();i++){*STR+=(*ptr)[i];if(isize()-1)*STR+=".";}*STR+="\n";break;} + + case TDF_CLASS:*STR+="{ "+key+"\n";crawl((boost::unordered_map*)(val.datapointer),STR,"");*STR+="}\n";break; + } + } + } +}; + +} +#endif \ No newline at end of file diff --git a/include/tiny/term.h b/include/tiny/term.h new file mode 100644 index 0000000..95405b9 --- /dev/null +++ b/include/tiny/term.h @@ -0,0 +1,124 @@ +#pragma once +#ifndef TINYTERM_H +#define TINYTERM_H + + +#include +#include +#include +#include + +namespace tiny { + + + +struct ErrorLevel { + int value; + ErrorLevel(int var){ + + this->value=var; + } + void setvalue(int var){ + this->value=var; + } +}; + +/* +-1: none +0: error +1: success +2: warning +3: message +4: echo + +ex (i recommend using on main.cpp): +tiny::ErrorLevel tiny::level={1}; +*/ + +extern tiny::ErrorLevel level; + +#define WHITE "\033[0m" /* White */ +#define BLACK "\033[30m" /* Black */ +#define RED "\033[31m" /* Red */ +#define GREEN "\033[32m" /* Green */ +#define YELLOW "\033[33m" /* Yellow */ +#define BLUE "\033[34m" /* Blue */ +#define MAGENTA "\033[35m" /* Magenta */ +#define CYAN "\033[36m" /* Cyan */ +#define WHITE "\033[37m" /* White */ +#define BGRED "\033[41m" /* Red */ +#define BOLDBLACK "\033[1m\033[30m" /* Bold Black */ +#define BOLDRED "\033[1m\033[31m" /* Bold Red */ +#define BOLDGREEN "\033[1m\033[32m" /* Bold Green */ +#define BOLDYELLOW "\033[1m\033[33m" /* Bold Yellow */ +#define BOLDBLUE "\033[1m\033[34m" /* Bold Blue */ +#define BOLDMAGENTA "\033[1m\033[35m" /* Bold Magenta */ +#define BOLDCYAN "\033[1m\033[36m" /* Bold Cyan */ +#define BOLDWHITE "\033[1m\033[37m" /* Bold White */ +#define ending \ + mixer.append(info); mixer.append("\033[0m\n");\ + const char * finalinfo=mixer.c_str();\ + va_start (arg, finalinfo);\ + vfprintf (stdout, finalinfo, arg);\ + va_end (arg); + +inline void echo(char * info,...){ + if (level.value==4) + { + va_list arg; + std::string mixer=info; + mixer.append("\n"); + const char * finalinfo=mixer.c_str(); + va_start (arg, finalinfo); + vfprintf (stdout, finalinfo, arg); + va_end (arg);} +} +inline void warning( char * info,...){ + if (level.value>=1) + { + va_list arg; + std::string mixer=YELLOW;ending +} +} +inline void fatal( char * info,...){ + va_list arg; + std::string mixer=BOLDWHITE+std::string(BGRED);ending +} +inline void error( char * info,...){ + if (level.value>=0) + { + va_list arg; + std::string mixer=BOLDRED;ending +}} +inline void success(char * info , ...){ + if (level.value>=2) + { + va_list arg; + std::string mixer=GREEN;ending} +} +inline void message(char * info , ...){ + if (level.value>=3) + { + va_list arg; + std::string mixer=BOLDWHITE;ending} +} +inline void startup(char* game,char*version){ +int lv=level.value;level.value=6; + echo("%s %s",game,version); + warning("be warned that"); + error("ERRORS MIGHT OCCUR!!!"); + success("but dont worry"); + message("this is not an error"); + fatal("I SWEAR"); +level.value=lv; +} + + + + +} + +#endif + + + diff --git a/lib/raylib b/lib/raylib new file mode 160000 index 0000000..13f9112 --- /dev/null +++ b/lib/raylib @@ -0,0 +1 @@ +Subproject commit 13f9112d8c069ed333acf72c2c1b94a0533c6dc1 diff --git a/lib/tiny b/lib/tiny new file mode 160000 index 0000000..e4887c7 --- /dev/null +++ b/lib/tiny @@ -0,0 +1 @@ +Subproject commit e4887c7fa646bd318c87c3d18626ff8333da96df