Start of v0.1
This commit is contained in:
parent
75e5bb3f44
commit
1c429f33d3
|
@ -0,0 +1,6 @@
|
||||||
|
data
|
||||||
|
gfx
|
||||||
|
music
|
||||||
|
sound
|
||||||
|
blobwarsAttrition
|
||||||
|
*.o
|
|
@ -0,0 +1,31 @@
|
||||||
|
VERSION = 0.1
|
||||||
|
REVISION = $(shell git rev-list HEAD 2>/dev/null | wc -l)
|
||||||
|
LOCALE_MO = $(patsubst %.po,%.mo,$(wildcard locale/*.po))
|
||||||
|
|
||||||
|
SEARCHPATH += src src/game src/system src/util
|
||||||
|
vpath %.c $(SEARCHPATH)
|
||||||
|
vpath %.h $(SEARCHPATH)
|
||||||
|
|
||||||
|
DEPS += defs.h structs.h
|
||||||
|
|
||||||
|
OBJS += draw.o
|
||||||
|
OBJS += game.o
|
||||||
|
OBJS += init.o input.o io.o
|
||||||
|
OBJS += lookup.o
|
||||||
|
OBJS += main.o maths.o
|
||||||
|
OBJS += text.o textures.o title.o
|
||||||
|
OBJS += util.o
|
||||||
|
|
||||||
|
# top-level rule to create the program.
|
||||||
|
all: $(PROG) $(LOCALE_MO)
|
||||||
|
|
||||||
|
# compiling other source files.
|
||||||
|
%.o: %.c %.h $(DEPS)
|
||||||
|
$(CC) $(CFLAGS) $(CXXFLAGS) -c $<
|
||||||
|
|
||||||
|
%.mo: %.po
|
||||||
|
msgfmt -c -o $@ $<
|
||||||
|
|
||||||
|
# cleaning everything that can be automatically recreated with "make".
|
||||||
|
clean:
|
||||||
|
$(RM) $(OBJS) $(PROG) $(LOCALE_MO)
|
|
@ -0,0 +1,97 @@
|
||||||
|
PROG = blobwarsAttrition
|
||||||
|
CC = gcc
|
||||||
|
PREFIX ?= /usr
|
||||||
|
BIN_DIR ?= $(PREFIX)/bin
|
||||||
|
DATA_DIR ?= /opt/$(PROG)
|
||||||
|
LOCALE_DIR = $(PREFIX)/share/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/unix
|
||||||
|
OBJS += unixInit.o
|
||||||
|
|
||||||
|
include common.mk
|
||||||
|
|
||||||
|
CXXFLAGS += `sdl2-config --cflags` -DVERSION=$(VERSION) -DREVISION=$(REVISION) -DDATA_DIR=\"$(DATA_DIR)\" -DLOCALE_DIR=\"$(LOCALE_DIR)\"
|
||||||
|
CXXFLAGS += -Wall -Wempty-body -ansi -pedantic -Werror -Wstrict-prototypes -Werror=maybe-uninitialized -Warray-bounds
|
||||||
|
CXXFLAGS += -g -lefence
|
||||||
|
|
||||||
|
LDFLAGS += `sdl2-config --libs` -lSDL2_mixer -lSDL2_image -lSDL2_ttf -lm
|
||||||
|
|
||||||
|
SHARED_FILES = CHANGELOG 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)
|
||||||
|
|
||||||
|
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
|
||||||
|
dist:
|
||||||
|
$(RM) -rf $(PROG)-$(VERSION)
|
||||||
|
mkdir $(PROG)-$(VERSION)
|
||||||
|
cp -r $(DIST_FILES) $(PROG)-$(VERSION)
|
||||||
|
tar czf $(PROG)-$(VERSION)-$(REVISION).linux-x86.tar.gz $(PROG)-$(VERSION)
|
||||||
|
mkdir -p dist
|
||||||
|
mv $(PROG)-$(VERSION)-$(REVISION).linux-x86.tar.gz dist
|
||||||
|
$(RM) -rf $(PROG)-$(VERSION)
|
||||||
|
|
||||||
|
# prepare an archive for the program
|
||||||
|
src-dist:
|
||||||
|
$(RM) -rf $(PROG)-$(VERSION)
|
||||||
|
mkdir $(PROG)-$(VERSION)
|
||||||
|
cp -r $(SRC_DIST_FILES) $(PROG)-$(VERSION)
|
||||||
|
git log --pretty=format:"%h%x09%an%x09%ad%x09%s" --date=short >$(PROG)-$(VERSION)/CHANGELOG.raw
|
||||||
|
tar czf $(PROG)-$(VERSION)-$(REVISION).src.tar.gz $(PROG)-$(VERSION)
|
||||||
|
mkdir -p dist
|
||||||
|
mv $(PROG)-$(VERSION)-$(REVISION).src.tar.gz dist
|
||||||
|
$(RM) -rf $(PROG)-$(VERSION)
|
||||||
|
|
||||||
|
.PHONY: dist
|
|
@ -0,0 +1,30 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 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 "stdlib.h"
|
||||||
|
#include "stdio.h"
|
||||||
|
#include "string.h"
|
||||||
|
#include "math.h"
|
||||||
|
#include "ctype.h"
|
||||||
|
|
||||||
|
#include "SDL2/SDL.h"
|
||||||
|
|
||||||
|
#include "defs.h"
|
||||||
|
#include "structs.h"
|
|
@ -0,0 +1,85 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 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.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef REVISION
|
||||||
|
#define REVISION 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef DATA_DIR
|
||||||
|
#define DATA_DIR ""
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define _(string) getTranslatedString(string)
|
||||||
|
|
||||||
|
#define PI 3.14159265358979323846
|
||||||
|
#define MIN(a,b) (((a)<(b))?(a):(b))
|
||||||
|
#define MAX(a,b) (((a)>(b))?(a):(b))
|
||||||
|
#define STRNCPY(dest, src, n) strncpy(dest, src, n); dest[n - 1] = '\0'
|
||||||
|
#define TO_RAIDANS(angleDegrees) (angleDegrees * PI / 180.0)
|
||||||
|
#define TO_DEGREES(angleRadians) (angleRadians * 180.0 / PI)
|
||||||
|
|
||||||
|
#define SAVE_FILENAME "game.save"
|
||||||
|
#define CONFIG_FILENAME "config.json"
|
||||||
|
|
||||||
|
#define SCREEN_WIDTH 1280
|
||||||
|
#define SCREEN_HEIGHT 720
|
||||||
|
|
||||||
|
#define MAX_KEYBOARD_KEYS 350
|
||||||
|
#define MAX_MOUSE_BUTTONS 6
|
||||||
|
|
||||||
|
#define FPS 60
|
||||||
|
#define LOGIC_RATE (1000.0 / FPS)
|
||||||
|
|
||||||
|
#define MAX_FONTS 64
|
||||||
|
#define NUM_TEXT_BUCKETS 64
|
||||||
|
#define TEXT_TTL (1000 * 20)
|
||||||
|
|
||||||
|
#define MAX_NAME_LENGTH 32
|
||||||
|
#define MAX_DESCRIPTION_LENGTH 512
|
||||||
|
#define MAX_LINE_LENGTH 1024
|
||||||
|
#define MAX_FILENAME_LENGTH 1024
|
||||||
|
|
||||||
|
#define NUM_TEXTURE_BUCKETS 32
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
CONTROL_LEFT,
|
||||||
|
CONTROL_RIGHT,
|
||||||
|
CONTROL_UP,
|
||||||
|
CONTROL_DOWN,
|
||||||
|
CONTROL_FIRE,
|
||||||
|
CONTROL_JUMP,
|
||||||
|
CONTROL_JETPACK,
|
||||||
|
CONTROL_SCREENSHOT,
|
||||||
|
CONTROL_MAX
|
||||||
|
};
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
TA_LEFT,
|
||||||
|
TA_RIGHT,
|
||||||
|
TA_CENTER
|
||||||
|
};
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
CH_PLAYER,
|
||||||
|
CH_MAX
|
||||||
|
};
|
|
@ -0,0 +1,25 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 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 "game.h"
|
||||||
|
|
||||||
|
void destroyGame(void)
|
||||||
|
{
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 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 "../common.h"
|
|
@ -0,0 +1,38 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 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 "title.h"
|
||||||
|
|
||||||
|
static void logic(void);
|
||||||
|
static void draw(void);
|
||||||
|
|
||||||
|
void initTitle(void)
|
||||||
|
{
|
||||||
|
app.delegate.logic = &logic;
|
||||||
|
app.delegate.draw = &draw;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void logic(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static void draw(void)
|
||||||
|
{
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 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 "../common.h"
|
||||||
|
|
||||||
|
extern App app;
|
|
@ -0,0 +1,95 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 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 "main.h"
|
||||||
|
|
||||||
|
static long capFrameRate(const long then);
|
||||||
|
static void handleCommandLine(int argc, const char *argv[]);
|
||||||
|
|
||||||
|
int main(int argc, const char *argv[])
|
||||||
|
{
|
||||||
|
long then, nextSecond;
|
||||||
|
|
||||||
|
atexit(cleanup);
|
||||||
|
|
||||||
|
srand(time(NULL));
|
||||||
|
|
||||||
|
initSDL();
|
||||||
|
|
||||||
|
SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_DEBUG);
|
||||||
|
|
||||||
|
initGameSystem();
|
||||||
|
|
||||||
|
handleCommandLine(argc, argv);
|
||||||
|
|
||||||
|
nextSecond = SDL_GetTicks() + 1000;
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
then = SDL_GetTicks();
|
||||||
|
|
||||||
|
handleInput();
|
||||||
|
|
||||||
|
app.delegate.logic();
|
||||||
|
|
||||||
|
prepareScene();
|
||||||
|
|
||||||
|
app.delegate.draw();
|
||||||
|
|
||||||
|
presentScene();
|
||||||
|
|
||||||
|
then = capFrameRate(then);
|
||||||
|
|
||||||
|
if (SDL_GetTicks() >= nextSecond)
|
||||||
|
{
|
||||||
|
game.timePlayed++;
|
||||||
|
|
||||||
|
nextSecond = SDL_GetTicks() + 1000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static long capFrameRate(const long then)
|
||||||
|
{
|
||||||
|
long wait;
|
||||||
|
|
||||||
|
wait = 16 - (SDL_GetTicks() - then);
|
||||||
|
|
||||||
|
if (wait > 0)
|
||||||
|
{
|
||||||
|
SDL_Delay(wait);
|
||||||
|
}
|
||||||
|
|
||||||
|
return SDL_GetTicks();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void handleCommandLine(int argc, const char *argv[])
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 1 ; i < argc ; i++)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
initTitle();
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 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 "common.h"
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
extern void cleanup(void);
|
||||||
|
extern void initSDL(void);
|
||||||
|
extern void initGameSystem(void);
|
||||||
|
extern void handleInput(void);
|
||||||
|
extern void prepareScene(void);
|
||||||
|
extern void presentScene(void);
|
||||||
|
extern void initTitle(void);
|
||||||
|
|
||||||
|
App app;
|
||||||
|
Colors colors;
|
||||||
|
Dev dev;
|
||||||
|
Game game;
|
|
@ -0,0 +1,53 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 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 "unixInit.h"
|
||||||
|
|
||||||
|
void createSaveFolder(void)
|
||||||
|
{
|
||||||
|
char *userHome;
|
||||||
|
char dir[MAX_FILENAME_LENGTH];
|
||||||
|
|
||||||
|
userHome = getenv("HOME");
|
||||||
|
|
||||||
|
if (!userHome)
|
||||||
|
{
|
||||||
|
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN, "Unable to determine user save folder. Will save to current dir.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "User home = %s", userHome);
|
||||||
|
|
||||||
|
sprintf(dir, "%s/.local/share/blobwarsAttrition", userHome);
|
||||||
|
if (mkdir(dir, S_IRWXU|S_IRWXG|S_IROTH|S_IXOTH) != 0 && errno != EEXIST)
|
||||||
|
{
|
||||||
|
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN, "Failed to create save dir '%s'. Will save to current dir.", dir);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
STRNCPY(app.saveDir, dir, MAX_FILENAME_LENGTH);
|
||||||
|
}
|
||||||
|
|
||||||
|
void createScreenshotFolder(void)
|
||||||
|
{
|
||||||
|
mkdir("/tmp/blobwarsAttrition", S_IRWXU|S_IRWXG|S_IROTH|S_IXOTH);
|
||||||
|
|
||||||
|
dev.screenshotFolder = "/tmp/blobwarsAttrition";
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 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 App app;
|
||||||
|
extern Dev dev;
|
|
@ -0,0 +1,51 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 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 "win32Init.h"
|
||||||
|
|
||||||
|
void createSaveFolder(void)
|
||||||
|
{
|
||||||
|
char *userHome;
|
||||||
|
char dir[MAX_FILENAME_LENGTH];
|
||||||
|
|
||||||
|
userHome = getenv("USERPROFILE");
|
||||||
|
|
||||||
|
if (!userHome)
|
||||||
|
{
|
||||||
|
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN, "Unable to determine user save folder. Will save to current dir.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "User home = %s", userHome);
|
||||||
|
|
||||||
|
sprintf(dir, "%s\\blobwarsAttrition", userHome);
|
||||||
|
if (mkdir(dir) != 0 && errno != EEXIST)
|
||||||
|
{
|
||||||
|
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN, "Failed to create save dir '%s'. Will save to current dir.", dir);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
STRNCPY(app.saveDir, dir, MAX_FILENAME_LENGTH);
|
||||||
|
}
|
||||||
|
|
||||||
|
void createScreenshotFolder(void)
|
||||||
|
{
|
||||||
|
dev.screenshotFolder = "./";
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 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 <unistd.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include "../../common.h"
|
||||||
|
|
||||||
|
extern App app;
|
||||||
|
extern Dev dev;
|
|
@ -0,0 +1,114 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 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.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct Texture Texture;
|
||||||
|
typedef struct Lookup Lookup;
|
||||||
|
typedef struct Entity Entity;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int debug;
|
||||||
|
int takeScreenshots;
|
||||||
|
char *screenshotFolder;
|
||||||
|
int noAIWeapons;
|
||||||
|
int showFPS;
|
||||||
|
int playerImmortal;
|
||||||
|
int playerUnlimitedMissiles;
|
||||||
|
int noEntityActions;
|
||||||
|
int allImmortal;
|
||||||
|
int fps;
|
||||||
|
} Dev;
|
||||||
|
|
||||||
|
struct Texture {
|
||||||
|
char name[MAX_DESCRIPTION_LENGTH];
|
||||||
|
long hash;
|
||||||
|
long ttl;
|
||||||
|
SDL_Texture *texture;
|
||||||
|
Texture *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
SDL_Color red;
|
||||||
|
SDL_Color orange;
|
||||||
|
SDL_Color yellow;
|
||||||
|
SDL_Color green;
|
||||||
|
SDL_Color blue;
|
||||||
|
SDL_Color cyan;
|
||||||
|
SDL_Color purple;
|
||||||
|
SDL_Color white;
|
||||||
|
SDL_Color black;
|
||||||
|
SDL_Color lightGrey;
|
||||||
|
SDL_Color darkGrey;
|
||||||
|
} Colors;
|
||||||
|
|
||||||
|
struct Lookup {
|
||||||
|
char name[MAX_NAME_LENGTH];
|
||||||
|
long value;
|
||||||
|
Lookup *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
void (*logic)(void);
|
||||||
|
void (*draw)(void);
|
||||||
|
void (*handleClick)(int x, int y, int btn);
|
||||||
|
void (*handleDrag)(int x, int y, int dx, int dy, int cx, int cy);
|
||||||
|
void (*handleMouseUp)(int x, int y, int btn);
|
||||||
|
} Delegate;
|
||||||
|
|
||||||
|
struct Entity {
|
||||||
|
float x;
|
||||||
|
float y;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int x;
|
||||||
|
int y;
|
||||||
|
int w;
|
||||||
|
int h;
|
||||||
|
int dx;
|
||||||
|
int dy;
|
||||||
|
int button[MAX_MOUSE_BUTTONS];
|
||||||
|
int dragging;
|
||||||
|
} Mouse;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char saveDir[MAX_FILENAME_LENGTH];
|
||||||
|
int winWidth;
|
||||||
|
int winHeight;
|
||||||
|
float scaleX;
|
||||||
|
float scaleY;
|
||||||
|
int fullscreen;
|
||||||
|
int musicVolume;
|
||||||
|
int soundVolume;
|
||||||
|
int hideMouse;
|
||||||
|
Mouse mouse;
|
||||||
|
int keyboard[MAX_KEYBOARD_KEYS];
|
||||||
|
SDL_Texture *backBuffer;
|
||||||
|
SDL_Renderer *renderer;
|
||||||
|
SDL_Window *window;
|
||||||
|
Delegate delegate;
|
||||||
|
int awaitingWidgetInput;
|
||||||
|
int lastKeyPressed;
|
||||||
|
int lastButtonPressed;
|
||||||
|
int keyControls[CONTROL_MAX];
|
||||||
|
} App;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
long timePlayed;
|
||||||
|
} Game;
|
|
@ -0,0 +1,199 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 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 "draw.h"
|
||||||
|
|
||||||
|
static void initColor(SDL_Color *c, int r, int g, int b);
|
||||||
|
|
||||||
|
void initGraphics(void)
|
||||||
|
{
|
||||||
|
initColor(&colors.red, 255, 0, 0);
|
||||||
|
initColor(&colors.orange, 255, 128, 0);
|
||||||
|
initColor(&colors.yellow, 255, 255, 0);
|
||||||
|
initColor(&colors.green, 0, 255, 0);
|
||||||
|
initColor(&colors.blue, 0, 0, 255);
|
||||||
|
initColor(&colors.cyan, 0, 255, 255);
|
||||||
|
initColor(&colors.purple, 255, 0, 255);
|
||||||
|
initColor(&colors.white, 255, 255, 255);
|
||||||
|
initColor(&colors.black, 0, 0, 0);
|
||||||
|
initColor(&colors.lightGrey, 192, 192, 192);
|
||||||
|
initColor(&colors.darkGrey, 128, 128, 128);
|
||||||
|
|
||||||
|
app.backBuffer = SDL_CreateTexture(app.renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, SCREEN_WIDTH, SCREEN_HEIGHT);
|
||||||
|
}
|
||||||
|
|
||||||
|
void prepareScene(void)
|
||||||
|
{
|
||||||
|
SDL_SetRenderTarget(app.renderer, app.backBuffer);
|
||||||
|
SDL_SetRenderDrawColor(app.renderer, 0, 0, 0, 255);
|
||||||
|
SDL_RenderClear(app.renderer);
|
||||||
|
}
|
||||||
|
|
||||||
|
void presentScene(void)
|
||||||
|
{
|
||||||
|
SDL_SetRenderTarget(app.renderer, NULL);
|
||||||
|
SDL_RenderCopy(app.renderer, app.backBuffer, NULL, NULL);
|
||||||
|
SDL_RenderPresent(app.renderer);
|
||||||
|
}
|
||||||
|
|
||||||
|
void clearScreen(void)
|
||||||
|
{
|
||||||
|
SDL_SetRenderDrawBlendMode(app.renderer, SDL_BLENDMODE_NONE);
|
||||||
|
SDL_SetRenderDrawColor(app.renderer, 0, 0, 0, 255);
|
||||||
|
SDL_RenderFillRect(app.renderer, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void blit(SDL_Texture *texture, int x, int y, int center)
|
||||||
|
{
|
||||||
|
SDL_Rect dstRect;
|
||||||
|
|
||||||
|
dstRect.x = x;
|
||||||
|
dstRect.y = y;
|
||||||
|
SDL_QueryTexture(texture, NULL, NULL, &dstRect.w, &dstRect.h);
|
||||||
|
|
||||||
|
if (center)
|
||||||
|
{
|
||||||
|
dstRect.x -= (dstRect.w / 2);
|
||||||
|
dstRect.y -= (dstRect.h / 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_RenderCopy(app.renderer, texture, NULL, &dstRect);
|
||||||
|
}
|
||||||
|
|
||||||
|
void blitFlip(SDL_Texture *texture, int x, int y, int center, SDL_RendererFlip flip)
|
||||||
|
{
|
||||||
|
SDL_Rect dstRect;
|
||||||
|
|
||||||
|
dstRect.x = x;
|
||||||
|
dstRect.y = y;
|
||||||
|
SDL_QueryTexture(texture, NULL, NULL, &dstRect.w, &dstRect.h);
|
||||||
|
|
||||||
|
SDL_RenderCopyEx(app.renderer, texture, NULL, &dstRect, 0, NULL, flip);
|
||||||
|
}
|
||||||
|
|
||||||
|
void blitScaled(SDL_Texture *texture, int x, int y, int w, int h, int center)
|
||||||
|
{
|
||||||
|
SDL_Rect dstRect;
|
||||||
|
|
||||||
|
dstRect.x = x;
|
||||||
|
dstRect.y = y;
|
||||||
|
dstRect.w = w;
|
||||||
|
dstRect.h = h;
|
||||||
|
|
||||||
|
if (center)
|
||||||
|
{
|
||||||
|
dstRect.x -= (dstRect.w / 2);
|
||||||
|
dstRect.y -= (dstRect.h / 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_RenderCopy(app.renderer, texture, NULL, &dstRect);
|
||||||
|
}
|
||||||
|
|
||||||
|
void blitRotated(SDL_Texture *texture, int x, int y, float angle)
|
||||||
|
{
|
||||||
|
SDL_Rect dstRect;
|
||||||
|
|
||||||
|
dstRect.x = x;
|
||||||
|
dstRect.y = y;
|
||||||
|
SDL_QueryTexture(texture, NULL, NULL, &dstRect.w, &dstRect.h);
|
||||||
|
dstRect.x -= (dstRect.w / 2);
|
||||||
|
dstRect.y -= (dstRect.h / 2);
|
||||||
|
|
||||||
|
SDL_RenderCopyEx(app.renderer, texture, NULL, &dstRect, angle, NULL, SDL_FLIP_NONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void drawLine(int x1, int y1, int x2, int y2, int r, int g, int b, int a)
|
||||||
|
{
|
||||||
|
SDL_SetRenderDrawColor(app.renderer, r, g, b, a);
|
||||||
|
SDL_RenderDrawLine(app.renderer, x1, y1, x2, y2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void drawCircle(int cx, int cy, int radius, int r, int g, int b, int a)
|
||||||
|
{
|
||||||
|
int x = radius;
|
||||||
|
int y = 0;
|
||||||
|
int radiusError = 1 - x;
|
||||||
|
SDL_Point p[8];
|
||||||
|
|
||||||
|
SDL_SetRenderDrawColor(app.renderer, r, g, b, a);
|
||||||
|
SDL_SetRenderDrawBlendMode(app.renderer, SDL_BLENDMODE_BLEND);
|
||||||
|
|
||||||
|
while (x >= y)
|
||||||
|
{
|
||||||
|
p[0].x = x + cx; p[0].y = y + cy;
|
||||||
|
p[1].x = y + cx; p[1].y = x + cy;
|
||||||
|
p[2].x = -x + cx; p[2].y = y + cy;
|
||||||
|
p[3].x = -y + cx; p[3].y = x + cy;
|
||||||
|
p[4].x = -x + cx; p[4].y = -y + cy;
|
||||||
|
p[5].x = -y + cx; p[5].y = -x + cy;
|
||||||
|
p[6].x = x + cx; p[6].y = -y + cy;
|
||||||
|
p[7].x = y + cx; p[7].y = -x + cy;
|
||||||
|
SDL_RenderDrawPoints(app.renderer, p, 8);
|
||||||
|
|
||||||
|
y++;
|
||||||
|
|
||||||
|
if (radiusError < 0)
|
||||||
|
{
|
||||||
|
radiusError += 2 * y + 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
x--;
|
||||||
|
radiusError += 2 * (y - x) + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_SetRenderDrawBlendMode(app.renderer, SDL_BLENDMODE_NONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void drawRect(int x, int y, int w, int h, int r, int g, int b, int a)
|
||||||
|
{
|
||||||
|
SDL_Rect rect;
|
||||||
|
rect.x = x;
|
||||||
|
rect.y = y;
|
||||||
|
rect.w = w;
|
||||||
|
rect.h = h;
|
||||||
|
|
||||||
|
SDL_SetRenderDrawBlendMode(app.renderer, a < 255 ? SDL_BLENDMODE_BLEND : SDL_BLENDMODE_NONE);
|
||||||
|
SDL_SetRenderDrawColor(app.renderer, r, g, b, a);
|
||||||
|
SDL_RenderFillRect(app.renderer, &rect);
|
||||||
|
}
|
||||||
|
|
||||||
|
void drawOutlineRect(int x, int y, int w, int h, int r, int g, int b, int a)
|
||||||
|
{
|
||||||
|
SDL_Rect rect;
|
||||||
|
rect.x = x;
|
||||||
|
rect.y = y;
|
||||||
|
rect.w = w;
|
||||||
|
rect.h = h;
|
||||||
|
|
||||||
|
SDL_SetRenderDrawBlendMode(app.renderer, a < 255 ? SDL_BLENDMODE_BLEND : SDL_BLENDMODE_NONE);
|
||||||
|
SDL_SetRenderDrawColor(app.renderer, r, g, b, a);
|
||||||
|
SDL_RenderDrawRect(app.renderer, &rect);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void initColor(SDL_Color *c, int r, int g, int b)
|
||||||
|
{
|
||||||
|
memset(c, 0, sizeof(SDL_Color));
|
||||||
|
c->r = r;
|
||||||
|
c->g = g;
|
||||||
|
c->b = b;
|
||||||
|
c->a = 255;
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 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 "../common.h"
|
||||||
|
|
||||||
|
extern App app;
|
||||||
|
extern Colors colors;
|
|
@ -0,0 +1,108 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 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 "init.h"
|
||||||
|
|
||||||
|
void initSDL(void)
|
||||||
|
{
|
||||||
|
int rendererFlags, windowFlags;
|
||||||
|
|
||||||
|
/* done in src/plat/ */
|
||||||
|
createSaveFolder();
|
||||||
|
|
||||||
|
app.winWidth = SCREEN_WIDTH;
|
||||||
|
app.winHeight = SCREEN_HEIGHT;
|
||||||
|
|
||||||
|
rendererFlags = SDL_RENDERER_ACCELERATED|SDL_RENDERER_PRESENTVSYNC;
|
||||||
|
|
||||||
|
windowFlags = 0;
|
||||||
|
|
||||||
|
if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO) < 0)
|
||||||
|
{
|
||||||
|
printf("Couldn't initialize SDL: %s\n", SDL_GetError());
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 1024) == -1)
|
||||||
|
{
|
||||||
|
printf("Couldn't initialize SDL Mixer\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
Mix_AllocateChannels(CH_MAX);
|
||||||
|
|
||||||
|
app.window = SDL_CreateWindow("Blob Wars : Attrition", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, app.winWidth, app.winHeight, windowFlags);
|
||||||
|
|
||||||
|
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear");
|
||||||
|
|
||||||
|
app.renderer = SDL_CreateRenderer(app.window, -1, rendererFlags);
|
||||||
|
|
||||||
|
IMG_Init(IMG_INIT_PNG | IMG_INIT_JPG);
|
||||||
|
|
||||||
|
if (TTF_Init() < 0)
|
||||||
|
{
|
||||||
|
printf("Couldn't initialize SDL TTF: %s\n", SDL_GetError());
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void initGameSystem(void)
|
||||||
|
{
|
||||||
|
int i, numInitFuns;
|
||||||
|
void (*initFuncs[]) (void) = {
|
||||||
|
initLookups,
|
||||||
|
initGraphics,
|
||||||
|
initFonts
|
||||||
|
};
|
||||||
|
|
||||||
|
numInitFuns = sizeof(initFuncs) / sizeof(void*);
|
||||||
|
|
||||||
|
for (i = 0 ; i < numInitFuns ; i++)
|
||||||
|
{
|
||||||
|
/*showLoadingStep(i + 1, numInitFuns);*/
|
||||||
|
|
||||||
|
initFuncs[i]();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void cleanup(void)
|
||||||
|
{
|
||||||
|
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Cleaning up ...");
|
||||||
|
|
||||||
|
destroyLookups();
|
||||||
|
|
||||||
|
destroyFonts();
|
||||||
|
|
||||||
|
destroyTextures();
|
||||||
|
|
||||||
|
expireTexts(1);
|
||||||
|
|
||||||
|
destroyGame();
|
||||||
|
|
||||||
|
SDL_DestroyRenderer(app.renderer);
|
||||||
|
|
||||||
|
SDL_DestroyWindow(app.window);
|
||||||
|
|
||||||
|
TTF_Quit();
|
||||||
|
|
||||||
|
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Done.");
|
||||||
|
|
||||||
|
SDL_Quit();
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 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 "../common.h"
|
||||||
|
|
||||||
|
#include "SDL2/SDL_image.h"
|
||||||
|
#include "SDL2/SDL_mixer.h"
|
||||||
|
#include "SDL2/SDL_ttf.h"
|
||||||
|
|
||||||
|
extern void createSaveFolder(void);
|
||||||
|
extern void initLookups(void);
|
||||||
|
extern void initGraphics(void);
|
||||||
|
extern void initFonts(void);
|
||||||
|
extern void destroyLookups(void);
|
||||||
|
extern void destroyFonts(void);
|
||||||
|
extern void destroyTextures(void);
|
||||||
|
extern void expireTexts(int all);
|
||||||
|
extern void destroyGame(void);
|
||||||
|
|
||||||
|
extern App app;
|
|
@ -0,0 +1,159 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 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 "input.h"
|
||||||
|
|
||||||
|
static int mouseDownTimer;
|
||||||
|
static SDL_Point dragStart;
|
||||||
|
|
||||||
|
void initInput(void)
|
||||||
|
{
|
||||||
|
mouseDownTimer = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void doKeyDown(SDL_KeyboardEvent *event)
|
||||||
|
{
|
||||||
|
if (event->keysym.scancode >= 0 && event->keysym.scancode < MAX_KEYBOARD_KEYS && event->repeat == 0)
|
||||||
|
{
|
||||||
|
app.keyboard[event->keysym.scancode] = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void doKeyUp(SDL_KeyboardEvent *event)
|
||||||
|
{
|
||||||
|
if (event->keysym.scancode >= 0 && event->keysym.scancode < MAX_KEYBOARD_KEYS)
|
||||||
|
{
|
||||||
|
app.keyboard[event->keysym.scancode] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void doMouseDown(SDL_MouseButtonEvent *event)
|
||||||
|
{
|
||||||
|
if (event->button >= 0 && event->button < MAX_MOUSE_BUTTONS)
|
||||||
|
{
|
||||||
|
app.mouse.button[event->button] = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void doMouseUp(SDL_MouseButtonEvent *event)
|
||||||
|
{
|
||||||
|
if (event->button >= 0 && event->button < MAX_MOUSE_BUTTONS)
|
||||||
|
{
|
||||||
|
app.mouse.button[event->button] = 0;
|
||||||
|
|
||||||
|
if (event->button == SDL_BUTTON_LEFT)
|
||||||
|
{
|
||||||
|
app.mouse.dragging = 0;
|
||||||
|
|
||||||
|
mouseDownTimer = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Note: the following assumes that SDL_BUTTON_X1 and SDL_BUTTON_X2 are 4 and 5, respectively. They usually are.
|
||||||
|
*/
|
||||||
|
static void doMouseWheel(SDL_MouseWheelEvent *event)
|
||||||
|
{
|
||||||
|
if (event->y == -1)
|
||||||
|
{
|
||||||
|
app.mouse.button[SDL_BUTTON_X1] = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event->y == 1)
|
||||||
|
{
|
||||||
|
app.mouse.button[SDL_BUTTON_X2] = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void doMouseMotion(SDL_MouseMotionEvent *event)
|
||||||
|
{
|
||||||
|
if (event->state & SDL_BUTTON_LMASK)
|
||||||
|
{
|
||||||
|
if (++mouseDownTimer >= 4 && (abs(dragStart.x - event->x) >= MOUSE_DRAG_THRESHOLD || abs(dragStart.y - event->y) >= MOUSE_DRAG_THRESHOLD))
|
||||||
|
{
|
||||||
|
app.mouse.dx = event->xrel;
|
||||||
|
app.mouse.dy = event->yrel;
|
||||||
|
app.mouse.dragging = 1;
|
||||||
|
dragStart.x = event->x;
|
||||||
|
dragStart.y = event->y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mouseDownTimer = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void clearInput(void)
|
||||||
|
{
|
||||||
|
SDL_Event event;
|
||||||
|
|
||||||
|
memset(app.keyboard, 0, sizeof(int) * MAX_KEYBOARD_KEYS);
|
||||||
|
memset(&app.mouse, 0, sizeof(Mouse));
|
||||||
|
|
||||||
|
while (SDL_PollEvent(&event))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void handleInput(void)
|
||||||
|
{
|
||||||
|
SDL_Event event;
|
||||||
|
|
||||||
|
app.mouse.dx = 0;
|
||||||
|
app.mouse.dy = 0;
|
||||||
|
|
||||||
|
while (SDL_PollEvent(&event))
|
||||||
|
{
|
||||||
|
switch (event.type)
|
||||||
|
{
|
||||||
|
case SDL_MOUSEMOTION:
|
||||||
|
doMouseMotion(&event.motion);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SDL_MOUSEWHEEL:
|
||||||
|
doMouseWheel(&event.wheel);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SDL_MOUSEBUTTONDOWN:
|
||||||
|
doMouseDown(&event.button);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SDL_MOUSEBUTTONUP:
|
||||||
|
doMouseUp(&event.button);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SDL_KEYDOWN:
|
||||||
|
doKeyDown(&event.key);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SDL_KEYUP:
|
||||||
|
doKeyUp(&event.key);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SDL_QUIT:
|
||||||
|
exit(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_GetMouseState(&app.mouse.x, &app.mouse.y);
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 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.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define MOUSE_DRAG_THRESHOLD 4
|
||||||
|
|
||||||
|
#include "../common.h"
|
||||||
|
|
||||||
|
extern App app;
|
|
@ -0,0 +1,163 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 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 "io.h"
|
||||||
|
|
||||||
|
static int stringComparator(const void *a, const void *b);
|
||||||
|
|
||||||
|
int fileExists(const char *filename)
|
||||||
|
{
|
||||||
|
struct stat buffer;
|
||||||
|
|
||||||
|
return (stat(filename, &buffer) == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *getFileLocation(const char *filename)
|
||||||
|
{
|
||||||
|
static char path[MAX_FILENAME_LENGTH];
|
||||||
|
memset(path, '\0', MAX_FILENAME_LENGTH);
|
||||||
|
|
||||||
|
if (fileExists(filename))
|
||||||
|
{
|
||||||
|
return filename;
|
||||||
|
}
|
||||||
|
|
||||||
|
sprintf(path, DATA_DIR"/%s", filename);
|
||||||
|
|
||||||
|
if (!fileExists(path))
|
||||||
|
{
|
||||||
|
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_CRITICAL, "No such file '%s'", path);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *readFile(const char *filename)
|
||||||
|
{
|
||||||
|
char *buffer = 0;
|
||||||
|
unsigned long length;
|
||||||
|
FILE *file = fopen(getFileLocation(filename), "rb");
|
||||||
|
|
||||||
|
if (file)
|
||||||
|
{
|
||||||
|
fseek(file, 0, SEEK_END);
|
||||||
|
length = ftell(file);
|
||||||
|
fseek(file, 0, SEEK_SET);
|
||||||
|
|
||||||
|
buffer = malloc(length + 1);
|
||||||
|
memset(buffer, 0, length + 1);
|
||||||
|
fread(buffer, 1, length, file);
|
||||||
|
|
||||||
|
fclose(file);
|
||||||
|
|
||||||
|
buffer[length] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
int writeFile(const char *filename, const char *data)
|
||||||
|
{
|
||||||
|
FILE *file = fopen(filename, "wb");
|
||||||
|
|
||||||
|
if (file)
|
||||||
|
{
|
||||||
|
fprintf(file, "%s\n", data);
|
||||||
|
fclose(file);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *getSaveFilePath(const char *filename)
|
||||||
|
{
|
||||||
|
static char path[MAX_FILENAME_LENGTH];
|
||||||
|
memset(path, '\0', MAX_FILENAME_LENGTH);
|
||||||
|
|
||||||
|
sprintf(path, "%s/%s", app.saveDir, filename);
|
||||||
|
|
||||||
|
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_DEBUG, "getSaveFilePath = '%s'", path);
|
||||||
|
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
|
char **getFileList(const char *dir, int *count)
|
||||||
|
{
|
||||||
|
DIR *d;
|
||||||
|
int i;
|
||||||
|
struct dirent *ent;
|
||||||
|
char **filenames;
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
filenames = NULL;
|
||||||
|
|
||||||
|
if ((d = opendir(getFileLocation(dir))) != NULL)
|
||||||
|
{
|
||||||
|
while ((ent = readdir(d)) != NULL)
|
||||||
|
{
|
||||||
|
if (ent->d_name[0] != '.')
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i > 0)
|
||||||
|
{
|
||||||
|
filenames = malloc(sizeof(char*) * i);
|
||||||
|
memset(filenames, 0, sizeof(char*) * i);
|
||||||
|
|
||||||
|
rewinddir(d);
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
|
||||||
|
while ((ent = readdir(d)) != NULL)
|
||||||
|
{
|
||||||
|
if (ent->d_name[0] != '.')
|
||||||
|
{
|
||||||
|
filenames[i] = malloc(sizeof(char) * MAX_FILENAME_LENGTH);
|
||||||
|
|
||||||
|
STRNCPY(filenames[i], ent->d_name, MAX_FILENAME_LENGTH);
|
||||||
|
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
closedir(d);
|
||||||
|
}
|
||||||
|
|
||||||
|
*count = i;
|
||||||
|
|
||||||
|
if (filenames)
|
||||||
|
{
|
||||||
|
qsort(filenames, i, sizeof(char*), stringComparator);
|
||||||
|
}
|
||||||
|
|
||||||
|
return filenames;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int stringComparator(const void *a, const void *b)
|
||||||
|
{
|
||||||
|
char **s1 = (char **)a;
|
||||||
|
char **s2 = (char **)b;
|
||||||
|
return strcmp(*s1, *s2);
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 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 "../common.h"
|
||||||
|
|
||||||
|
#include "sys/stat.h"
|
||||||
|
#include "dirent.h"
|
||||||
|
|
||||||
|
extern App app;
|
|
@ -0,0 +1,147 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 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 "lookup.h"
|
||||||
|
|
||||||
|
static Lookup head;
|
||||||
|
static Lookup *tail;
|
||||||
|
|
||||||
|
static void addLookup(const char *name, long value);
|
||||||
|
|
||||||
|
void initLookups(void)
|
||||||
|
{
|
||||||
|
memset(&head, 0, sizeof(Lookup));
|
||||||
|
tail = &head;
|
||||||
|
|
||||||
|
addLookup("DUMMY", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void addLookup(const char *name, long value)
|
||||||
|
{
|
||||||
|
Lookup *lookup = malloc(sizeof(Lookup));
|
||||||
|
memset(lookup, 0, sizeof(Lookup));
|
||||||
|
|
||||||
|
STRNCPY(lookup->name, name, MAX_NAME_LENGTH);
|
||||||
|
lookup->value = value;
|
||||||
|
|
||||||
|
tail->next = lookup;
|
||||||
|
tail = lookup;
|
||||||
|
}
|
||||||
|
|
||||||
|
long lookup(const char *name)
|
||||||
|
{
|
||||||
|
Lookup *l;
|
||||||
|
|
||||||
|
for (l = head.next ; l != NULL ; l = l->next)
|
||||||
|
{
|
||||||
|
if (strcmp(l->name, name) == 0)
|
||||||
|
{
|
||||||
|
return l->value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_ERROR, "No such lookup value '%s'", name);
|
||||||
|
exit(1);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *getLookupName(const char *prefix, long num)
|
||||||
|
{
|
||||||
|
Lookup *l;
|
||||||
|
|
||||||
|
for (l = head.next ; l != NULL ; l = l->next)
|
||||||
|
{
|
||||||
|
if (l->value == num && strncmp(prefix, l->name, strlen(prefix)) == 0)
|
||||||
|
{
|
||||||
|
return l->name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_ERROR, "No such lookup value %ld, prefix=%s", num, prefix);
|
||||||
|
exit(1);
|
||||||
|
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *getFlagValues(const char *prefix, long flags)
|
||||||
|
{
|
||||||
|
static char flagStr[MAX_DESCRIPTION_LENGTH];
|
||||||
|
int requirePlus;
|
||||||
|
Lookup *l;
|
||||||
|
|
||||||
|
memset(flagStr, '\0', MAX_DESCRIPTION_LENGTH);
|
||||||
|
|
||||||
|
requirePlus = 0;
|
||||||
|
|
||||||
|
for (l = head.next ; l != NULL ; l = l->next)
|
||||||
|
{
|
||||||
|
if (flags & l->value && strncmp(prefix, l->name, strlen(prefix)) == 0)
|
||||||
|
{
|
||||||
|
if (requirePlus)
|
||||||
|
{
|
||||||
|
strcat(flagStr, "+");
|
||||||
|
}
|
||||||
|
|
||||||
|
strcat(flagStr, l->name);
|
||||||
|
|
||||||
|
requirePlus = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return flagStr;
|
||||||
|
}
|
||||||
|
|
||||||
|
long flagsToLong(const char *in)
|
||||||
|
{
|
||||||
|
char *flag, *flags;
|
||||||
|
long total;
|
||||||
|
|
||||||
|
total = 0;
|
||||||
|
|
||||||
|
if (strlen(in) > 0)
|
||||||
|
{
|
||||||
|
flags = malloc(strlen(in) + 1);
|
||||||
|
STRNCPY(flags, in, strlen(in) + 1);
|
||||||
|
|
||||||
|
flag = strtok(flags, "+");
|
||||||
|
while (flag)
|
||||||
|
{
|
||||||
|
total += lookup(flag);
|
||||||
|
flag = strtok(NULL, "+");
|
||||||
|
}
|
||||||
|
|
||||||
|
free(flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
return total;
|
||||||
|
}
|
||||||
|
|
||||||
|
void destroyLookups(void)
|
||||||
|
{
|
||||||
|
Lookup *l;
|
||||||
|
|
||||||
|
while (head.next)
|
||||||
|
{
|
||||||
|
l = head.next;
|
||||||
|
head.next = l->next;
|
||||||
|
free(l);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 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 "../common.h"
|
||||||
|
|
||||||
|
long flagsToLong(const char *in);
|
|
@ -0,0 +1,314 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 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 "text.h"
|
||||||
|
|
||||||
|
static void loadFont(int size);
|
||||||
|
static SDL_Texture *getCachedText(unsigned long hash);
|
||||||
|
static void cacheText(unsigned long hash, SDL_Texture *t);
|
||||||
|
static void drawTextNormal(int x, int y, int size, int align, SDL_Color c, const char *text);
|
||||||
|
static void drawTextSplit(int x, int y, int size, int align, SDL_Color c, char *text);
|
||||||
|
void textSize(const char *text, int size, int *w, int *h);
|
||||||
|
|
||||||
|
static char drawTextBuffer[MAX_LINE_LENGTH];
|
||||||
|
static TTF_Font *font[MAX_FONTS];
|
||||||
|
static Texture textures[NUM_TEXT_BUCKETS];
|
||||||
|
static int maxWidth = 0;
|
||||||
|
static int cacheSize = 0;
|
||||||
|
static int textShadow = 1;
|
||||||
|
static SDL_Color textShadowColor;
|
||||||
|
|
||||||
|
void initFonts(void)
|
||||||
|
{
|
||||||
|
memset(&font, 0, sizeof(TTF_Font*) * MAX_FONTS);
|
||||||
|
memset(&textures, 0, sizeof(Texture) * NUM_TEXT_BUCKETS);
|
||||||
|
}
|
||||||
|
|
||||||
|
void drawText(int x, int y, int size, int align, SDL_Color c, const char *format, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
|
||||||
|
memset(&drawTextBuffer, '\0', sizeof(drawTextBuffer));
|
||||||
|
|
||||||
|
va_start(args, format);
|
||||||
|
vsprintf(drawTextBuffer, format, args);
|
||||||
|
va_end(args);
|
||||||
|
|
||||||
|
if (maxWidth == 0)
|
||||||
|
{
|
||||||
|
drawTextNormal(x, y, size, align, c, drawTextBuffer);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
drawTextSplit(x, y, size, align, c, drawTextBuffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void drawTextNormal(int x, int y, int size, int align, SDL_Color c, const char *text)
|
||||||
|
{
|
||||||
|
SDL_Surface *surface;
|
||||||
|
SDL_Texture *t;
|
||||||
|
int w, h;
|
||||||
|
long hash;
|
||||||
|
|
||||||
|
if (size >= MAX_FONTS)
|
||||||
|
{
|
||||||
|
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_CRITICAL, "ERROR: %d exceeds max font size index of %d\n", size, MAX_FONTS);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!font[size])
|
||||||
|
{
|
||||||
|
loadFont(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
hash = hashcode(text) + size;
|
||||||
|
|
||||||
|
t = getCachedText(hash);
|
||||||
|
|
||||||
|
if (!t)
|
||||||
|
{
|
||||||
|
surface = TTF_RenderText_Blended(font[size], text, colors.white);
|
||||||
|
t = SDL_CreateTextureFromSurface(app.renderer, surface);
|
||||||
|
SDL_FreeSurface(surface);
|
||||||
|
|
||||||
|
cacheText(hash, t);
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_QueryTexture(t, NULL, NULL, &w, &h);
|
||||||
|
|
||||||
|
if (align == TA_CENTER)
|
||||||
|
{
|
||||||
|
x -= (w / 2);
|
||||||
|
}
|
||||||
|
else if (align == TA_RIGHT)
|
||||||
|
{
|
||||||
|
x -= w;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (textShadow)
|
||||||
|
{
|
||||||
|
SDL_SetTextureColorMod(t, textShadowColor.r, textShadowColor.g, textShadowColor.b);
|
||||||
|
|
||||||
|
blit(t, x + 1, y + 1, 0);
|
||||||
|
blit(t, x + 2, y + 2, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_SetTextureColorMod(t, c.r, c.g, c.b);
|
||||||
|
|
||||||
|
blit(t, x, y, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void drawTextSplit(int x, int y, int size, int align, SDL_Color c, char *text)
|
||||||
|
{
|
||||||
|
char drawTextBuffer[MAX_DESCRIPTION_LENGTH];
|
||||||
|
char *token;
|
||||||
|
int w, h, currentWidth;
|
||||||
|
|
||||||
|
memset(&drawTextBuffer, '\0', sizeof(drawTextBuffer));
|
||||||
|
|
||||||
|
token = strtok(text, " ");
|
||||||
|
|
||||||
|
currentWidth = 0;
|
||||||
|
|
||||||
|
while (token)
|
||||||
|
{
|
||||||
|
textSize(token, size, &w, &h);
|
||||||
|
|
||||||
|
if (currentWidth + w > maxWidth)
|
||||||
|
{
|
||||||
|
drawTextNormal(x, y, size, align, c, drawTextBuffer);
|
||||||
|
|
||||||
|
currentWidth = 0;
|
||||||
|
y += h;
|
||||||
|
memset(&drawTextBuffer, '\0', sizeof(drawTextBuffer));
|
||||||
|
}
|
||||||
|
|
||||||
|
strcat(drawTextBuffer, token);
|
||||||
|
strcat(drawTextBuffer, " ");
|
||||||
|
|
||||||
|
currentWidth += w;
|
||||||
|
|
||||||
|
token = strtok(NULL, " ");
|
||||||
|
}
|
||||||
|
|
||||||
|
drawTextNormal(x, y, size, align, c, drawTextBuffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
int getWrappedTextHeight(const char *text, int size)
|
||||||
|
{
|
||||||
|
char textBuffer[MAX_DESCRIPTION_LENGTH];
|
||||||
|
char *token;
|
||||||
|
int w, h, currentWidth;
|
||||||
|
int y;
|
||||||
|
|
||||||
|
STRNCPY(textBuffer, text, MAX_DESCRIPTION_LENGTH);
|
||||||
|
|
||||||
|
token = strtok(textBuffer, " ");
|
||||||
|
|
||||||
|
y = 0;
|
||||||
|
currentWidth = 0;
|
||||||
|
|
||||||
|
while (token)
|
||||||
|
{
|
||||||
|
textSize(token, size, &w, &h);
|
||||||
|
|
||||||
|
if (currentWidth + w > maxWidth)
|
||||||
|
{
|
||||||
|
currentWidth = 0;
|
||||||
|
y += h;
|
||||||
|
}
|
||||||
|
|
||||||
|
currentWidth += w;
|
||||||
|
|
||||||
|
token = strtok(NULL, " ");
|
||||||
|
}
|
||||||
|
|
||||||
|
return y + h;
|
||||||
|
}
|
||||||
|
|
||||||
|
void textSize(const char *text, int size, int *w, int *h)
|
||||||
|
{
|
||||||
|
if (!font[size])
|
||||||
|
{
|
||||||
|
loadFont(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
TTF_SizeText(font[size], text, w, h);
|
||||||
|
}
|
||||||
|
|
||||||
|
void limitTextWidth(int width)
|
||||||
|
{
|
||||||
|
maxWidth = width;
|
||||||
|
}
|
||||||
|
|
||||||
|
void useTextShadow(int enable, int r, int g, int b)
|
||||||
|
{
|
||||||
|
textShadow = 1;
|
||||||
|
textShadowColor.r = r;
|
||||||
|
textShadowColor.g = g;
|
||||||
|
textShadowColor.b = b;
|
||||||
|
}
|
||||||
|
|
||||||
|
static SDL_Texture *getCachedText(unsigned long hash)
|
||||||
|
{
|
||||||
|
Texture *t;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
i = hash % NUM_TEXT_BUCKETS;
|
||||||
|
|
||||||
|
t = textures[i].next;
|
||||||
|
|
||||||
|
for (t = textures[i].next ; t != NULL ; t = t->next)
|
||||||
|
{
|
||||||
|
if (t->hash == hash)
|
||||||
|
{
|
||||||
|
t->ttl = SDL_GetTicks() + TEXT_TTL;
|
||||||
|
return t->texture;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cacheText(unsigned long hash, SDL_Texture *texture)
|
||||||
|
{
|
||||||
|
Texture *t, *new;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
i = hash % NUM_TEXT_BUCKETS;
|
||||||
|
|
||||||
|
t = &textures[i];
|
||||||
|
|
||||||
|
/* horrible bit to find the tail */
|
||||||
|
while (t->next)
|
||||||
|
{
|
||||||
|
t = t->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
new = malloc(sizeof(Texture));
|
||||||
|
memset(new, 0, sizeof(Texture));
|
||||||
|
|
||||||
|
new->hash = hash;
|
||||||
|
new->texture = texture;
|
||||||
|
new->ttl = SDL_GetTicks() + TEXT_TTL;
|
||||||
|
|
||||||
|
t->next = new;
|
||||||
|
|
||||||
|
cacheSize++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void expireTexts(int all)
|
||||||
|
{
|
||||||
|
Texture *t, *prev;
|
||||||
|
int i, n;
|
||||||
|
long now;
|
||||||
|
|
||||||
|
n = 0;
|
||||||
|
now = SDL_GetTicks();
|
||||||
|
|
||||||
|
for (i = 0 ; i < NUM_TEXT_BUCKETS ; i++)
|
||||||
|
{
|
||||||
|
prev = &textures[i];
|
||||||
|
|
||||||
|
for (t = textures[i].next ; t != NULL ; t = t->next)
|
||||||
|
{
|
||||||
|
if (t->ttl <= now || all)
|
||||||
|
{
|
||||||
|
prev->next = t->next;
|
||||||
|
SDL_DestroyTexture(t->texture);
|
||||||
|
free(t);
|
||||||
|
|
||||||
|
cacheSize--;
|
||||||
|
|
||||||
|
n++;
|
||||||
|
|
||||||
|
t = prev;
|
||||||
|
}
|
||||||
|
|
||||||
|
prev = t;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (n > 0)
|
||||||
|
{
|
||||||
|
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_DEBUG, "Expired %d texts", n);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void loadFont(int size)
|
||||||
|
{
|
||||||
|
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "loadFonts(%d)", size);
|
||||||
|
|
||||||
|
font[size] = TTF_OpenFont(getFileLocation("data/fonts/LiberationMono-Regular.ttf"), size);
|
||||||
|
}
|
||||||
|
|
||||||
|
void destroyFonts(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0 ; i < MAX_FONTS ; i++)
|
||||||
|
{
|
||||||
|
if (font[i])
|
||||||
|
{
|
||||||
|
TTF_CloseFont(font[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,30 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 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 "../common.h"
|
||||||
|
|
||||||
|
#include "SDL2/SDL_ttf.h"
|
||||||
|
|
||||||
|
extern void blit(SDL_Texture *texture, int x, int y, int centered);
|
||||||
|
extern char *getFileLocation(const char *filename);
|
||||||
|
extern unsigned long hashcode(const char *str);
|
||||||
|
|
||||||
|
extern App app;
|
||||||
|
extern Colors colors;
|
|
@ -0,0 +1,111 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 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 "textures.h"
|
||||||
|
|
||||||
|
static Texture textures[NUM_TEXTURE_BUCKETS];
|
||||||
|
|
||||||
|
static Texture *addTextureToCache(const char *name, SDL_Texture *texture);
|
||||||
|
Texture *getTexture(const char *name);
|
||||||
|
|
||||||
|
void initTextures(void)
|
||||||
|
{
|
||||||
|
memset(&textures, 0, sizeof(Texture) * NUM_TEXTURE_BUCKETS);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Texture *addTextureToCache(const char *name, SDL_Texture *texture)
|
||||||
|
{
|
||||||
|
Texture *t, *new;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
i = hashcode(name) % NUM_TEXTURE_BUCKETS;
|
||||||
|
|
||||||
|
t = &textures[i];
|
||||||
|
|
||||||
|
/* horrible bit to look for the tail */
|
||||||
|
while (t->next)
|
||||||
|
{
|
||||||
|
t = t->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
new = malloc(sizeof(Texture));
|
||||||
|
memset(new, 0, sizeof(Texture));
|
||||||
|
|
||||||
|
STRNCPY(new->name, name, MAX_DESCRIPTION_LENGTH);
|
||||||
|
new->texture = texture;
|
||||||
|
|
||||||
|
t->next = new;
|
||||||
|
|
||||||
|
return new;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Texture *loadTexture(const char *filename)
|
||||||
|
{
|
||||||
|
SDL_Texture *texture;
|
||||||
|
|
||||||
|
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Loading %s", filename);
|
||||||
|
|
||||||
|
texture = IMG_LoadTexture(app.renderer, getFileLocation(filename));
|
||||||
|
|
||||||
|
return addTextureToCache(filename, texture);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Texture *getTexture(const char *filename)
|
||||||
|
{
|
||||||
|
Texture *t;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
i = hashcode(filename) % NUM_TEXTURE_BUCKETS;
|
||||||
|
|
||||||
|
/* check if the texture is already loaded */
|
||||||
|
for (t = textures[i].next ; t != NULL ; t = t->next)
|
||||||
|
{
|
||||||
|
if (strcmp(t->name, filename) == 0)
|
||||||
|
{
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_DEBUG, "%s not in texture cache", filename);
|
||||||
|
|
||||||
|
return loadTexture(filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
void destroyTextures(void)
|
||||||
|
{
|
||||||
|
Texture *t, *next;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0 ; i < NUM_TEXTURE_BUCKETS ; i++)
|
||||||
|
{
|
||||||
|
t = textures[i].next;
|
||||||
|
|
||||||
|
while (t)
|
||||||
|
{
|
||||||
|
next = t->next;
|
||||||
|
SDL_DestroyTexture(t->texture);
|
||||||
|
free(t);
|
||||||
|
t = next;
|
||||||
|
}
|
||||||
|
|
||||||
|
textures[i].next = NULL;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 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 "../common.h"
|
||||||
|
|
||||||
|
#include "SDL2/SDL_image.h"
|
||||||
|
|
||||||
|
extern char *getFileLocation(const char *filename);
|
||||||
|
extern unsigned long hashcode(const char *str);
|
||||||
|
|
||||||
|
extern App app;
|
|
@ -0,0 +1,82 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 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 "maths.h"
|
||||||
|
|
||||||
|
int mod(int n, int x)
|
||||||
|
{
|
||||||
|
return ((n % x) + x) % x;
|
||||||
|
}
|
||||||
|
|
||||||
|
int rrnd(int low, int high)
|
||||||
|
{
|
||||||
|
return low + rand() % ((high - low) + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int getPercent(float current, float total)
|
||||||
|
{
|
||||||
|
return (current / total) * 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
int getDistance(int x1, int y1, int x2, int y2)
|
||||||
|
{
|
||||||
|
int x, y;
|
||||||
|
|
||||||
|
x = x2 - x1;
|
||||||
|
y = y2 - y1;
|
||||||
|
|
||||||
|
return sqrt(x * x + y *y);
|
||||||
|
}
|
||||||
|
|
||||||
|
void getSlope(int x1, int y1, int x2, int y2, float *dx, float *dy)
|
||||||
|
{
|
||||||
|
int steps = MAX(abs(x1 - x2), abs(y1 - y2));
|
||||||
|
|
||||||
|
if (steps == 0)
|
||||||
|
{
|
||||||
|
*dx = *dy = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
*dx = (x1 - x2);
|
||||||
|
*dx /= steps;
|
||||||
|
|
||||||
|
*dy = (y1 - y2);
|
||||||
|
*dy /= steps;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long hashcode(const char *str)
|
||||||
|
{
|
||||||
|
unsigned long hash = 5381;
|
||||||
|
int c;
|
||||||
|
|
||||||
|
c = *str;
|
||||||
|
|
||||||
|
while (c)
|
||||||
|
{
|
||||||
|
hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
|
||||||
|
|
||||||
|
c = *str++;
|
||||||
|
}
|
||||||
|
|
||||||
|
hash = ((hash << 5) + hash);
|
||||||
|
|
||||||
|
return hash;
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 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 "../common.h"
|
||||||
|
|
|
@ -0,0 +1,49 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 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 "util.h"
|
||||||
|
|
||||||
|
int collision(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2)
|
||||||
|
{
|
||||||
|
return (MAX(x1, x2) < MIN(x1 + w1, x2 + w2)) && (MAX(y1, y2) < MIN(y1 + h1, y2 + h2));
|
||||||
|
}
|
||||||
|
|
||||||
|
char *timeToString(long millis, int showHours)
|
||||||
|
{
|
||||||
|
static char TIME[MAX_NAME_LENGTH];
|
||||||
|
|
||||||
|
int hours, minutes, seconds;
|
||||||
|
|
||||||
|
seconds = millis / FPS;
|
||||||
|
minutes = (seconds / FPS) % 60;
|
||||||
|
hours = seconds / (FPS * FPS);
|
||||||
|
seconds %= 60;
|
||||||
|
|
||||||
|
if (showHours)
|
||||||
|
{
|
||||||
|
sprintf(TIME, "%dh %02dm %02ds", hours, minutes, seconds);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sprintf(TIME, "%dm %02ds", minutes, seconds);
|
||||||
|
}
|
||||||
|
|
||||||
|
return TIME;
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 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 "../common.h"
|
||||||
|
|
Loading…
Reference in New Issue