Compare commits

...

2 Commits

13 changed files with 257 additions and 87 deletions

View File

@ -1,8 +1,18 @@
# Blob Wars : Attrition # Blob Wars : Attrition
This is the port of the Blob Wars Attrition 1.2.2 for the AmigaOS 4. It is This is the port of the Blob Wars Attrition 1.2.2 for the AmigaOS 4 and
tested and runs well on X5000/40. Also I tested it on microAmigaOne but the MorphOS.
lack of graphics memory (32MB total) makes it really slow.
The AmigaOS 4 versions is tested and runs well on X5000/40. Also I tested
it on microAmigaOne but the lack of graphics memory (32MB total) makes it
really slow.
The MorphOS version was tested on PowerBook G4 and runs pretty fine and
quickly.
I'd love to hear how it works on your system.
### Installation
This archive does not contain any data files. In order to play the game, you This archive does not contain any data files. In order to play the game, you
will need to purchase the data. You can do so here: will need to purchase the data. You can do so here:
@ -22,7 +32,22 @@ It is recommended to have the following SDL2 options enabled at its prefs:
installed in your system installed in your system
- Batching Mode: enabled - Batching Mode: enabled
### Support
If you like what I am doing and my ports and you would like to support me,
and my future releases please visit https://ko-fi.com/walkero where you
can find all the latest updates by me and you can donate.
### Changelog ### Changelog
1.2.2r2 (2022-09-19)
* Did a few changes at the code that speeds up the game a lot
* Removed the white shadow from texts in some renderers
* Changed the freetype library with the latest version
* Removed the debug info at the start of the game
* MorphOS version released
* Some code cleanup at the repo
1.2.2r1 (2022-08-13) 1.2.2r1 (2022-08-13)
* First release * First release

View File

@ -65,8 +65,11 @@ $(OUT)/%.o: %.c %.h $(DEPS)
$(CC) $(CFLAGS) $(CXXFLAGS) -c -o $@ $< $(CC) $(CFLAGS) $(CXXFLAGS) -c -o $@ $<
%.mo: %.po %.mo: %.po
ifneq ($(shell uname), AmigaOS)
msgfmt -c -o $@ $< msgfmt -c -o $@ $<
endif
# cleaning everything that can be automatically recreated with "make". # cleaning everything that can be automatically recreated with "make".
clean: clean:
$(RM) $(OBJS) $(PROG) $(LOCALE_MO) $(RM) $(OBJS) $(PROG) $(LOCALE_MO)

65
makefile.mos Normal file
View File

@ -0,0 +1,65 @@
PROG = blobwarsAttrition
CC = gcc
PREFIX ?= /usr
BIN_DIR ?= $(PREFIX)/bin
DATA_DIR ?= data
LOCALE_DIR = locale
ICON_DIR = $(PREFIX)/share/icons/hicolor
DESKTOP_DIR = $(PREFIX)/share/applications
DESTDIR ?=
INST_BIN_DIR = $(DESTDIR)$(BIN_DIR)
INST_DATA_DIR = $(DESTDIR)$(DATA_DIR)
INST_LOCALE_DIR = $(DESTDIR)$(LOCALE_DIR)
INST_ICON_DIR = $(DESTDIR)$(ICON_DIR)
INST_DESKTOP_DIR = $(DESTDIR)$(DESKTOP_DIR)
SEARCHPATH += src/plat/mos
_OBJS += mosInit.o
include common.mk
CXXFLAGS += -O3 -DVERSION=$(VERSION) -DREVISION=$(REVISION) -DDATA_DIR=\"$(DATA_DIR)\" -DLOCALE_DIR=\"$(LOCALE_DIR)\" -D__USE_INLINE__
CXXFLAGS += -I/sdk/gg/usr/local/include -g -lefence
CXXFLAGS += -fms-extensions -std=gnu11 -noixemul
ifneq ("$(wildcard .errors)","")
CXXFLAGS += -Wall -Wempty-body -Werror -Wstrict-prototypes -Werror=maybe-uninitialized -Warray-bounds
endif
LDFLAGS += -noixemul -lSDL2_image -lSDL2_ttf -lfreetype -ltiff -lpng16 -ljpeg -lz -lm
LDFLAGS += -lSDL2_mixer -lmikmod -lmodplug -lFLAC -lvorbisfile -lvorbis -logg
LDFLAGS += -lSDL2 -lstdc++
SHARED_FILES = LICENSE README.md data gfx manual music sound icons
DIST_FILES = $(SHARED_FILES) locale $(PROG)
SRC_DIST_FILES = $(SHARED_FILES) src makefile* common.mk
# linking the program.
$(PROG): $(OBJS)
$(CC) -o $@ $(OBJS) $(LDFLAGS)
# prepare an archive for the program
dist:
mkdir -p release/$(PROG)-$(VERSION).$(REVISION)
cp $(PROG) release/$(PROG)-$(VERSION).$(REVISION)/
strip release/$(PROG)-$(VERSION).$(REVISION)/$(PROG)
cp icons/blob.info release/$(PROG)-$(VERSION).$(REVISION)/$(PROG).info
cp LICENSE release/$(PROG)-$(VERSION).$(REVISION)/
cp README.md release/$(PROG)-$(VERSION).$(REVISION)/
cp README-Amiga.md release/$(PROG)-$(VERSION).$(REVISION)/
lha -aeqr3 a $(PROG)-MOS-$(VERSION).$(REVISION).lha release/
# prepare an archive for the program
src-dist:
$(RM) -rf $(PROG)-$(VERSION).$(REVISION)
mkdir $(PROG)-$(VERSION).$(REVISION)
cp -rL $(SRC_DIST_FILES) $(PROG)-$(VERSION).$(REVISION)
git log --pretty=format:"%h%x09%an%x09%ad%x09%s" --date=short >$(PROG)-$(VERSION).$(REVISION)/CHANGELOG.raw
tar czf $(PROG)-$(VERSION).$(REVISION).src.tar.gz $(PROG)-$(VERSION).$(REVISION)
mkdir -p dist
mv $(PROG)-$(VERSION).$(REVISION).src.tar.gz dist
$(RM) -rf $(PROG)-$(VERSION).$(REVISION)
.PHONY: dist

View File

@ -26,7 +26,7 @@ ifneq ("$(wildcard .errors)","")
CXXFLAGS += -Wall -Wempty-body -Werror -Wstrict-prototypes -Werror=maybe-uninitialized -Warray-bounds CXXFLAGS += -Wall -Wempty-body -Werror -Wstrict-prototypes -Werror=maybe-uninitialized -Warray-bounds
endif endif
LDFLAGS += -lauto -lSDL2_image -lSDL2_ttf -lft2 -ltiff -lwebp -lpng -ljpeg -lz -lm LDFLAGS += -lauto -lSDL2_image -lSDL2_ttf -lfreetype -ltiff -lwebp -lpng -ljpeg -lz -lm
LDFLAGS += -lSDL2_mixer -lmikmod -lmodplug -lFLAC -lsmpeg2 -lvorbisfile -lvorbis -logg LDFLAGS += -lSDL2_mixer -lmikmod -lmodplug -lFLAC -lsmpeg2 -lvorbisfile -lvorbis -logg
LDFLAGS += -lSDL2 -lpthread -athread=native -lstdc++ LDFLAGS += -lSDL2 -lpthread -athread=native -lstdc++
@ -38,46 +38,6 @@ SRC_DIST_FILES = $(SHARED_FILES) src makefile* common.mk
$(PROG): $(OBJS) $(PROG): $(OBJS)
$(CC) -o $@ $(OBJS) $(LDFLAGS) $(CC) -o $@ $(OBJS) $(LDFLAGS)
install:
mkdir -p $(INST_BIN_DIR)
install -m 0755 $(PROG) $(INST_BIN_DIR)
mkdir -p $(INST_DATA_DIR)
cp -r data $(INST_DATA_DIR)
cp -r gfx $(INST_DATA_DIR)
cp -r manual $(INST_DATA_DIR)
cp -r music $(INST_DATA_DIR)
cp -r sound $(INST_DATA_DIR)
mkdir -p $(INST_ICON_DIR)/16x16/apps
mkdir -p $(INST_ICON_DIR)/32x32/apps
mkdir -p $(INST_ICON_DIR)/64x64/apps
mkdir -p $(INST_ICON_DIR)/128x128/apps
cp -p icons/$(PROG)-16x16.png $(INST_ICON_DIR)/16x16/apps/$(PROG).png
cp -p icons/$(PROG)-32x32.png $(INST_ICON_DIR)/32x32/apps/$(PROG).png
cp -p icons/$(PROG)-64x64.png $(INST_ICON_DIR)/64x64/apps/$(PROG).png
cp -p icons/$(PROG)-128x128.png $(INST_ICON_DIR)/128x128/apps/$(PROG).png
mkdir -p $(INST_DESKTOP_DIR)
cp -p icons/$(PROG).desktop $(INST_DESKTOP_DIR)
@for f in $(LOCALE_MO); do \
lang=`echo $$f | sed -e 's/^locale\///;s/\.mo$$//'`; \
mkdir -p $(INST_LOCALE_DIR)/$$lang/LC_MESSAGES; \
cp -v $$f $(INST_LOCALE_DIR)/$$lang/LC_MESSAGES/$(PROG).mo; \
done
uninstall:
$(RM) $(BIN_DIR)/$(PROG)
$(RM) -rf $(DATA_DIR)
$(RM) $(ICON_DIR)/16x16/apps/$(PROG).png
$(RM) $(ICON_DIR)/32x32/apps/$(PROG).png
$(RM) $(ICON_DIR)/64x64/apps/$(PROG).png
$(RM) $(ICON_DIR)/128x128/apps/$(PROG).png
$(RM) $(DESKTOP_DIR)/$(PROG).desktop
@for f in $(LOCALE_MO); do \
lang=`echo $$f | sed -e 's/^locale\///;s/\.mo$$//'`; \
$(RM) -v $(LOCALE_DIR)/$$lang/LC_MESSAGES/$(PROG).mo; \
done
# prepare an archive for the program # prepare an archive for the program
dist: dist:
mkdir -p release/$(PROG)-$(VERSION).$(REVISION) mkdir -p release/$(PROG)-$(VERSION).$(REVISION)
@ -86,8 +46,8 @@ dist:
cp icons/blob.info release/$(PROG)-$(VERSION).$(REVISION)/$(PROG).info cp icons/blob.info release/$(PROG)-$(VERSION).$(REVISION)/$(PROG).info
cp LICENSE release/$(PROG)-$(VERSION).$(REVISION)/ cp LICENSE release/$(PROG)-$(VERSION).$(REVISION)/
cp README.md release/$(PROG)-$(VERSION).$(REVISION)/ cp README.md release/$(PROG)-$(VERSION).$(REVISION)/
cp README-OS4.md release/$(PROG)-$(VERSION).$(REVISION)/ cp README-Amiga.md release/$(PROG)-$(VERSION).$(REVISION)/
lha -aeqr3 a $(PROG)-$(VERSION).$(REVISION).lha release/ lha -aeqr3 a $(PROG)-OS4-$(VERSION).$(REVISION).lha release/
# prepare an archive for the program # prepare an archive for the program

View File

@ -172,9 +172,9 @@ void drawTrophies(void)
i++; i++;
} }
#if !defined(__amigaos4__) && !defined(__morphos__)
SDL_SetTextureColorMod(atlasTexture->texture, 255, 255, 255); SDL_SetTextureColorMod(atlasTexture->texture, 255, 255, 255);
#endif
drawWidgets(); drawWidgets();
SDL_SetRenderTarget(app.renderer, app.backBuffer); SDL_SetRenderTarget(app.renderer, app.backBuffer);
@ -332,7 +332,9 @@ void drawTrophyAlert(void)
blitRectRotated(atlasTexture->texture, x + 24, y + 24, &sparkle->rect, sparkleAngle); blitRectRotated(atlasTexture->texture, x + 24, y + 24, &sparkle->rect, sparkleAngle);
blitRectRotated(atlasTexture->texture, x + 24, y + 24, &sparkle->rect, -sparkleAngle); blitRectRotated(atlasTexture->texture, x + 24, y + 24, &sparkle->rect, -sparkleAngle);
blitRectScaled(atlasTexture->texture, x, y, 48, 48, &trophyIcons[alertTrophy->value]->rect, 0); blitRectScaled(atlasTexture->texture, x, y, 48, 48, &trophyIcons[alertTrophy->value]->rect, 0);
#if !defined(__amigaos4__) && !defined(__morphos__)
SDL_SetTextureColorMod(atlasTexture->texture, 255, 255, 255); SDL_SetTextureColorMod(atlasTexture->texture, 255, 255, 255);
#endif
} }
} }
@ -412,3 +414,4 @@ static void setSparkleColor(Trophy *t)
break; break;
} }
} }

View File

@ -904,3 +904,4 @@ void destroyHub(void)
memset(&hubMissionHead, 0, sizeof(HubMission)); memset(&hubMissionHead, 0, sizeof(HubMission));
hubMissionTail = &hubMissionHead; hubMissionTail = &hubMissionHead;
} }

View File

@ -36,11 +36,9 @@ int main(int argc, char *argv[])
initLookups(); initLookups();
init18N(argc, argv);
initSDL(); initSDL();
SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN); init18N(argc, argv);
initGameSystem(); initGameSystem();
@ -202,3 +200,4 @@ static void handleCommandLine(int argc, char *argv[])
initTitle(); initTitle();
} }
} }

101
src/plat/mos/mosInit.c Normal file
View File

@ -0,0 +1,101 @@
/*
Copyright (C) 2018-2019 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <proto/dos.h>
#include <proto/exec.h>
#include "mosInit.h"
#define VSTRING "Blob Wars Attrition 1.2.2r2 (19.09.2022)"
#define VERSTAG "\0$VER: " VSTRING
unsigned long __stack = 1000000;
UBYTE VString[] = VERSTAG;
static void mkpath(const char *path);
void createSaveFolder(void)
{
char *dir;
int i;
BPTR savesPathLock = Lock("PROGDIR:saves", SHARED_LOCK);
if (!savesPathLock)
{
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Saves folder not found. I am going to create it.");
mkpath("PROGDIR:saves");
}
else {
UnLock(savesPathLock);
}
for (i = 0 ; i < MAX_SAVE_SLOTS ; i++)
{
dir = buildFormattedString("saves/%d", i);
mkpath(dir);
free(dir);
}
app.saveDir = "saves";
}
static void mkpath(const char *path)
{
char dir[MAX_FILENAME_LENGTH];
int i, rootPath;
strcpy(dir, "");
rootPath = 1;
for (i = 0 ; i < strlen(path) ; i++)
{
if (path[i] == '/')
{
if (!rootPath)
{
if (mkdir(dir, S_IRWXU|S_IRWXG|S_IROTH|S_IXOTH) != 0 && errno != EEXIST)
{
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_ERROR, "Failed to create save dir '%s'.", dir);
exit(1);
}
}
rootPath = 0;
}
dir[i] = path[i];
dir[i + 1] = '\0';
}
if (mkdir(dir, S_IRWXU|S_IRWXG|S_IROTH|S_IXOTH) != 0 && errno != EEXIST)
{
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_ERROR, "Failed to create save dir '%s'.", dir);
exit(1);
}
}
void createScreenshotFolder(void)
{
mkdir("PROGDIR:screenshots", S_IRWXU|S_IRWXG|S_IROTH|S_IXOTH);
dev.screenshotFolder = "screenshots";
}

32
src/plat/mos/mosInit.h Normal file
View File

@ -0,0 +1,32 @@
/*
Copyright (C) 2018-2019 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <sys/stat.h>
#include <pwd.h>
#include <unistd.h>
#include <errno.h>
#include "../../common.h"
extern char *buildFormattedString(const char *format, ...);
extern App app;
extern Dev dev;

View File

@ -23,7 +23,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "os4Init.h" #include "os4Init.h"
#define VSTRING "Blob Wars Attrition 1.2.2r1 (13.08.2022)" #define VSTRING "Blob Wars Attrition 1.2.2r2 (19.09.2022)"
#define VERSTAG "\0$VER: " VSTRING #define VERSTAG "\0$VER: " VSTRING
static CONST_STRPTR stack USED = "$STACK:102400"; static CONST_STRPTR stack USED = "$STACK:102400";
static CONST_STRPTR version USED = VERSTAG; static CONST_STRPTR version USED = VERSTAG;
@ -54,36 +54,6 @@ void createSaveFolder(void)
free(dir); free(dir);
} }
app.saveDir = "saves"; app.saveDir = "saves";
// char *userHome, *dir;
// int i;
// userHome = getenv("HOME");
// SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "User home = %s", userHome);
// if (!userHome)
// {
// SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_ERROR, "Unable to determine user save folder.");
// exit(1);
// }
// SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "User home = %s", userHome);
// for (i = 0 ; i < MAX_SAVE_SLOTS ; i++)
// {
// dir = buildFormattedString("%s/.local/share/blobwarsAttrition/%d", userHome, i);
// mkpath(dir);
// free(dir);
// }
// app.saveDir = buildFormattedString("%s/.local/share/blobwarsAttrition", userHome);
// app.saveDir = "/save";
} }
static void mkpath(const char *path) static void mkpath(const char *path)
@ -124,8 +94,8 @@ static void mkpath(const char *path)
void createScreenshotFolder(void) void createScreenshotFolder(void)
{ {
mkdir("/tmp/blobwarsAttrition", S_IRWXU|S_IRWXG|S_IROTH|S_IXOTH); mkdir("PROGDIR:screenshots", S_IRWXU|S_IRWXG|S_IROTH|S_IXOTH);
dev.screenshotFolder = "/tmp/blobwarsAttrition"; dev.screenshotFolder = "screenshots";
} }

View File

@ -74,6 +74,8 @@ void initSDL(void)
exit(1); exit(1);
} }
SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN);
if (Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 1024) == -1) if (Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 1024) == -1)
{ {
printf("Couldn't initialize SDL Mixer\n"); printf("Couldn't initialize SDL Mixer\n");
@ -370,3 +372,4 @@ void cleanup(void)
SDL_Quit(); SDL_Quit();
} }

View File

@ -164,6 +164,7 @@ void drawText(int x, int y, int size, int align, SDL_Color color, const char *fo
if (app.textWidth == 0) if (app.textWidth == 0)
{ {
#if !defined(__amigaos4__) && !defined(__morphos__)
SDL_SetTextureColorMod(activeFont->texture, 0, 0, 0); SDL_SetTextureColorMod(activeFont->texture, 0, 0, 0);
SDL_SetTextureAlphaMod(activeFont->texture, 255); SDL_SetTextureAlphaMod(activeFont->texture, 255);
@ -172,11 +173,13 @@ void drawText(int x, int y, int size, int align, SDL_Color color, const char *fo
SDL_SetTextureColorMod(activeFont->texture, color.r, color.g, color.b); SDL_SetTextureColorMod(activeFont->texture, color.r, color.g, color.b);
SDL_SetTextureAlphaMod(activeFont->texture, color.a); SDL_SetTextureAlphaMod(activeFont->texture, color.a);
#endif
drawTextLine(x, y, size, align, drawTextBuffer); drawTextLine(x, y, size, align, drawTextBuffer);
} }
else else
{ {
#if !defined(__amigaos4__) && !defined(__morphos__)
SDL_SetTextureColorMod(activeFont->texture, 0, 0, 0); SDL_SetTextureColorMod(activeFont->texture, 0, 0, 0);
SDL_SetTextureAlphaMod(activeFont->texture, 255); SDL_SetTextureAlphaMod(activeFont->texture, 255);
@ -185,6 +188,7 @@ void drawText(int x, int y, int size, int align, SDL_Color color, const char *fo
SDL_SetTextureColorMod(activeFont->texture, color.r, color.g, color.b); SDL_SetTextureColorMod(activeFont->texture, color.r, color.g, color.b);
SDL_SetTextureAlphaMod(activeFont->texture, color.a); SDL_SetTextureAlphaMod(activeFont->texture, color.a);
#endif
drawTextLines(x, y, size, align); drawTextLines(x, y, size, align);
} }
@ -433,3 +437,4 @@ static char *nextCharacter(const char *str, int *i)
*i = *i + 1; *i = *i + 1;
} }
} }

View File

@ -110,6 +110,7 @@ char *buildFormattedString(const char *format, ...)
* (Declaration that it's public domain): * (Declaration that it's public domain):
* http://groups.google.com/group/comp.lang.c/msg/7c7b39328fefab9c * http://groups.google.com/group/comp.lang.c/msg/7c7b39328fefab9c
*/ */
#if !defined(__morphos__)
char *strtok_r(char *str, const char *delim, char **nextp) char *strtok_r(char *str, const char *delim, char **nextp)
{ {
char *ret; char *ret;
@ -139,3 +140,5 @@ char *strtok_r(char *str, const char *delim, char **nextp)
return ret; return ret;
} }
#endif