mirror of
https://github.com/TerryCavanagh/VVVVVV.git
synced 2024-06-26 22:48:30 +02:00
Compare commits
15 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
64c554261e | ||
|
53d725f78a | ||
|
c20db02f15 | ||
|
dd15d67e62 | ||
|
a9d43b543f | ||
|
16d75d2da8 | ||
|
ff6bb68f3a | ||
|
4b2b4fb7c9 | ||
|
d678bd59ff | ||
|
ff785aaa8a | ||
|
3361e71036 | ||
|
4bba26280f | ||
|
217996b134 | ||
|
8640ead937 | ||
|
a9d438968d |
|
@ -22,3 +22,4 @@ Last updated on January 23rd, 2024.
|
||||||
| XBox One/UWP Port | [tunip3](https://github.com/tunip3) | Port for XBOX ONE (DURANGO) via UWP. | Permission is given to distribute a pre-compiled package (containing the data.zip assets) for people to run on development mode xboxes, for non commercial use only. | [github repo](https://github.com/tunip3/DURANGO-V6)|
|
| XBox One/UWP Port | [tunip3](https://github.com/tunip3) | Port for XBOX ONE (DURANGO) via UWP. | Permission is given to distribute a pre-compiled package (containing the data.zip assets) for people to run on development mode xboxes, for non commercial use only. | [github repo](https://github.com/tunip3/DURANGO-V6)|
|
||||||
| armhf Port | [johnnyonFlame](https://github.com/johnnyonFlame/) | Armhf port for Raspberry PI and other SBC devices| Permission is for non commercial use only. Display the following text in the readme to make it clear that this is an exception: "VVVVVV is a commercial game! The author has given special permission to make this port available for free. If you enjoy the game, please consider purchasing a copy at [thelettervsixtim.es](http://thelettervsixtim.es)."| [github release](https://github.com/JohnnyonFlame/VVVVVV/releases/tag/v2.4-r1) |
|
| armhf Port | [johnnyonFlame](https://github.com/johnnyonFlame/) | Armhf port for Raspberry PI and other SBC devices| Permission is for non commercial use only. Display the following text in the readme to make it clear that this is an exception: "VVVVVV is a commercial game! The author has given special permission to make this port available for free. If you enjoy the game, please consider purchasing a copy at [thelettervsixtim.es](http://thelettervsixtim.es)."| [github release](https://github.com/JohnnyonFlame/VVVVVV/releases/tag/v2.4-r1) |
|
||||||
| Wii Port | [Alberto Mardegan](https://github.com/mardy/) | Port for the Nintendo Wii. | Permission is given to distribute a ready-to-use build for the Nintendo Wii containing the data.zip assets for non commercial use only. | [github repo](https://github.com/mardy/VVVVVV/tree/wii) |
|
| Wii Port | [Alberto Mardegan](https://github.com/mardy/) | Port for the Nintendo Wii. | Permission is given to distribute a ready-to-use build for the Nintendo Wii containing the data.zip assets for non commercial use only. | [github repo](https://github.com/mardy/VVVVVV/tree/wii) |
|
||||||
|
| Recalbox Port | [digitalLumberjack](https://gitlab.com/recalbox/recalbox) | Port for Recalbox project. | Display the following text in the readme to make it clear that this is an exception: "VVVVVV is a commercial game! The author has given special permission to make this port available for free. If you enjoy the game, please consider purchasing a copy at [thelettervsixtim.es](http://thelettervsixtim.es)." | [website](https://recalbox.com/) |
|
||||||
|
|
|
@ -294,6 +294,11 @@ if(MSVC)
|
||||||
# Disable RTTI
|
# Disable RTTI
|
||||||
string(REPLACE "/GR" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
|
string(REPLACE "/GR" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /GR-")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /GR-")
|
||||||
|
|
||||||
|
if(MSVC_VERSION GREATER 1900)
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /utf-8")
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /utf-8")
|
||||||
|
endif()
|
||||||
else()
|
else()
|
||||||
string(REGEX REPLACE "-std=[a-z0-9]+" "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
|
string(REGEX REPLACE "-std=[a-z0-9]+" "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99")
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99")
|
||||||
|
|
|
@ -20,7 +20,7 @@ Contributors
|
||||||
* Jules de Sartiges (@strikersh)
|
* Jules de Sartiges (@strikersh)
|
||||||
* Keith Stellyes (@keithstellyes)
|
* Keith Stellyes (@keithstellyes)
|
||||||
* KyoZM (@lsaa)
|
* KyoZM (@lsaa)
|
||||||
* leo60228 (@leo60228)
|
* leo vriska (@leo60228)
|
||||||
* MAO3J1m0Op (@MAO3J1m0Op)
|
* MAO3J1m0Op (@MAO3J1m0Op)
|
||||||
* Malte Grimm (@trelbutate)
|
* Malte Grimm (@trelbutate)
|
||||||
* Marvin Scholz (@ePirat)
|
* Marvin Scholz (@ePirat)
|
||||||
|
|
|
@ -173,7 +173,7 @@ static const char* githubfriends[] = {
|
||||||
"Jules de Sartiges",
|
"Jules de Sartiges",
|
||||||
"Keith Stellyes",
|
"Keith Stellyes",
|
||||||
"KyoZM",
|
"KyoZM",
|
||||||
"leo60228",
|
"leo vriska",
|
||||||
"MAO3J1m0Op",
|
"MAO3J1m0Op",
|
||||||
"Malte Grimm",
|
"Malte Grimm",
|
||||||
"Marvin Scholz",
|
"Marvin Scholz",
|
||||||
|
|
|
@ -251,6 +251,23 @@ static void levelMetaDataCallback(const char* filename)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void unloadZips(void)
|
||||||
|
{
|
||||||
|
char** list = PHYSFS_getSearchPath();
|
||||||
|
if (list == NULL)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (char** path = list; *path != NULL; path++)
|
||||||
|
{
|
||||||
|
if (SDL_strncmp(*path, "levels/", 7) == 0 && endsWith(*path, ".zip"))
|
||||||
|
{
|
||||||
|
PHYSFS_unmount(*path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
PHYSFS_freeList(list);
|
||||||
|
}
|
||||||
|
|
||||||
void customlevelclass::getDirectoryData(void)
|
void customlevelclass::getDirectoryData(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -258,6 +275,8 @@ void customlevelclass::getDirectoryData(void)
|
||||||
|
|
||||||
FILESYSTEM_clearLevelDirError();
|
FILESYSTEM_clearLevelDirError();
|
||||||
|
|
||||||
|
unloadZips();
|
||||||
|
|
||||||
loadZips();
|
loadZips();
|
||||||
|
|
||||||
FILESYSTEM_enumerateLevelDirFileNames(levelMetaDataCallback);
|
FILESYSTEM_enumerateLevelDirFileNames(levelMetaDataCallback);
|
||||||
|
|
|
@ -2105,6 +2105,7 @@ static void input_submitted(void)
|
||||||
|
|
||||||
ed.levx = SDL_clamp(help.Int(coord_x) - 1, 0, cl.mapwidth - 1);
|
ed.levx = SDL_clamp(help.Int(coord_x) - 1, 0, cl.mapwidth - 1);
|
||||||
ed.levy = SDL_clamp(help.Int(coord_y) - 1, 0, cl.mapheight - 1);
|
ed.levy = SDL_clamp(help.Int(coord_y) - 1, 0, cl.mapheight - 1);
|
||||||
|
graphics.foregrounddrawn = false;
|
||||||
graphics.backgrounddrawn = false;
|
graphics.backgrounddrawn = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1232,7 +1232,24 @@ static bool gridmatch( int p1, int p2, int p3, int p4, int p11, int p21, int p31
|
||||||
|
|
||||||
static void entityclonefix(entclass* entity)
|
static void entityclonefix(entclass* entity)
|
||||||
{
|
{
|
||||||
if (entity->behave == 10 || entity->behave == 12)
|
const bool is_lies_emitter = entity->behave == 10;
|
||||||
|
const bool is_factory_emitter = entity->behave == 12;
|
||||||
|
|
||||||
|
const bool is_emitter = is_lies_emitter || is_factory_emitter;
|
||||||
|
if (!is_emitter)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const bool in_lies_emitter_room =
|
||||||
|
game.roomx >= 113 && game.roomx <= 117 && game.roomy == 111;
|
||||||
|
const bool in_factory_emitter_room =
|
||||||
|
game.roomx == 113 && game.roomy >= 108 && game.roomy <= 110;
|
||||||
|
|
||||||
|
const bool valid = (is_lies_emitter && in_lies_emitter_room)
|
||||||
|
|| (is_factory_emitter && in_factory_emitter_room);
|
||||||
|
|
||||||
|
if (!valid)
|
||||||
{
|
{
|
||||||
/* Fix memory leak */
|
/* Fix memory leak */
|
||||||
entity->behave = -1;
|
entity->behave = -1;
|
||||||
|
|
|
@ -4728,7 +4728,13 @@ void Game::deserializesettings(tinyxml2::XMLElement* dataNode, struct ScreenSett
|
||||||
|
|
||||||
if (SDL_strcmp(pKey, "stretch") == 0)
|
if (SDL_strcmp(pKey, "stretch") == 0)
|
||||||
{
|
{
|
||||||
screen_settings->scalingMode = help.Int(pText);
|
int mode = help.Int(pText);
|
||||||
|
if (mode < 0 || mode >= NUM_SCALING_MODES)
|
||||||
|
{
|
||||||
|
/* Pick a sane default. */
|
||||||
|
mode = SCALING_INTEGER;
|
||||||
|
}
|
||||||
|
screen_settings->scalingMode = mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SDL_strcmp(pKey, "useLinearFilter") == 0)
|
if (SDL_strcmp(pKey, "useLinearFilter") == 0)
|
||||||
|
|
|
@ -3517,6 +3517,13 @@ void Graphics::get_stretch_info(SDL_Rect* rect)
|
||||||
rect->w = width;
|
rect->w = width;
|
||||||
rect->h = height;
|
rect->h = height;
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
SDL_assert(0 && "Invalid scaling mode!");
|
||||||
|
/* Width and height should be nonzero to avoid division by zero. */
|
||||||
|
rect->x = 0;
|
||||||
|
rect->y = 0;
|
||||||
|
rect->w = width;
|
||||||
|
rect->h = height;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2617,6 +2617,7 @@ void gameinput(void)
|
||||||
|| !game.glitchrunkludge)
|
|| !game.glitchrunkludge)
|
||||||
{
|
{
|
||||||
game.state++;
|
game.state++;
|
||||||
|
game.unlockstate();
|
||||||
}
|
}
|
||||||
game.jumpheld = true;
|
game.jumpheld = true;
|
||||||
game.glitchrunkludge=true;
|
game.glitchrunkludge=true;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#ifndef RELEASEVERSION_H
|
#ifndef RELEASEVERSION_H
|
||||||
#define RELEASEVERSION_H
|
#define RELEASEVERSION_H
|
||||||
|
|
||||||
#define RELEASE_VERSION "v2.4.1"
|
#define RELEASE_VERSION "v2.4.2"
|
||||||
|
|
||||||
#endif /* RELEASEVERSION_H */
|
#endif /* RELEASEVERSION_H */
|
||||||
|
|
|
@ -2135,9 +2135,21 @@ void gamecompleterender(void)
|
||||||
creditOffset += 140;
|
creditOffset += 140;
|
||||||
if (graphics.onscreen(creditOffset + position))
|
if (graphics.onscreen(creditOffset + position))
|
||||||
{
|
{
|
||||||
font::print(PR_2X | PR_CEN | PR_CJK_HIGH, -1, creditOffset + position, loc::gettext("Thanks for"), tr, tg, tb);
|
const char* line1;
|
||||||
|
const char* line2;
|
||||||
|
if (graphics.flipmode)
|
||||||
|
{
|
||||||
|
line1 = loc::gettext("playing!");
|
||||||
|
line2 = loc::gettext("Thanks for");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
line1 = loc::gettext("Thanks for");
|
||||||
|
line2 = loc::gettext("playing!");
|
||||||
|
}
|
||||||
|
font::print(PR_2X | PR_CEN | PR_CJK_HIGH, -1, creditOffset + position, line1, tr, tg, tb);
|
||||||
creditOffset += 20;
|
creditOffset += 20;
|
||||||
font::print(PR_2X | PR_CEN | PR_CJK_LOW, -1, creditOffset + position, loc::gettext("playing!"), tr, tg, tb);
|
font::print(PR_2X | PR_CEN | PR_CJK_LOW, -1, creditOffset + position, line2, tr, tg, tb);
|
||||||
}
|
}
|
||||||
|
|
||||||
draw_skip_message();
|
draw_skip_message();
|
||||||
|
|
|
@ -681,7 +681,7 @@ void scriptclass::run(void)
|
||||||
texty = 0;
|
texty = 0;
|
||||||
textcrewmateposition.x = obj.entities[i].xp;
|
textcrewmateposition.x = obj.entities[i].xp;
|
||||||
textcrewmateposition.override_x = true;
|
textcrewmateposition.override_x = true;
|
||||||
textcrewmateposition.y = obj.entities[i].xp;
|
textcrewmateposition.y = obj.entities[i].yp;
|
||||||
textcrewmateposition.override_y = true;
|
textcrewmateposition.override_y = true;
|
||||||
|
|
||||||
textcrewmateposition.dir = j;
|
textcrewmateposition.dir = j;
|
||||||
|
@ -3547,7 +3547,7 @@ bool scriptclass::loadcustom(const std::string& t)
|
||||||
}else if(words[0] == "reply"){
|
}else if(words[0] == "reply"){
|
||||||
//For this version, terminal only
|
//For this version, terminal only
|
||||||
if(squeakmode==0) add("squeak(player)");
|
if(squeakmode==0) add("squeak(player)");
|
||||||
add("text(cyan,0,0,"+words[1]+")");
|
add("text(player,0,0,"+words[1]+")");
|
||||||
|
|
||||||
int ti=help.Int(words[1].c_str());
|
int ti=help.Int(words[1].c_str());
|
||||||
int nti = ti>=0 ? ti : 1;
|
int nti = ti>=0 ? ti : 1;
|
||||||
|
|
|
@ -220,6 +220,12 @@ void vlog_open_console(void)
|
||||||
vlog_error("Could not redirect STDERR to console.");
|
vlog_error("Could not redirect STDERR to console.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
handle = freopen("CON", "r", stdin);
|
||||||
|
if (handle == NULL)
|
||||||
|
{
|
||||||
|
vlog_error("Could not redirect STDIN to console.");
|
||||||
|
}
|
||||||
|
|
||||||
check_color_support();
|
check_color_support();
|
||||||
|
|
||||||
if (!SetConsoleOutputCP(CP_UTF8))
|
if (!SetConsoleOutputCP(CP_UTF8))
|
||||||
|
|
|
@ -363,6 +363,23 @@ static void emscriptenloop(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static void keep_console_open(const bool open_console)
|
||||||
|
{
|
||||||
|
if (!open_console)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Press ENTER to quit.");
|
||||||
|
|
||||||
|
int c;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
c = getchar();
|
||||||
|
}
|
||||||
|
while (c != '\n' && c != EOF);
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
char* baseDir = NULL;
|
char* baseDir = NULL;
|
||||||
|
@ -370,9 +387,11 @@ int main(int argc, char *argv[])
|
||||||
char* langDir = NULL;
|
char* langDir = NULL;
|
||||||
char* fontsDir = NULL;
|
char* fontsDir = NULL;
|
||||||
bool seed_use_sdl_getticks = false;
|
bool seed_use_sdl_getticks = false;
|
||||||
#ifdef _WIN32
|
|
||||||
bool open_console = false;
|
bool open_console = false;
|
||||||
#endif
|
bool print_version = false;
|
||||||
|
bool print_addresses = false;
|
||||||
|
int invalid_arg = 0;
|
||||||
|
int invalid_partial_arg = 0;
|
||||||
|
|
||||||
vlog_init();
|
vlog_init();
|
||||||
|
|
||||||
|
@ -386,41 +405,16 @@ int main(int argc, char *argv[])
|
||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
vlog_error("%s option requires one argument.", argv[i]); \
|
invalid_partial_arg = i; \
|
||||||
VVV_exit(1); \
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ARG("-version"))
|
if (ARG("-version"))
|
||||||
{
|
{
|
||||||
/* Just print the version and exit. No vlogging. */
|
print_version = true;
|
||||||
puts(
|
|
||||||
"VVVVVV " RELEASE_VERSION
|
|
||||||
#ifdef MAKEANDPLAY
|
|
||||||
" [M&P]"
|
|
||||||
#endif
|
|
||||||
);
|
|
||||||
#ifdef INTERIM_VERSION_EXISTS
|
|
||||||
puts(COMMIT_DATE);
|
|
||||||
puts(INTERIM_COMMIT);
|
|
||||||
puts(BRANCH_NAME);
|
|
||||||
#endif
|
|
||||||
VVV_exit(0);
|
|
||||||
}
|
}
|
||||||
else if (ARG("-addresses"))
|
else if (ARG("-addresses"))
|
||||||
{
|
{
|
||||||
printf("cl : %p\n", (void*) &cl);
|
print_addresses = true;
|
||||||
printf("ed : %p\n", (void*) &ed);
|
|
||||||
printf("game : %p\n", (void*) &game);
|
|
||||||
printf("gameScreen : %p\n", (void*) &gameScreen);
|
|
||||||
printf("graphics : %p\n", (void*) &graphics);
|
|
||||||
printf("help : %p\n", (void*) &help);
|
|
||||||
printf("key : %p\n", (void*) &key);
|
|
||||||
printf("map : %p\n", (void*) &map);
|
|
||||||
printf("music : %p\n", (void*) &music);
|
|
||||||
printf("obj : %p\n", (void*) &obj);
|
|
||||||
printf("script : %p\n", (void*) &script);
|
|
||||||
|
|
||||||
VVV_exit(0);
|
|
||||||
}
|
}
|
||||||
else if (ARG("-renderer"))
|
else if (ARG("-renderer"))
|
||||||
{
|
{
|
||||||
|
@ -541,8 +535,7 @@ int main(int argc, char *argv[])
|
||||||
#undef ARG
|
#undef ARG
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
vlog_error("Error: invalid option: %s", argv[i]);
|
invalid_arg = i;
|
||||||
VVV_exit(1);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -557,6 +550,54 @@ int main(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (invalid_arg > 0)
|
||||||
|
{
|
||||||
|
vlog_error("Error: invalid option: %s", argv[invalid_arg]);
|
||||||
|
keep_console_open(open_console);
|
||||||
|
VVV_exit(1);
|
||||||
|
}
|
||||||
|
else if (invalid_partial_arg > 0)
|
||||||
|
{
|
||||||
|
vlog_error("%s option requires one argument.", argv[invalid_partial_arg]);
|
||||||
|
keep_console_open(open_console);
|
||||||
|
VVV_exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (print_version)
|
||||||
|
{
|
||||||
|
/* Just print the version and exit. No vlogging. */
|
||||||
|
puts(
|
||||||
|
"VVVVVV " RELEASE_VERSION
|
||||||
|
#ifdef MAKEANDPLAY
|
||||||
|
" [M&P]"
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
#ifdef INTERIM_VERSION_EXISTS
|
||||||
|
puts(COMMIT_DATE);
|
||||||
|
puts(INTERIM_COMMIT);
|
||||||
|
puts(BRANCH_NAME);
|
||||||
|
#endif
|
||||||
|
keep_console_open(open_console);
|
||||||
|
VVV_exit(0);
|
||||||
|
}
|
||||||
|
else if (print_addresses)
|
||||||
|
{
|
||||||
|
printf("cl : %p\n", (void*) &cl);
|
||||||
|
printf("ed : %p\n", (void*) &ed);
|
||||||
|
printf("game : %p\n", (void*) &game);
|
||||||
|
printf("gameScreen : %p\n", (void*) &gameScreen);
|
||||||
|
printf("graphics : %p\n", (void*) &graphics);
|
||||||
|
printf("help : %p\n", (void*) &help);
|
||||||
|
printf("key : %p\n", (void*) &key);
|
||||||
|
printf("map : %p\n", (void*) &map);
|
||||||
|
printf("music : %p\n", (void*) &music);
|
||||||
|
printf("obj : %p\n", (void*) &obj);
|
||||||
|
printf("script : %p\n", (void*) &script);
|
||||||
|
|
||||||
|
keep_console_open(open_console);
|
||||||
|
VVV_exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
SDL_SetHintWithPriority(SDL_HINT_IME_SHOW_UI, "1", SDL_HINT_OVERRIDE);
|
SDL_SetHintWithPriority(SDL_HINT_IME_SHOW_UI, "1", SDL_HINT_OVERRIDE);
|
||||||
|
|
||||||
/* We already do the button swapping in ButtonGlyphs, disable SDL's swapping */
|
/* We already do the button swapping in ButtonGlyphs, disable SDL's swapping */
|
||||||
|
@ -774,6 +815,7 @@ int main(int argc, char *argv[])
|
||||||
cl.ListOfMetaData.push_back(meta);
|
cl.ListOfMetaData.push_back(meta);
|
||||||
} else {
|
} else {
|
||||||
vlog_error("Level not found");
|
vlog_error("Level not found");
|
||||||
|
keep_console_open(open_console);
|
||||||
VVV_exit(1);
|
VVV_exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user