diff --git a/common/makefile b/common/makefile index 12d7825..802915c 100644 --- a/common/makefile +++ b/common/makefile @@ -1,12 +1,10 @@ #output -export OUTDIR=.. +export OUTDIR=../.. export OUT=$(addprefix $(OUTDIR)/,libcommon.a) all: $(OUTDIR) $(MAKE) -C debugging - $(MAKE) -C gameplay - $(MAKE) -C graphics - $(MAKE) -C map + $(MAKE) -C global_defines $(MAKE) -C network $(MAKE) -C utilities diff --git a/common/network/makefile b/common/network/makefile index 3bcac3d..6d8fa02 100644 --- a/common/network/makefile +++ b/common/network/makefile @@ -1,5 +1,5 @@ #config -INCLUDES+=. packet_types ../gameplay ../map ../utilities +INCLUDES+=. packet_types ../global_defines ../utilities ../../TurtleMap LIBS+= CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) diff --git a/common/network/packet_types/makefile b/common/network/packet_types/makefile index e6aff0a..a4a8a85 100644 --- a/common/network/packet_types/makefile +++ b/common/network/packet_types/makefile @@ -1,5 +1,5 @@ #config -INCLUDES+=. .. ../../gameplay ../../map ../../utilities +INCLUDES+=. .. ../../global_defines ../../utilities ../../../TurtleMap LIBS+= CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) diff --git a/common/utilities/bounding_box.hpp b/common/utilities/bounding_box.hpp new file mode 100644 index 0000000..06747b0 --- /dev/null +++ b/common/utilities/bounding_box.hpp @@ -0,0 +1,75 @@ +/* Copyright: (c) Kayne Ruse 2013-2016 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#pragma once + +#include +#include + +class BoundingBox { +public: + //This is explicitly a POD + int x, y; + int w, h; + + BoundingBox() = default; + BoundingBox(int i, int j): x(i), y(j), w(0), h(0) {}; + BoundingBox(int i, int j, int k, int l): x(i), y(j), w(k), h(l) {}; + ~BoundingBox() = default; + BoundingBox& operator=(BoundingBox const&) = default; + + int Size() { + return std::max(w*h,0); + } + + bool CheckOverlap(BoundingBox rhs) { + return !( + x >= rhs.x + rhs.w || + y >= rhs.y + rhs.h || + rhs.x >= x + w || + rhs.y >= y + h); + } + + BoundingBox CalcOverlap(BoundingBox rhs) { + if (!CheckOverlap(rhs)) { + return {0, 0, 0, 0}; + } + BoundingBox ret; + ret.x = std::max(x, rhs.x); + ret.y = std::max(y, rhs.y); + ret.w = std::min(x+w, rhs.x+rhs.w) - ret.x; + ret.h = std::min(y+h, rhs.y+rhs.h) - ret.y; + return ret; + } +}; + +//This is explicitly a POD +static_assert(std::is_pod::value, "BoundingBox is not a POD"); + +#include "vector2.hpp" + +//operators +inline BoundingBox operator+(BoundingBox b, Vector2 v) { + return {b.x + (int)v.x, b.y + (int)v.y, b.w, b.h}; +} +inline BoundingBox operator+(Vector2 v, BoundingBox b) { + return b + v; +} diff --git a/common/utilities/vector2.hpp b/common/utilities/vector2.hpp new file mode 100644 index 0000000..ad0b17f --- /dev/null +++ b/common/utilities/vector2.hpp @@ -0,0 +1,111 @@ +/* Copyright: (c) Kayne Ruse 2013-2016 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#pragma once + +#include +#include +#include + +class Vector2 { +public: + double x, y; + + Vector2() = default; + Vector2(double i, double j): x(i), y(j) {}; + ~Vector2() = default; + Vector2& operator=(Vector2 const&) = default; + + double Length() const { + return sqrt(x*x+y*y); + } + double SquaredLength() const { + return x*x+y*y; + } + void Normalize() { + double l = Length(); + if (l == 0) + throw(std::domain_error("Divide by zero")); + x /= l; + y /= l; + } + + //Arithmetic operators + Vector2 operator+(Vector2 v) const { + Vector2 ret; + ret.x = x + v.x; + ret.y = y + v.y; + return ret; + } + Vector2 operator-(Vector2 v) const { + Vector2 ret; + ret.x = x - v.x; + ret.y = y - v.y; + return ret; + } + Vector2 operator*(Vector2 v) const { + Vector2 ret; + ret.x = x * v.x; + ret.y = y * v.y; + return ret; + } + Vector2 operator*(double d) const { + Vector2 ret; + ret.x = x * d; + ret.y = y * d; + return ret; + } + + Vector2 operator/(Vector2 v) { + if (!v.x || !v.y) + throw(std::domain_error("Divide by zero")); + Vector2 ret; + ret.x = x / v.x; + ret.y = y / v.y; + return ret; + } + Vector2 operator/(double d) { + if (!d) + throw(std::domain_error("Divide by zero")); + Vector2 ret; + ret.x = x / d; + ret.y = y / d; + return ret; + } + + //unary operators + Vector2 operator-() { return {-x, -y}; } + + //comparison operators + bool operator==(Vector2 v) { return (x == v.x && y == v.y); } + bool operator!=(Vector2 v) { return (x != v.x || y != v.y); } + + //member templates (curry the above operators) + template Vector2 operator+=(T t) { return *this = *this + t; } + template Vector2 operator-=(T t) { return *this = *this - t; } + template Vector2 operator*=(T t) { return *this = *this * t; } + template Vector2 operator/=(T t) { return *this = *this / t; } + template bool operator==(T t) { return (x == t && y == t); } + template bool operator!=(T t) { return (x != t || y != t); } +}; + +//This is explicitly a POD +static_assert(std::is_pod::value, "Vector2 is not a POD"); diff --git a/makefile b/makefile index d4eefa6..8a569a6 100644 --- a/makefile +++ b/makefile @@ -7,10 +7,12 @@ OUTDIR=out BINDIR=bin -all: $(OUTDIR) binary +all: $(OUTDIR) dll + $(MAKE) -C TurtleGUI + $(MAKE) -C TurtleMap $(MAKE) -C common - $(MAKE) -C server - $(MAKE) -C client +# $(MAKE) -C server +# $(MAKE) -C client debug: export CXXFLAGS+=-g debug: clean all @@ -27,7 +29,7 @@ else ifeq ($(shell uname), Linux) tar -C $(OUTDIR) -zcvf Tortuga-linux.tar client server ../rsc ../copyright.txt ../instructions.txt endif -binary: $(OUTDIR) +dll: $(OUTDIR) ifeq ($(OS),Windows_NT) xcopy /Y $(BINDIR)\\*.dll $(OUTDIR) endif