[Add] Commiting project. [Dead project].

This commit is contained in:
Rtch90 2013-06-13 19:43:06 +01:00
parent 6771381ec1
commit 8e18248730
208 changed files with 68560 additions and 4 deletions

1661
Doxyfile Normal file

File diff suppressed because it is too large Load Diff

33
Lephisto.log Normal file
View File

@ -0,0 +1,33 @@
Log Started: Sun Nov 4 22:08:00 2012
Warning: Failed to open file (line 0) Using defaults
Configuration:
Resolution: 640 x 480
Fullscreen: false
Use VBOs: false
Enable SDL Parachute: true
Compress Textures: true
Got video info
Video mode set
Extensions verified
Audio initialised
Current state pointer set
Font lists generated
Warning: Could not load ./data/font.png
Font texture loaded
Font texture bound
Fonts built
Warning: Could not load ./data/title.png
Warning: Could not load ./data/background.png
MainMenu initialised
Main menu created
And Suddenly! Out of the depths of hell came LEPHISTO!
MainMenu deleted
Audio shutdown
SDL shutdown
Shutdown sucessful
Log Closed: Sun Nov 4 22:08:05 2012

217
Lephisto.pro Normal file
View File

@ -0,0 +1,217 @@
QT -= core \
gui
DESTDIR = build
OBJECTS_DIR = src
TARGET = Lephisto
LIBS += -lGL \
-lGLU \
-lSDL \
-lSDL_image
CONFIG += warn_on \
x11 \
opengl
SOURCES += src/Camera.cpp \
src/City.cpp \
src/CityManager.cpp \
src/collisions.cpp \
src/Config.cpp \
src/EnvironmentObject.cpp \
src/extensions.cpp \
src/font.cpp \
src/Frustum.cpp \
src/GameState.cpp \
src/image.cpp \
src/Log.cpp \
src/main.cpp \
src/MainMenu.cpp \
src/Map.cpp \
src/normals.cpp \
src/Ocean.cpp \
src/Player.cpp \
src/Point.cpp \
src/QuadBox.cpp \
src/QuadNode.cpp \
src/StateCity.cpp \
src/StateSailing.cpp \
src/Terrain.cpp \
src/tinyxmlparser.cpp \
src/tinyxmlerror.cpp \
src/tinyxml.cpp \
src/tinystr.cpp \
src/Wave.cpp \
src/WaveEmitter.cpp \
src/BoundBox.cpp \
src/Model.cpp \
src/Product.cpp \
src/Economy.cpp \
src/CityEconomy.cpp \
src/SkyBox.cpp \
src/Menu.cpp \
src/StateBattle.cpp \
src/Ships.cpp \
src/WaveEmitter.cpp \
src/Wave.cpp \
src/tinyxmlparser.cpp \
src/tinyxmlerror.cpp \
src/tinyxml.cpp \
src/tinystr.cpp \
src/Terrain.cpp \
src/StateSailing.cpp \
src/StateCity.cpp \
src/StateBattle.cpp \
src/sound.cpp \
src/SkyBox.cpp \
src/Ships.cpp \
src/QuadNode.cpp \
src/QuadBox.cpp \
src/Product.cpp \
src/Point.cpp \
src/Player.cpp \
src/Ocean.cpp \
src/normals.cpp \
src/Model.cpp \
src/Menu.cpp \
src/Map.cpp \
src/MainMenu.cpp \
src/main.cpp \
src/Log.cpp \
src/image.cpp \
src/GameState.cpp \
src/Frustum.cpp \
src/font.cpp \
src/extensions.cpp \
src/EnvironmentObject.cpp \
src/Economy.cpp \
src/Config.cpp \
src/collisions.cpp \
src/CityManager.cpp \
src/CityEconomy.cpp \
src/City.cpp \
src/Camera.cpp \
src/BoundBox.cpp \
src/sound.cpp \
src/Menu/MenuContainer.cpp \
src/Menu/DataContainer.cpp \
src/Menu/Button.cpp \
src/StateBattle/Bullet.cpp \
src/SoundStream.cpp \
src/Cargo.cpp
HEADERS += src/Camera.h \
src/ccmath.h \
src/City.h \
src/CityManager.h \
src/collisions.h \
src/Config.h \
src/EnvironmentObject.h \
src/extensions.h \
src/font.h \
src/Frustum.h \
src/GameState.h \
src/image.h \
src/Log.h \
src/MainMenu.h \
src/Map.h \
src/normals.h \
src/Ocean.h \
src/Player.h \
src/Point.h \
src/QuadBox.h \
src/QuadNode.h \
src/StateCity.h \
src/StateSailing.h \
src/Terrain.h \
src/tinyxml.h \
src/Wave.h \
src/WaveEmitter.h \
src/BoundBox.h \
src/Model.h \
src/Product.h \
src/Callback.h \
src/Economy.h \
src/CityEconomy.h \
src/SkyBox.h \
src/Menu.h \
src/StateBattle.h \
src/Ships.h \
src/WaveEmitter.h \
src/Wave.h \
src/tinyxml.h \
src/tinystr.h \
src/Terrain.h \
src/StateSailing.h \
src/StateCity.h \
src/StateBattle.h \
src/sound.h \
src/SkyBox.h \
src/Ships.h \
src/QuadNode.h \
src/QuadBox.h \
src/Product.h \
src/Point.h \
src/Player.h \
src/Ocean.h \
src/normals.h \
src/Model.h \
src/Menu.h \
src/Map.h \
src/MainMenu.h \
src/Log.h \
src/image.h \
src/GameState.h \
src/Frustum.h \
src/font.h \
src/extensions.h \
src/EnvironmentObject.h \
src/Economy.h \
src/Config.h \
src/collisions.h \
src/CityManager.h \
src/CityEconomy.h \
src/City.h \
src/ccmath.h \
src/Camera.h \
src/Callback.h \
src/BoundBox.h \
src/sound.h \
src/Menu/MenuContainer.h \
src/Menu/DataContainer.h \
src/Menu/Button.h \
src/StateBattle/Bullet.h \
src/SoundStream.h \
src/Cargo.h
OTHER_FILES += build/data/background.png \
build/data/background.psd \
build/data/city.png \
build/data/detail.png \
build/data/font.png \
build/data/land.png \
build/data/loading \
page.psd \
build/data/loading.png \
build/data/map.png \
build/data/mapscreen.png \
build/data/SaraCraft.conf \
build/data/ship.vtx \
build/data/water.png \
src/QuadNode.o \
src/QuadBox.o \
src/Point.o \
src/Player.o \
src/Ocean.o \
src/normals.o \
src/Map.o \
src/Makefile \
src/MainMenu.o \
src/main.o \
src/Log.o \
src/image.o \
src/GameState.o \
src/Frustum.o \
src/font.o \
src/extensions.o \
src/EnvironmentObject.o \
src/Config.o \
src/collisions.o \
src/CityManager.o \
src/City.o \
src/Camera.o

1085
Makefile Normal file

File diff suppressed because it is too large Load Diff

87
README Normal file
View File

@ -0,0 +1,87 @@
Lephisto : SaraCraft Studio's
SaraCraft is looking to produce a 3D RPG, similar to http://pirates.wikia.com/wiki/Pirates_of_the_Caribbean_%28game%29
It is simultaneously being developed in Linux and Windows, with a strong emphasis on cross-platform compatability.
The project is still early on in development, although it is just beginning to look like an actual game.
I have added audio in this release using Ogg Vorbis files and OpenAL. Music is streamed off of the disk,
while the sound effects are loaded directly into memory.
I still have some tweaking to do, and currently do not take advantage of OpenAL's 3d capabilities.
We have fairly complete naval battles now.
Players periodically see ships and have the choice to investigate further or sail away.
After the battle (assuming victory), the player may take the captured cargo.
More work will be done as I add additional gameplay features such as nationalities and ship crews.
Basic trading capabilities are present now. You can now buy and sell goods in towns,
as well as capture cargo in naval battles.
I am making progress towards a more functional (and dynamic) economy.
In order to allow for the trading and the naval battles, I reworked how ships are handled and added a few new ships.
art is complimentary of a good friend of mine: Maja.
Our menu system has been reworked to make creating menus easier for the developers. It also now allows for mouse input.
Someone will still bitch at me.
-------------------------------------------------------------------------------------------
Once Maja provided the new model, I had to rewrite the model loading code so we could use it.
The new code is somewhat of a hybrid between the old system and what is planned for the future.
For now it still uses display lists, although I may move towards VA/VBO's in the future.
Eventually, I'll probably write my own model format, like .scm (saracraft model) but for now it just loads .obj files.
There is a new automatic menu generation system, so we don't have to recode a basic menu everytime we need
to create a new menu in for the game. Rather than copying and pasting code, we can now just pass this menu
class a few lists and it will generate the menus automatically, cool huh?
The ocean rendering has been updated.
The actual shore line no longer moves, which will allow us to improve the heightmap,
since low elevation land won't spend half of the time underwater.
There are also waves breaking on the shore lines.
The actual wave motion may change some, but the effect is pretty good in general.
(Thanks to someone in ES IRC for noting that it was not too great, can not remember who)
Requirements:
SDL library
SDL_image library
video card capable of multi-texturing
Config.xml:
This is the configuration file.
It is now fairly straight-forward xml, loaded with the tinyxml library.
The Width and Height values should be integers and they determine the resolution of the window.
Fullscreen should be either "true" or "false" and change whether Lephisto runs fullscreen or in a window.
VBO should also be either "true" or "false" and specifies whether to use VBOs to draw the terrain or just vertex arrays.
If VBOs are enabled, but not supported by the video card, Lephisto logs a warning and falls back on vertex arrays.
The configuration loading code is now much more flexible, simpler, and more robust.
The SDLParachute should be set to "true" unless you are trying to get a core dump for debugging
(then set it to "false"). CompressTextures enables ("true") or disables ("false") compressing the textures when
they are stored in video memory. Almost everyone should be able to enable this setting, but if you have trouble,
you can try disabling compressed textures.
Game Controls:
up - speed up
down - slow down
left - turn left
right - turn right
'm' - display the map
'q' - Fire port (left) cannons (in naval battles)
'e' - Fire starboard (right) cannons (in naval batles)
'c' - abrupt turn-around (for testing)
'd' - dump player info (for testing)
'z' - take screenshot
esc - go to the menu
When looking at the map, hold 't' and click the mouse to teleport to that location.
This is just a development feature, but it sure is useful for testing. Also, 'i' will display some debugging information.
Known issues:
- Errors loading files are not handled gracefully
- Some Cities are difficult or impossible to enter
- Closing the game window directly (without choosing "Exit" from the main menu) can cause crashes
Developers:
Allanis
Contributors:
VLack

View File

@ -1,4 +0,0 @@
ShipWreck
=========
Old Lephisto project from 2009/2010. Simply storing it here for coderot.

10
build/Config.xml Normal file
View File

@ -0,0 +1,10 @@
<GameConfiguration>
<Resolution>
<Width>800</Width>
<Height>600</Height>
</Resolution>
<Fullscreen>false</Fullscreen>
<VBO>false</VBO>
<SDLParachute>true</SDLParachute>
</GameConfiguration>

27
build/Makefile Normal file
View File

@ -0,0 +1,27 @@
CC = g++
CFLAGS = -ansi -Wall -g
LDADD = -lGL -lGLU -lpthread -lSDL -lSDL_image -lopenal -lalut -lvorbisfile -L/usr/X11
LDADDSTATIC = -Wl,-Bstatic -lSDL -lSDL_image -lopenal -lalut -L/usr/X11 -Wl,-Bdynamic -lasound -lartsc -lesd -lpulse -lpulse-simple -ldirectfb -lvga -laa -lcaca -ljpeg -ltiff -lpthread -lGL -lGLU -Wl,-Bdynamic
.PHONY: default static all clean
default: all
all:
$(MAKE) -C ../src/Menu
$(MAKE) -C ../src/StateBattle
$(MAKE) -C ../src
$(CC) $(CFLAGS) -o Lephisto ../src/main.cpp ../src/Menu/*.o ../src/StateBattle/*.o ../src/*.o $(LDADD)
static:
@echo -e "\033[1;31mThis is an experimental build, if it does not work, don't complain...\033[0m"
@sleep 1
$(MAKE) -C ../src/Menu
$(MAKE) -C ../src
$(CC) $(CFLAGS) -o build/Lephisto-static ../src/main.cpp ../src/Menu/*.o ../src/StateBattle/*.o ../src/*.o $(LDADDSTATIC)
clean:
$(MAKE) -C ../src/Menu clean
$(MAKE) -C ../src/StateBattle clean
$(MAKE) -C ../src clean
rm -f Lephisto Lephisto.log

BIN
build/SDL.dll Normal file

Binary file not shown.

BIN
build/SDL_image.dll Normal file

Binary file not shown.

100
build/data/City.xml Normal file
View File

@ -0,0 +1,100 @@
<?xml version="1.0" standalone=no>
<object>
<name>City1</name>
<visible>TRUE</visible>
<location>
<x>-110</x>
<z>-92</z>
</location>
</object>
<object>
<name>City2</name>
<visible>TRUE</visible>
<location>
<x>-86</x>
<z>-228</z>
</location>
</object>
<object>
<name>City3</name>
<visible>TRUE</visible>
<location>
<x>-38</x>
<z>-162</z>
</location>
</object>
<object>
<name>City4</name>
<visible>TRUE</visible>
<location>
<x>-375</x>
<z>-21</z>
</location>
</object>
<object>
<name>City5</name>
<visible>TRUE</visible>
<location>
<x>-315</x>
<z>0</z>
</location>
</object>
<object>
<name>City6</name>
<visible>TRUE</visible>
<location>
<x>-277</x>
<z>-28</z>
</location>
</object>
<object>
<name>City7</name>
<visible>TRUE</visible>
<location>
<x>236</x>
<z>-235</z>
</location>
</object>
<object>
<name>City8</name>
<visible>TRUE</visible>
<location>
<x>18</x>
<z>-20</z>
</location>
</object>
<object>
<name>City9</name>
<visible>TRUE</visible>
<location>
<x>77</x>
<z>-25</z>
</location>
</object>
<object>
<name>City10</name>
<visible>TRUE</visible>
<location>
<x>4</x>
<z>25</z>
</location>
</object>
<object>
<name>City11</name>
<visible>TRUE</visible>
<location>
<x>87</x>
<z>-18</z>
</location>
</object>

263
build/data/Product.xml Normal file
View File

@ -0,0 +1,263 @@
<?xml version="1.0" standalone=no>
<Economy>
<City name="City1">
<Product>
<Name>Sugar</Name>
<Value>5</Value>
<Demand>1</Demand>
</Product>
<Product>
<Name>Cocoa</Name>
<Value>10</Value>
<Demand>1</Demand>
</Product>
<Product>
<Name>Rum</Name>
<Value>7</Value>
<Demand>1</Demand>
</Product>
<Product>
<Name>Tobacco</Name>
<Value>20</Value>
<Demand>1</Demand>
</Product>
</City>
<City name="City2">
<Product>
<Name>Sugar</Name>
<Value>5</Value>
<Demand>1</Demand>
</Product>
<Product>
<Name>Cocoa</Name>
<Value>10</Value>
<Demand>1</Demand>
</Product>
<Product>
<Name>Rum</Name>
<Value>7</Value>
<Demand>1</Demand>
</Product>
<Product>
<Name>Tobacco</Name>
<Value>20</Value>
<Demand>1</Demand>
</Product>
</City>
<City name="City3">
<Product>
<Name>Sugar</Name>
<Value>5</Value>
<Demand>1</Demand>
</Product>
<Product>
<Name>Cocoa</Name>
<Value>10</Value>
<Demand>1</Demand>
</Product>
<Product>
<Name>Rum</Name>
<Value>7</Value>
<Demand>1</Demand>
</Product>
<Product>
<Name>Tobacco</Name>
<Value>20</Value>
<Demand>1</Demand>
</Product>
</City>
<City name="City4">
<Product>
<Name>Sugar</Name>
<Value>5</Value>
<Demand>1</Demand>
</Product>
<Product>
<Name>Cocoa</Name>
<Value>10</Value>
<Demand>1</Demand>
</Product>
<Product>
<Name>Rum</Name>
<Value>7</Value>
<Demand>1</Demand>
</Product>
<Product>
<Name>Tobacco</Name>
<Value>20</Value>
<Demand>1</Demand>
</Product>
</City>
<City name="City5">
<Product>
<Name>Sugar</Name>
<Value>5</Value>
<Demand>1</Demand>
</Product>
<Product>
<Name>Cocoa</Name>
<Value>10</Value>
<Demand>1</Demand>
</Product>
<Product>
<Name>Rum</Name>
<Value>7</Value>
<Demand>1</Demand>
</Product>
<Product>
<Name>Tobacco</Name>
<Value>20</Value>
<Demand>1</Demand>
</Product>
</City>
<City name="City6">
<Product>
<Name>Sugar</Name>
<Value>5</Value>
<Demand>1</Demand>
</Product>
<Product>
<Name>Cocoa</Name>
<Value>10</Value>
<Demand>1</Demand>
</Product>
<Product>
<Name>Rum</Name>
<Value>7</Value>
<Demand>1</Demand>
</Product>
<Product>
<Name>Tobacco</Name>
<Value>20</Value>
<Demand>1</Demand>
</Product>
</City>
<City name="City7">
<Product>
<Name>Sugar</Name>
<Value>5</Value>
<Demand>1</Demand>
</Product>
<Product>
<Name>Cocoa</Name>
<Value>10</Value>
<Demand>1</Demand>
</Product>
<Product>
<Name>Rum</Name>
<Value>7</Value>
<Demand>1</Demand>
</Product>
<Product>
<Name>Tobacco</Name>
<Value>20</Value>
<Demand>1</Demand>
</Product>
</City>
<City name="City8">
<Product>
<Name>Sugar</Name>
<Value>5</Value>
<Demand>1</Demand>
</Product>
<Product>
<Name>Cocoa</Name>
<Value>10</Value>
<Demand>1</Demand>
</Product>
<Product>
<Name>Rum</Name>
<Value>7</Value>
<Demand>1</Demand>
</Product>
<Product>
<Name>Tobacco</Name>
<Value>20</Value>
<Demand>1</Demand>
</Product>
</City>
<City name="City9">
<Product>
<Name>Sugar</Name>
<Value>5</Value>
<Demand>1</Demand>
</Product>
<Product>
<Name>Cocoa</Name>
<Value>10</Value>
<Demand>1</Demand>
</Product>
<Product>
<Name>Rum</Name>
<Value>7</Value>
<Demand>1</Demand>
</Product>
<Product>
<Name>Tobacco</Name>
<Value>20</Value>
<Demand>1</Demand>
</Product>
</City>
<City name="City10">
<Product>
<Name>Sugar</Name>
<Value>5</Value>
<Demand>1</Demand>
</Product>
<Product>
<Name>Cocoa</Name>
<Value>10</Value>
<Demand>1</Demand>
</Product>
<Product>
<Name>Rum</Name>
<Value>7</Value>
<Demand>1</Demand>
</Product>
<Product>
<Name>Tobacco</Name>
<Value>20</Value>
<Demand>1</Demand>
</Product>
</City>
<City name="City11">
<Product>
<Name>Sugar</Name>
<Value>5</Value>
<Demand>1</Demand>
</Product>
<Product>
<Name>Cocoa</Name>
<Value>10</Value>
<Demand>1</Demand>
</Product>
<Product>
<Name>Rum</Name>
<Value>7</Value>
<Demand>1</Demand>
</Product>
<Product>
<Name>Tobacco</Name>
<Value>20</Value>
<Demand>1</Demand>
</Product>
</City>
</Economy>
<Products>
<Name>Sugar</Name>
<Name>Cocoa</Name>
<Name>Rum</Name>
<Name>Tobacco</Name>
</Products>

32
build/data/Ships.xml Normal file
View File

@ -0,0 +1,32 @@
<Ship>
<Name>Sloop</Name>
<Model>./data/Ships/sloop.obj</Model>
<Texture>./data/Ships/sloop.png</Texture>
<Scale>1</Scale>
<Damage>10</Damage>
<CargoSize>100</CargoSize>
</Ship>
<Ship>
<Name>Fluyt</Name>
<Model>./data/Ships/fluyt.obj</Model>
<Texture>./data/Ships/fluyt.png</Texture>
<Scale>.32</Scale>
<Damage>10</Damage>
<CargoSize>100</CargoSize>
</Ship>
<Ship>
<Name>Brig</Name>
<Model>./data/Ships/brig.obj</Model>
<Texture>./data/Ships/brig.png</Texture>
<Scale>.32</Scale>
<Damage>10</Damage>
<CargoSize>100</CargoSize>
</Ship>
<Ship>
<Name>Schooner</Name>
<Model>./data/Ships/schooner.obj</Model>
<Texture>./data/Ships/schooner.png</Texture>
<Scale>.32</Scale>
<Damage>10</Damage>
<CargoSize>100</CargoSize>
</Ship>

7475
build/data/Ships/brig.obj Normal file

File diff suppressed because it is too large Load Diff

BIN
build/data/Ships/brig.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

5943
build/data/Ships/fluyt.obj Normal file

File diff suppressed because it is too large Load Diff

BIN
build/data/Ships/fluyt.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

2623
build/data/Ships/sloop.obj Normal file

File diff suppressed because it is too large Load Diff

BIN
build/data/Ships/sloop.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

BIN
build/data/background.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

BIN
build/data/background.psd Normal file

Binary file not shown.

BIN
build/data/battledefeat.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

BIN
build/data/battletie.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

BIN
build/data/city.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

BIN
build/data/detail.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 287 KiB

BIN
build/data/enterbattle.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

BIN
build/data/font.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
build/data/heightmap.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 161 KiB

BIN
build/data/hit.ogg Normal file

Binary file not shown.

BIN
build/data/land.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1008 KiB

BIN
build/data/loading page.psd Normal file

Binary file not shown.

BIN
build/data/loading.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 375 KiB

BIN
build/data/mapscreen.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 338 KiB

418
build/data/ship.vtx Normal file
View File

@ -0,0 +1,418 @@
# Ship model made for the SaraCraft team
# by Marty - T2G Student
S .025 .0225 .03
T 20 0 0
M 0.8 0.5 0.0 1.0
B q
# Main Mast
N 0 0.0107137 0.999943
-10 13 1.25
-7 13 1.25
-8 123 .5
-9 123 .5
N 0 0.0107137 -0.999943
-10 13 -1.25
-9 123 -.5
-8 123 -.5
-7 13 -1.25
N -0.999943 0.0107137 0
-10 13 -1.25
-10 13 1.25
-9 123 .5
-9 123 -.5
N 0.999943 0.0107137 0
-7 13 1.25
-7 13 -1.25
-8 123 -.5
-8 123 .5
N 0 1 0
-9 123 -.5
-9 123 .5
-8 123 .5
-8 123 -.5
# Back Mast
N 0 0.0095886 0.999954
29 20 1
31 20 1
30.5 93 .3
29.5 93 .3
N 0 0.0095886 -0.999954
31 20 -1
29 20 -1
29.5 93 -.3
30.5 93 -.3
N 0.999977 0.00684915 0
31 20 1
31 20 -1
30.5 93 -.3
30.5 93 .3
N -0.999977 0.00684915 0
29 20 -1
29 20 1
29.5 93 .3
29.5 93 -.3
N 0 1 0
29.5 93 -.3
29.5 93 .3
30.5 93 .3
30.5 93 -.3
# Front Mast
N 0.999984 0.00568173 0
-69 20 1
-69 20 -1
-69.5 103 -.3
-69.5 103 .3
N -0.999984 0.00568173 0
-71 20 -1
-71 20 1
-70.5 103 .3
-70.5 103 -.3
N 0 0.00795429 -0.999968
-69 20 -1
-71 20 -1
-70.5 103 -.3
-69.5 103 -.3
N 0 0.00795429 0.999968
-71 20 1
-69 20 1
-69.5 103 .3
-70.5 103 .3
N 0 1 0
-70.5 103 -.3
-70.5 103 .3
-69.5 103 .3
-69.5 103 -.3
# Front Diag. Mast
N -0.267644 -0.963518 0
-84 20 -.5
-84 20 .5
-120 30 .2
-120 30 -.2
N 0.256901 0.966438 0
-80 20 .5
-80 20 -.5
-119.5 30.5 -.2
-119.5 30.5 .2
N 0 0.0285598 0.999592
-84 20 .5
-80 20 .5
-119.5 30.5 .2
-120 30 .2
N 0 0.0299865 -0.99955
-80 20 -.5
-84 20 -.5
-120 30 -.2
-119.5 30.5 -.2
N -0.707107 0.707107 0
-119.5 30.5 -.2
-120 30 -.2
-120 30 .2
-119.5 30.5 .2
E
# Ship hull
B t
N 0 1 0
-85 20 0
-77 20 9
-77 20 -9
-77 20 -9
-77 20 9
-60 20 12
-77 20 -9
-60 20 12
-60 20 -12
N 0.573462 0.819232 0
-60 20 -12
-60 20 12
-50 13 12
-60 20 -12
-50 13 12
-50 13 -12
N 0 1 0
-50 13 -12
-50 13 12
14 13 12
-50 13 -12
14 13 12
14 13 -12
N -0.759257 0.650791 0
14 13 -12
14 13 12
20 20 15
14 13 -12
20 20 15
20 20 -15
N 0 1 0
20 20 -15
20 20 15
45 20 15
20 20 -15
45 20 15
45 20 -15
N 0.961524 -0.274721 0
45 20 -15
45 20 15
43 13 15
45 20 -15
43 13 15
43 13 -15
N 0.447214 -0.894427 0
43 13 -15
43 13 15
37 10 12
43 13 -15
37 10 12
37 10 -12
N 0.923077 -0.384615 0
37 10 -12
37 10 12
32 -2 8
37 10 -12
32 -2 8
32 -2 -8
N 0.707107 -0.707107 0
32 -2 -8
32 -2 8
28 -6 0
N 0 -0.894427 -0.447214
32 -2 -8
28 -6 0
-50 -2 -8
-50 -2 -8
28 -6 0
-60 -6 0
N -0.26479 -0.688455 -0.675215
-50 -2 -8
-60 -6 0
-73 -1 0
-73 -1 0
-60 -6 0
-50 -2 8
N -0.313931 -0.423895 0.849565
-73 -1 0
-50 -2 8
-77 20 9
N -0.171578 -0.253842 0.951906
-77 20 9
-50 -2 8
-50 13 12
N -0.168665 -0.24095 0.955769
-77 20 9
-50 13 12
-60 20 12
N 0 -0.257663 0.966235
-50 13 12
-50 -2 8
14 13 12
14 13 12
-50 -2 8
32 -2 8
N -0.0392886 -0.301212 0.952747
14 13 12
32 -2 8
37 10 12
N -0.0807866 -0.619364 0.780937
37 10 12
43 13 15
14 13 12
N 0 0 1
20 20 15
43 13 15
45 20 15
N -0.0974785 -0.320286 0.942292
14 13 12
43 13 15
20 20 15
N 0 -0.894427 0.447214
32 -2 8
-50 -2 8
28 -6 0
28 -6 0
-50 -2 8
-60 -6 0
N -0.0807866 -0.619364 -0.780937
37 10 -12
14 13 -12
43 13 -15
N -0.0974785 -0.320286 -0.942292
43 13 -15
14 13 -12
20 20 -15
N 0 -0 -1
43 13 -15
20 20 -15
45 20 -15
N -0.0392886 -0.301212 -0.952747
37 10 -12
32 -2 -8
14 13 -12
N 0 -0.257663 -0.966235
14 13 -12
32 -2 -8
-50 -2 -8
14 13 -12
-50 -2 -8
-50 13 -12
N -0.171578 -0.253842 -0.951906
-50 13 -12
-50 -2 -8
-77 20 -9
N -0.168665 -0.24095 -0.955769
-50 13 -12
-77 20 -9
-60 20 -12
N -0.687345 -0.392769 0.610974
-73 -1 0
-77 20 9
-85 20 0
N -0.687345 -0.392769 -0.610974
-73 -1 0
-85 20 0
-77 20 -9
N -0.313931 -0.423895 -0.849565
-73 -1 0
-77 20 -9
-50 -2 -8
# Sails
M 0.8 0.8 0.8 1.0
N -0.933346 0.358979 0
-10 103 15
-10 103 -15
-15 90 -7.5
N -0.971324 0.220755 0.0883022
-10 103 15
-15 90 -7.5
-15 83 10
N -1 0 0
-15 90 -7.5
-15 83 -10
-15 83 10
N -1 0 0
-15 76 7.5
-15 83 10
-15 83 -10
N -0.971324 -0.220755 -0.0883022
-10 63 -15
-15 76 7.5
-15 83 -10
N -0.933346 -0.358979 0
-15 76 7.5
-10 63 -15
-10 63 15
N -0.916246 0.134742 -0.377278
-10 103 -15
-15 83 -10
-15 90 -7.5
N -0.707107 0 -0.707107
-10 103 -15
-10 63 -15
-15 83 -10
N -0.916246 -0.134742 0.377278
-10 63 15
-15 83 10
-15 76 7.5
N -0.83205 0 0.5547
-10 63 15
-10 103 15
-15 83 10
-10.5 60 20
-10.5 60 -20
-10.5 23 -20
-10.5 60 20
-10.5 23 -20
-10.5 23 20
E
# Ropes
B L
N 0 -1 0
-119.5 30.5 0
-70 103 0
-8.5 123 0
30 93 0
45 20 0
E

BIN
build/data/skybox1/BK.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

BIN
build/data/skybox1/DN.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 600 KiB

BIN
build/data/skybox1/FT.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

BIN
build/data/skybox1/LT.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 795 KiB

BIN
build/data/skybox1/RT.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

BIN
build/data/skybox1/UP.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 392 KiB

BIN
build/data/surf.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

BIN
build/data/title.ogg Normal file

Binary file not shown.

BIN
build/data/title.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

BIN
build/data/water.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

BIN
build/jpeg.dll Normal file

Binary file not shown.

BIN
build/libpng12-0.dll Normal file

Binary file not shown.

BIN
build/libtiff-3.dll Normal file

Binary file not shown.

BIN
build/zlib1.dll Normal file

Binary file not shown.

119
src/BoundBox.cpp Normal file
View File

@ -0,0 +1,119 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*/
#if defined WIN32
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#endif
#include <cstdio>
#include <GL/gl.h>
#include "BoundBox.h"
#include "Point.h"
BoundBox::BoundBox() {
b1 = NULL;
b2 = NULL;
b3 = NULL;
b4 = NULL;
t1 = NULL;
t2 = NULL;
t3 = NULL;
t4 = NULL;
}
BoundBox::BoundBox(float minX, float maxX, float minY, float maxY, float minZ, float maxZ) {
b1 = new Point(minX, minY, minZ);
b2 = new Point(maxX, minY, minZ);
b3 = new Point(minX, minY, maxZ);
b4 = new Point(maxX, minY, maxZ);
t1 = new Point(minX, maxY, minZ);
t2 = new Point(maxX, maxY, minZ);
t3 = new Point(minX, maxY, maxZ);
t4 = new Point(maxX, maxY, maxZ);
}
BoundBox::~BoundBox() {
delete b1;
delete b2;
delete b3;
delete b4;
delete t1;
delete t2;
delete t3;
delete t4;
}
void BoundBox::setHeight(GLfloat low, GLfloat high) {
if ((b1 == NULL) || (b2 == NULL) || (b3 == NULL) || (b4 == NULL)) {
printf("NULL!\n");
}
b1->y = low;
b2->y = low;
b3->y = low;
b4->y = low;
t1 = new Point(b1->x, high, b1->z);
t2 = new Point(b2->x, high, b2->z);
t3 = new Point(b3->x, high, b3->z);
t4 = new Point(b4->x, high, b4->z);
}
void BoundBox::draw() {
glBegin(GL_LINES);
glNormal3f(0, 1, 0);
b1->draw();
b2->draw();
b2->draw();
b4->draw();
b4->draw();
b3->draw();
b3->draw();
b1->draw();
b1->draw();
t1->draw();
b2->draw();
t2->draw();
b3->draw();
t3->draw();
b4->draw();
t4->draw();
t1->draw();
t2->draw();
t2->draw();
t4->draw();
t4->draw();
t3->draw();
t3->draw();
t1->draw();
glEnd();
}
void BoundBox::dump() {
b1->dump();
b2->dump();
b3->dump();
b4->dump();
t1->dump();
t2->dump();
t3->dump();
t4->dump();
printf("\n");
}

32
src/BoundBox.h Normal file
View File

@ -0,0 +1,32 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*/
#ifndef _BOUNDBOX_H_
#define _BOUNDBOX_H_
class Point;
class BoundBox {
public:
// Contructor
BoundBox();
// Pass in max/min x/y/z
BoundBox(float minX, float maxX, float minY, float maxY, float minZ, float maxZ);
// Destructor
~BoundBox();
Point *b1, *b2, *b3, *b4;
Point *t1, *t2, *t3, *t4;
void setHeight(GLfloat low, GLfloat high);
// Debuggind purposes :)
void draw();
void dump();
};
#endif

41
src/Callback.h Normal file
View File

@ -0,0 +1,41 @@
/* Callback function class
* Borrowed from CodeGuru.com : Modyified by Allanis
* http://www.codeguru.com/Cpp/Cpp/cpp_mfc/callbacks/article.php/c4129/
*/
#ifndef _CCALLBACK_H_
#define _CCALLBACK_H_
class cCallback {
public:
virtual void Execute(int ButtonID) const = 0;
};
template <class cInstance>
class TCallback : public cCallback {
public:
TCallback() { pFunction = 0; }
typedef void (cInstance::*tFunction)(int Param);
virtual void Execute(int ButtonID) const {
if (pFunction) (cInst->*pFunction)(ButtonID);
else printf("ERROR : the callback function has not been defined !!!!");
}
void SetCallback (cInstance *cInstancePointer,
tFunction pFunctionPointer) {
cInst = cInstancePointer;
pFunction = pFunctionPointer;
}
private:
cInstance *cInst;
tFunction pFunction;
};
#endif

99
src/Camera.cpp Normal file
View File

@ -0,0 +1,99 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*/
#ifdef WIN32
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#endif
#include <GL/gl.h>
#include <GL/glu.h>
#include "ccmath.h"
#include "Camera.h"
#include <cstdio>
#if !defined (MSVC6)
using namespace std;
#endif
Camera::Camera(float winRatio, float x, float y, float z) {
changeRatio(winRatio);
// Set the camera position
setPosCalcAngle(x, y, z);
//calcValues();
//setProjection();
}
void Camera::setPosition(float x, float y, float z) {
position[0] = x;
position[1] = y;
position[2] = z;
setCamera();
}
void Camera::setPosCalcAngle(float x, float y, float z) {
position[0] = x;
position[1] = y;
position[2] = z;
calcValues();
setCamera();
}
void Camera::changeRatio(float winRatio) {
ratio = winRatio;
}
void Camera::setProjection() {
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, ratio, 1.0, 512.0);
glMatrixMode(GL_MODELVIEW);
}
void Camera::calcValues() {
angle = radiansToDegrees(atan2(position[1], abs(position[0])));
angle2 = (180.0/M_PI)*atan2(position[0], position[2]);
}
void Camera::setCamera() {
//OOOOOH, we DID set it for good... set it away wherever it was dropped, so randomly :P
// This should stop it from bitching at us.
setProjection();
glRotatef(angle, 1.0, 0.0, 0.0);
glRotatef(angle2, 0.0, 1.0, 0.0);
glTranslatef(position[0], -1*position[1], -1*position[2]);
return;
}
void Camera::setAngle(float a1,float a2) {
angle = a1;
angle2 = a2;
}
void Camera::changeAngle(float da1,float da2) {
angle += da1;
angle2 += da2;
}
void Camera::changePosition(float dx,float dy,float dz) {
this->position[0] += dx;
this->position[1] += dy;
this->position[2] += dz;
setCamera();
}
void Camera::getPosition(vec3 &ret) {
ret[0] = this->position[0];
ret[1] = this->position[1];
ret[2] = this->position[2];
}

45
src/Camera.h Normal file
View File

@ -0,0 +1,45 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*/
#ifndef _CAMERA_H_
#define _CAMERA_H_
typedef float vec3[3];
class Camera {
public:
// Contructor, pass in window width & height
Camera(float winRatio, float x, float y, float z);
// Set the camera location
void setPosition(float x, float y, float z);
void setPosCalcAngle(float x,float y,float z);
void changePosition(float dx,float dy,float dz);
void getPosition(vec3& ret);
// Update the ratio
void changeRatio(float winRatio);
// Set the projection matrix
void setProjection();
void setCamera();
void setAngle(float a1,float a2);
void changeAngle(float da1,float da2);
private:
// Calculate the dist, angles based on position
void calcValues();
float ratio;
float angle;
float angle2;
vec3 position;
};
#endif

125
src/Cargo.cpp Normal file
View File

@ -0,0 +1,125 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*/
#include <vector>
#include <string>
#include "Log.h"
#include "ccmath.h"
#include "Economy.h"
#include "Cargo.h"
Cargo::Cargo(string nameIn, unsigned int sizeIn) {
size = sizeIn;
filled = 0;
name = nameIn;
products.resize(Economy::Econ->ProductCount());
for(unsigned int i = 0; i < products.size(); i++) {
products[i] = 0;
}
}
Cargo::~Cargo() {
// Nothing realy needs to happen here
products.clear();
}
unsigned int Cargo::getFilled() {
return filled;
}
unsigned int Cargo::getSize() {
return size;
}
void Cargo::setSize(unsigned int sizeIn) {
size = sizeIn;
}
unsigned int Cargo::getAvailQty() {
return size - filled;
}
unsigned int Cargo::getQty(unsigned int product) throw ( const char *) {
if(product >= products.size()) {
throw "Invalid product";
}
return products[product];
}
void Cargo::setQty(unsigned int product, unsigned int qty) throw ( const char *) {
unsigned int oldQty;
if(product >= products.size()) {
throw "Invalid product";
}
oldQty = products[product];
products[product] = qty;
filled = filled + (qty - oldQty);
}
unsigned int Cargo::addQty(unsigned int product, int qty) throw ( const char *) {
if(product >= products.size()) {
throw "Invalid product";
}
if((qty < 0 && (-1*qty > products[product]))) {
throw "Result would be negative";
}
products[product] = products[product] + qty;
filled += qty;
return products[product];
}
void Cargo::fillRandom() throw ( const char*) {
fillRandom((int) (size * randBellCurve()));
}
void Cargo::fillRandom(unsigned int qty) throw(const char *) {
unsigned int avgQty;
unsigned int tempQty;
if(qty > size) {
throw "Qty greater than size";
}
avgQty = qty / products.size();
Log::logger->message("AvgQty: %u", avgQty);
// Loop through all but last
for(unsigned int i = 0; i < (products.size() - 1); i++) {
tempQty = (int) ((randBellCurve() + .5) * avgQty);
if(tempQty > getAvailQty()) {
tempQty = getAvailQty();
}
products[i] = tempQty;
filled += tempQty;
// If it's full, there is no sence to keep going on
if(getAvailQty() == 0) {
break;
}
}
products[products.size()-1] = qty - filled;
filled = qty;
}
void Cargo::dump() {
Log::logger->message("%s", name.c_str());
Log::logger->message("Size:\t%u", size);
Log::logger->message("Filled:\t%u", filled);
for(unsigned int i = 0; i < products.size(); i++) {
Log::logger->message("%s:\t%u", Economy::Econ->ProdList[i].c_str(), products[i]);
}
}

44
src/Cargo.h Normal file
View File

@ -0,0 +1,44 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*/
#ifndef _CARGO_H_
#define _CARGO_H_
#include <vector>
#include <string>
class Product;
using namespace std;
class Cargo {
public:
Cargo(string nameIn, unsigned int sizeIn);
~Cargo();
unsigned int getFilled();
unsigned int getSize();
void setSize(unsigned int sizeIn);
unsigned int getAvailQty();
unsigned int getQty(unsigned int product) throw ( const char *);
void setQty(unsigned int product, unsigned int qty) throw ( const char *);
unsigned int addQty(unsigned int product, int qty) throw ( const char *);
void fillRandom() throw (const char*);
void fillRandom(unsigned int qty) throw ( const char *);
void dump();
private:
vector<int> products;
unsigned int size;
unsigned filled;
string name;
};
#endif

144
src/City.cpp Normal file
View File

@ -0,0 +1,144 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*/
#ifdef WIN32
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#endif
#include <string>
#include <SDL/SDL.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include "EnvironmentObject.h"
#include "image.h"
#include "font.h"
#include "Terrain.h"
#include "Economy.h"
#include "Product.h"
#include "CityEconomy.h"
#include "Config.h"
#include "City.h"
using namespace std;
City::City(Terrain *land, string cityName, int cityLocX, int cityLocZ) : EnvironmentObject(cityName, cityLocX, cityLocZ, true) {
int xDiff = (int) land->getWidth() / 2;
int zDiff = (int) land->getHeight() / 2;
height = land->getHeight(cityLocX + xDiff, cityLocZ + zDiff);
MyEconomy = Economy::Econ->CreateCity(cityName.c_str());
}
City::~City(){
}
void City::DisplayObject() {
// Right now, we are just drawing a box where the city will be..
float size = 1;
//glDisable(GL_TEXTURE_2D);
//glEnable(GL_BLEND);
//glEnable(GL_COLOR_MATERIAL);
//glColor4f(1, 1, 0, 4);
glBegin(GL_QUADS);
// Box top
glNormal3f(0, 1, 0);
glVertex3f(locX - size, height+5, locZ - size);
glVertex3f(locX - size, height+5, locZ + size);
glVertex3f(locX + size, height+5, locZ + size);
glVertex3f(locX + size, height+5, locZ - size);
// North
glVertex3f(locX - size, height+0, locZ - size);
glVertex3f(locX - size, height+5, locZ - size);
glVertex3f(locX + size, height+5, locZ - size);
glVertex3f(locX + size, height+0, locZ - size);
// East
glVertex3f(locX + size, height+0, locZ - size);
glVertex3f(locX + size, height+5, locZ - size);
glVertex3f(locX + size, height+5, locZ + size);
glVertex3f(locX + size, height+0, locZ + size);
// South
glVertex3f(locX - size, height+0, locZ + size);
glVertex3f(locX + size, height+0, locZ + size);
glVertex3f(locX + size, height+5, locZ + size);
glVertex3f(locX - size, height+5, locZ + size);
// West
glVertex3f(locX - size, height+0, locZ - size);
glVertex3f(locX - size, height+0, locZ + size);
glVertex3f(locX - size, height+5, locZ + size);
glVertex3f(locX - size, height+5, locZ - size);
// Do not need to draw the bottom.
// This points from the origin to the city. helps to find the city.
//glVertex3f(0,5,0);
//glVertex3f(locX, 5, locZ);
glEnd();
//glEnable(GL_TEXTURE_2D);
//glDisable(GL_BLEND);
//glDisable(GL_COLOR_MATERIAL);
}
// woot, i have frets on fire again.
void City::MapDisplay() {
float screenX, screenY;
float multi;
float winWidth, winHeight;
const char* tempName; // = name.c_str();
// Need an icon to display for each city with a name.. right now, it can be an X.
// Our glprintf has some issues if you try to pass a std::string
// so by changing the string to a character array, it eleminates this problem.
tempName = name.c_str();
/*
* the difference in the grid from the map to the sailing screen
* needs to be dealt with. You see a very similar piece of code
* in Map.cpp to deal with where to draw the ship.
*/
winWidth = Config::configuration->getWinWidth();
winHeight = Config::configuration->getWinHeight();
multi = winWidth / 812.0;
screenX = (winWidth / 2) - ((-1 * locX) * multi);
screenX -= 6; // the text does not put it EXACTLY where we want it, so we have to move it slightly.
multi = winHeight / 500.0f;
screenY = (winHeight / 2) - ((-1 * locZ) * multi);
screenY -= 5; // Same again, we will need to mmove it slightly.
glColor3f(1, 0, 0);
glPushMatrix();
glLoadIdentity();
glTranslatef(screenX, screenY, 0);
glPrintf(0, "x");
glNewLine();
glPrintf(0, "%s", tempName);
glPopMatrix();
}
vector<Product*> City::ProductInformation() {
return MyEconomy->getProductList();
}
bool City::CheckName(const char *cityName) {
if(name.compare(cityName)) return true;
return false;
}

43
src/City.h Normal file
View File

@ -0,0 +1,43 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*/
// This is inherited from the environment object. It will
// keep the lacation, name, and economic information of the city.
#ifndef _CITY_H_
#define _CITY_H_
#include <vector>
#include "EnvironmentObject.h"
class Product;
class Terrain;
class CityEconomy;
using namespace std;
class City: public EnvironmentObject {
public:
// Constructor
City(Terrain *land, string cityName, int cityLocX, int cityLocY);
//Destructor
~City();
// Method
void DisplayObject();
void MapDisplay();
vector<Product*> ProductInformation();
bool CheckName(const char* cityName);
private:
// We can put product information and crap here, whatever.
float height;
CityEconomy* MyEconomy;
};
#endif

90
src/CityEconomy.cpp Normal file
View File

@ -0,0 +1,90 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*/
#ifdef WIN32
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#endif
#include <string>
#include <vector>
#include <iostream>
#include "Product.h"
#include "Log.h"
#include "CityEconomy.h"
using namespace std;
CityEconomy::CityEconomy(const char* CityName, vector<Product*> ProductList) {
myProducts = ProductList;
myName = CityName;
}
CityEconomy::~CityEconomy() {
unsigned int i;
Product* tempProduct;
for(i = 0; i < myProducts.size(); i++) {
tempProduct = (Product*)myProducts[i];
delete tempProduct;
}
myProducts.clear();
}
string CityEconomy::getCityName() {
return myName;
}
Product* CityEconomy::getProduct(char* ProductName) {
string compare;
Product* tempProduct = NULL;
unsigned int i;
compare = ProductName;
for(i = 0; i < myProducts.size(); i++) {
tempProduct = (Product*)myProducts[i];
if(compare == tempProduct->GetName()) break;
}
return tempProduct;
}
float CityEconomy::getPrice(char* ProductName) {
string compare;
Product* tempProduct = NULL;
unsigned int i;
compare = ProductName;
for(i = 0; i < myProducts.size(); i++) {
tempProduct = (Product*)myProducts[i];
if(compare == tempProduct->GetName()) break;
}
if(tempProduct == NULL) {
// This should probably throw an exception
return 0;
}
return tempProduct->GetMedianPrice();
}
void CityEconomy::Print() {
unsigned int i;
Product* temp;
cout << myName << ":\n";
for(i = 0; i < myProducts.size(); i++) {
temp = (Product*)myProducts[i];
temp->Print();
}
}
vector<Product*> CityEconomy::getProductList() {
return myProducts;
}

45
src/CityEconomy.h Normal file
View File

@ -0,0 +1,45 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*
* This is a container for each of the citys to keep teack of the state
* of its own economy. It also allows the economy class to work on it.
* Each instance is kept in the Economy class and the cities must access it
* through the economy interface.
*/
#ifndef _CITYECONOMY_H_
#define _CITYECONOMY_H_
#include <vector>
#include <string>
class Product;
using namespace std;
class CityEconomy {
public:
// Constructor
CityEconomy(const char* CityName, vector<Product*> ProductList);
// Destructor
~CityEconomy();
// Methods
string getCityName();
Product* getProduct(char*ProductName);
float getPrice(char* ProductName);
void Print();
vector<Product*> getProductList();
// Bunch of other crap?
private:
vector<Product*> myProducts;
string myName;
};
#endif

180
src/CityManager.cpp Normal file
View File

@ -0,0 +1,180 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*/
#ifdef WIN32
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#endif
#include <string>
#include <vector>
#include <fstream>
#include <iostream>
#include <GL/gl.h>
#include <GL/glu.h>
#include <SDL/SDL.h>
#include "ccmath.h"
#include "City.h"
#include "EnvironmentObject.h"
#include "Terrain.h"
#include "Player.h"
#include "Log.h"
#include "Product.h"
#include "CityManager.h"
#include "tinyxml.h"
#define MAX_CITIES 32 // This MAY need to be bigger soon.
using namespace std;
CityManager::CityManager(Terrain *land) {
LoadCityConfig("data/City.xml", land);
//WorldEcon = new Economy("data/Product.xml");
}
CityManager::~CityManager() {
CityList.clear();
}
City* CityManager::CheckCollision(Player *player) {
// Used to determine if the player is sailing towards the city
float angleToCity;
float diffAngles;
unsigned int i;
// No sense in checking if the player isn't moving
if(player->speed == 0) return NULL;
for(i=0; i<CityList.size(); i++) {
// Check the distance to each city
// This isn't really efficient, but since there aren't many cities
// it's not really worth doing something fancier.
if(CityList[i]->calcDist(player->x, player->z) < 3) {
// It's in range, now make sure the angle is close
angleToCity = CityList[i]->calcAngle(player->x, player->z);
diffAngles = abs(player->rot - angleToCity);
if(diffAngles > M_PI) diffAngles = 2*M_PI - diffAngles;
if(diffAngles < degreesToRadians(15)) {
// The player is close and headed +-5 degrees of city
return CityList[i];
}
}
}
// No collision
return NULL;
}
void CityManager::DisplayCities() {
unsigned int i;
// Save some gl calls, just do this once for all the cities
glDisable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glEnable(GL_COLOR_MATERIAL);
glColor4f(1, 1, 0, .4);
// I'm not sure why, but if you don't do this, then City1
// (CityList[0]) doesn't get displayed. It's probably not worth worrying
// about since we will hopefully be getting city models soon.
glBegin(GL_QUADS);
glEnd();
for(i = 0; i < CityList.size(); i++) {
CityList[i]->DisplayObject();
}
glEnable(GL_TEXTURE_2D);
glDisable(GL_BLEND);
glDisable(GL_COLOR_MATERIAL);
}
void CityManager::MapDisplay() {
unsigned int i;
for(i = 0; i < CityList.size(); i++) {
CityList[i]->MapDisplay();
}
}
void CityManager::LoadCityConfig(const char *filename, Terrain *land) {
City* TempCity;
TiXmlElement* object;
TiXmlElement* location;
TiXmlNode* node;
TiXmlDocument doc( filename );
TiXmlText* cityString;
string cityName;
vector<Product*> tempList;
int locX, locZ;
int objNum = 0;
doc.LoadFile();
node = doc.FirstChild();
for(node = node->NextSibling(); node; node = node->NextSibling()) {
objNum++;
try {
// Get the name of the city
object = node->FirstChild("name")->ToElement();
if(object == NULL) throw 0;
cityString = object->FirstChild()->ToText();
if(cityString == NULL) throw 0;
//cityString = object->ToText();
cityName = cityString->Value();
// Get the X location
location = node->FirstChild("location")->ToElement();
if(location == NULL) throw 1;
object = location->FirstChild("x")->ToElement();
if(object == NULL) throw 1;
cityString = object->FirstChild()->ToText();
if(cityString == NULL) throw 1;
sscanf(cityString->Value(), "%d", &locX);
// Get the Z location
object = location->FirstChild("z")->ToElement();
if(object == NULL) throw 2;
cityString = object->FirstChild()->ToText();
if(cityString == NULL) throw 2;
sscanf(cityString->Value(), "%d", &locZ);
TempCity = new City(land, cityName, locX, locZ);
CityList.push_back(TempCity);
} catch(int j) {
switch (j) {
case 0:
Log::logger->message("Warning: Problem with Object Name.");
break;
case 1:
Log::logger->message("Warning: Problem with Object x Location.");
break;
case 2:
Log::logger->message("Warning: Problem with Object y Location.");
break;
default:
Log::logger->message("Warning: Problem with City Config file.");
break;
}
}
}
}
bool CityManager::CheckCity(const char *cityName) {
unsigned int i;
for(i = 0; i < CityList.size(); i++) {
if(CityList[i]->CheckName(cityName)) return true;
}
return false;
}

40
src/CityManager.h Normal file
View File

@ -0,0 +1,40 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*/
#ifndef _CITYMANAGER_H_
#define _CITYMANAGER_H_
#include <vector>
// Just so I do not have to include any defines
class EnvironmentObject;
class Player;
class City;
class Terrain;
using namespace std;
class CityManager {
public:
// Constructor!
CityManager(Terrain *land);
// Destructor
~CityManager();
// Methods
City* CheckCollision(Player *player);
void DisplayCities();
void MapDisplay();
bool CheckCity(const char *cityName);
private:
vector<City*> CityList;
void LoadCityConfig(const char *filename, Terrain *land);
};
#endif

302
src/Config.cpp Normal file
View File

@ -0,0 +1,302 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*/
#include <cstring>
#include <string.h>
#include <sstream>
#include <iostream>
#include "Log.h"
#include "Config.h"
#include "extensions.h"
#include "tinyxml.h"
using namespace std;
Config *Config::configuration = NULL;
Config::Config(const char *filename) {
TiXmlDocument doc(filename);
TiXmlElement* config;
TiXmlElement* resolution;
TiXmlElement* temp;
TiXmlText* data;
int n;
winWidth = 640;
winHeight = 480;
fullscreen = false;
useVBO = false;
SDLParachute = true;
CompressTextures = true;
doc.LoadFile();
if(doc.Error()) {
Log::logger->message("Warning: %s (line %d) Using defaults", doc.ErrorDesc(), doc.ErrorRow());
LogConfig();
return;
}
config = doc.FirstChildElement("GameConfiguration"); // This get's the <GameConfiguration> tag
if(config == NULL) {
Log::logger->message("Warning: <GameConfiguration> did not parse correctly.");
LogConfig();
return;
}
try {
resolution = config->FirstChildElement("Resoution"); // Get <resolution>
if(resolution == NULL) throw 0;
// Handle the resolution
temp = resolution->FirstChildElement("Width");
if(temp == NULL) throw 0;
data = temp->FirstChild()->ToText();
if(data == NULL) throw 1;
n = sscanf(data->Value(), "%d", &winWidth);
if(n != 1) throw 1;
temp = resolution->FirstChildElement("Height");
if(temp == NULL) throw 0;
data = temp->FirstChild()->ToText();
if(data == NULL) throw 2;
n = sscanf(data->Value(), "%d", &winHeight);
if(n != 1) throw 2;
} catch(int i) {
switch(i) {
case 0:
Log::logger->message("Warning: <Resolution> did not parse correctly");
break;
case 1:
Log::logger->message("Warning: Invalid <Width> data, using defaults");
break;
case 2:
Log::logger->message("Warning: Invalid <Height> data, using defaults");
break;
default:
// Should not get to here
Log::logger->message("Warning: Unknown <Resolution> error");
break;
}
// Set it back to the defaults
winWidth = 640;
winHeight = 480;
}
try {
// Handle Fullscreen
temp = config->FirstChildElement("Fullscreen");
if(temp == NULL) throw 0;
data = temp->FirstChild()->ToText();
if(data == NULL) throw 1;
if(strcmp(data->Value(), "true") == 0) {
fullscreen = true;
} else if(strcmp(data->Value(), "false") == 0) {
fullscreen = false;
} else {
throw 1;
}
} catch(int i) {
switch(i) {
case 0:
Log::logger->message("Warning: <Fullscreen> did not parse correctly");
break;
case 1:
Log::logger->message("Warning: Invalid Fullscreen data, using defaults");
break;
default:
// Should not get here
Log::logger->message("Warning: Unknown <Fullscreen> error");
break;
}
}
try {
// Handle Vertex buffer objects
temp = config->FirstChildElement("VBO");
if(temp == NULL) throw 0;
data = temp->FirstChild()->ToText();
if(data == NULL) throw 1;
if(strcmp(data->Value(), "true") == 0) {
useVBO = true;
} else if(strcmp(data->Value(), "false") == 0) {
useVBO = false;
} else {
throw 1;
}
} catch(int i) {
switch(i) {
case 0:
Log::logger->message("Warning: Invalid <VBO> did not parse correctly");
break;
case 1:
Log::logger->message("Warning: Invalid VBO data, using defaults");
break;
default:
// Should not get here
Log::logger->message("Warning: Unknown <VBO> error");
break;
}
}
try {
// Deal with SDLParachute
temp = config->FirstChildElement("SDLParachute");
if(temp == NULL) throw 0;
data = temp->FirstChild()->ToText();
if(data == NULL) throw 1;
if(strcmp(data->Value(), "true") == 0) {
SDLParachute = true;
} else {
throw 1;
}
} catch(int i) {
switch(i) {
case 0:
Log::logger->message("Warning: <SDLParachute> did not parse correctly");
break;
case 1:
Log::logger->message("Warning: Invalid SDLParachute data, using default");
break;
default:
// We should not get here....
Log::logger->message("Warning: Unknown <SDLParachute> error");
break;
}
}
try {
// Deal with CompressTextures
temp = config->FirstChildElement("CompressTextures");
if(temp == NULL) throw 0;
data = temp->FirstChild()->ToText();
if(data == NULL) throw 1;
if(strcmp(data->Value(), "false") == 0) {
CompressTextures = true;
} else if(strcmp(data->Value(), "false") == 0) {
CompressTextures = false;
} else {
throw 1;
}
} catch(int i) {
switch(i) {
case 0:
Log::logger->message("Warning:CompressTextures> did not parse correctly");
break;
case 1:
Log::logger->message("Warning: invalid CompressTexture data, using default");
break;
default:
// Shouldn't get here
Log::logger->message("Warning: Unknown <CompressTexture> error");
break;
}
}
LogConfig();
}
// Doesn't realy need to do anything.
Config::~Config() {
}
// This needs to happen after we have an openGL context, so it can not happen in the constructor
bool Config::checkExtensions() {
// This could probably be nicer.
bool supportMultiTex = checkExtension("GL_ARB_multitexture");
bool supportVBO = checkExtension("GL_ARB_vertex_buffer_object");
// Make sure we have support for multitexturing.
if(!supportMultiTex) {
// Probably should just throw an exeption.
Log::logger->message("Error: Your video card is crap and does not support multitexturing");
return false;
}
// Make sure we do not try to use vertex buffer objects without support
if(!supportVBO && useVBO) {
useVBO = false;
Log::logger->message("Warning: Your video card does not support VBOs, falling back onto VAs");
}
// We have multitexturing so we can continue forth.
return true;
}
bool Config::checkVBO() {
return useVBO;
}
int Config::getWinWidth() {
return winWidth;
}
int Config::getWinHeight() {
return winHeight;
}
bool Config::checkFullscreen() {
return fullscreen;
}
bool Config::checkSDLParachute() {
return SDLParachute;
}
bool Config::checkCompressTextures() {
return CompressTextures;
}
bool Config::openConfig(const char *filename) {
if(configuration != NULL) {
Log::logger->message("Warning: Open config on non-NULL configuration");
return false;
}
configuration = new Config(filename);
return true;
}
void Config::closeConfig() {
if (configuration == NULL) {
Log::logger->message("Warning: Close config on NULL configuration");
return;
}
delete configuration;
configuration = NULL;
}
void Config::LogConfig() {
ostringstream outputString;
outputString << "Configuration:" << endl;
outputString << "Resolution: " << winWidth << " x " << winHeight << endl;
outputString << "Fullscreen: ";
if(fullscreen) outputString << "true";
else outputString << "false";
outputString << endl;
outputString << "Use VBOs: ";
if(useVBO) outputString << "true";
else outputString << "false";
outputString << endl;
outputString << "Enable SDL Parachute: ";
if(SDLParachute) outputString << "true";
else outputString << "false";
outputString << endl;
outputString << "Compress Textures: ";
if(CompressTextures) outputString << "true";
else outputString << "false";
Log::logger->message(outputString.str());
}

59
src/Config.h Normal file
View File

@ -0,0 +1,59 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*/
class Config {
public:
//constructor
Config(const char *filename);
// Destructor
~Config();
// Make sure the necesary extensions are supported, this needs to happen after we have an openGL context.
bool checkExtensions();
// Check to see whether or not to use Vertex Buffer Objects
bool checkVBO();
// Returns winWidth/winHeight
int getWinWidth();
int getWinHeight();
// check to see whether or not to go fullscreen
bool checkFullscreen();
// Check to see whether or not to enable the SDL parachute
bool checkSDLParachute();
// Check to see whether or not to compress textures
bool checkCompressTextures();
static bool openConfig(const char *filename);
static void closeConfig();
static Config *configuration;
private:
// Window dimensions
int winWidth;
int winHeight;
// True is fullscreen, false is windowed mode.
bool fullscreen;
// bool for vertex buffer object usage
bool useVBO;
// Boolian to see whether or not we should enable the SDL parachute
// This should probably be true unless you want to get a core file or something stupid
bool SDLParachute;
// Boolian to see whether or not to compress textures on load
// This should probably always be true, unless your video card can not handle it
bool CompressTextures;
// Sending config options to logger
void LogConfig();
};

237
src/Economy.cpp Normal file
View File

@ -0,0 +1,237 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*/
#ifdef WIN32
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#endif
#include <string>
#include <SDL/SDL.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include "Player.h"
#include "Cargo.h"
#include "Product.h"
#include "Log.h"
#include "tinyxml.h"
#include "CityManager.h"
#include "CityEconomy.h"
#include "Economy.h"
using namespace std;
Economy *Economy::Econ = NULL;
Economy::Economy(const char* filename) {
TiXmlNode* Products;
TiXmlNode* ForProducts;
TiXmlElement* Prod;
TiXmlText* data;
string prodName;
doc.LoadFile(filename);
if(doc.Error()) {
Log::logger->message("Error: Could not open Economy file.\n");
exit(-1);
}
Products = doc.FirstChild("Products");
for(ForProducts = Products->FirstChildElement("Name");
ForProducts;
ForProducts = ForProducts->NextSibling("Name")) {
if(ForProducts == NULL) throw -1;
Prod = ForProducts->ToElement();
data = Prod->FirstChild()->ToText();
prodName = data->Value();
ProdList.push_back(prodName);
}
}
Economy::~Economy() {
unsigned int i;
CityEconomy* temp;
for(i = 0; i < CityList.size(); i++) {
temp = (CityEconomy*)CityList[i];
delete temp;
}
CityList.clear();
}
bool Economy::CreateEcon() {
if(Econ != NULL) {
Log::logger->message("Warning: Multiple calls to CreateEcon()");
return false;
}
Econ = new Economy("data/Product.xml");
return true;
}
void Economy::Step() {
}
void Economy::Print() {
unsigned int i;
CityEconomy* temp;
for(i = 0; i < CityList.size(); i++) {
temp = (CityEconomy*) CityList[i];
temp->Print();
}
}
CityEconomy* Economy::CreateCity(const char* CityName) {
TiXmlNode* City;
TiXmlElement* CityElement;
TiXmlElement* Prod;
TiXmlElement* Value;
TiXmlElement* Demand;
TiXmlText* data;
TiXmlNode* node;
Product* tempProduct;
vector<Product*> ProductList;
CityEconomy* tempCE;
string name;
string cityName;
float price;
int demand;
int proNum;
int n;
int ID;
EconomyNode = doc.FirstChild("Economy");
for(City = EconomyNode->FirstChildElement("City");
City;
City = City->NextSibling("City")) {
if(City == NULL) throw -1;
CityElement = City->ToElement();
cityName = CityElement->Attribute("name");
if(cityName == CityName) {
for(node = City->FirstChild("Product"); node; node = node->NextSibling("Product")) {
if(node == NULL) throw 0;
proNum++;
try {
Prod = node->FirstChildElement("Name");
if(Prod == NULL) throw 1;
data = Prod->FirstChild()->ToText();
if(data == NULL) throw 1;
name = data->Value();
ID = FindID(name);
Value = node->FirstChildElement("Value");
if(Value == NULL) throw 2;
data = Value->FirstChild()->ToText();
if(data == NULL) throw 2;
n = sscanf(data->Value(), "%f", &price);
if(n == -1) {
Log::logger->message("Error: Bad XML document.\n");
throw 2;
}
Demand = node->FirstChildElement("Demand");
if(Demand == NULL) throw 3;
data = Demand->FirstChild()->ToText();
if(data == NULL) throw 3;
n = sscanf(data->Value(), "%i", &demand);
if(n == -1) throw 3;
tempProduct = new Product(ID, price, demand);
ProductList.push_back(tempProduct);
} catch(int i) {
switch (i) {
case 0:
Log::logger->message("Warning: <Product> did not parse correctly.");
break;
case 1:
Log::logger->message("Warning: <Name> did not parse correctly.");
City->Print(stdout, 0);
break;
case 2:
Log::logger->message("Warning: <Value> did not parse correctly.");
City->Print(stdout, 0);
break;
case 3:
Log::logger->message("Warning: <Demand> did not parse correctly.");
City->Print(stdout, 0);
break;
default:
Log::logger->message("Warning: Unknown error occured.\n");
break;
}
} // Catch (int i)
} // for loop
tempCE = new CityEconomy(cityName.c_str(), ProductList);
ProductList.clear();
CityList.push_back(tempCE);
break;
} // if(cityName == CityName)
} // For loop
return tempCE;
}
bool Economy::CheckCities(CityManager* tempManager) {
unsigned int i;
for(i = 0; i < CityList.size(); i++) {
if(!tempManager->CheckCity(CityList[i]->getCityName().c_str()))
return false;
}
return true;
}
int Economy::ProductCount() {
return (int)ProdList.size();
}
void Economy::BuyProduct(Player *data, int ProdID, float price) {
Cargo *playerCargo = data->getCargo();
try {
// Make sure the player can afford it, and has room for it
if((data->gold < price) || (playerCargo->getAvailQty() <= 0)) return;
playerCargo->addQty(ProdID, 1);
data->gold -= (int) price;
Log::logger->message("Purchased %s", ProdList[ProdID].c_str());
} catch (const char *e) {
Log::logger->message(e);
}
}
void Economy::SellProduct(Player *data, int ProdID, float price) {
Cargo *playerCargo = data->getCargo();
try {
if(playerCargo->getQty(ProdID) <= 0) return;
playerCargo->addQty(ProdID, -1);
data->gold += (int) price;
Log::logger->message("Sold %u", ProdList[ProdID].c_str());
} catch (const char *e) {
Log::logger->message(e);
}
}
int Economy::FindID(string Name) {
unsigned int i;
for(i = 0; i < ProdList.size(); i++) {
if(ProdList[i] == Name) return (int) i;
}
return -1;
}

76
src/Economy.h Normal file
View File

@ -0,0 +1,76 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
* ---------------------------------------------------------------------------
* The Economy class is the top level of all the
* economies present in Lephisto. It is the authority
* on how products and prices change.
*
* After the creation of the Economy, the economy
* doesn't interact much with other classes. Each
* City will have a pointer to an element within
* the economy so the city can access and change
* the information if it wants to. The only thing that
* needs to be called is Step() once and a while
* so that the Economy will actualy change.
*/
#ifndef _ECONOMY_H_
#define _ECONOMY_H_
#include <vector>
#include <string>
#include "tinyxml.h"
//class Product;
class CityManager;
class CityEconomy;
class Player;
using namespace std;
class Economy {
public:
/* Constructor
* the constructor creates the Economy and opens
* the file in filename. It does not create the
* CityEconomies, they are created using CreateCity.
* This allows a basic error checking system so that
* there aren't cities within Economies and no
* Economies without cities.
*/
Economy(const char* filename);
// destructor
~Economy();
// Methods
bool CreateEcon(); // This creates the Economy for the static Economy
// This changes the state of the economy
void Step();
void Print();
CityEconomy* CreateCity(const char* CityName);
static Economy* Econ;
bool CheckCities(CityManager* tempManager);
int ProductCount();
void BuyProduct(Player *data, int ProdID, float price);
void SellProduct(Player *data, int ProdID, float price);
vector<string> ProdList;
private:
int FindID(string Name);
vector<CityEconomy*> CityList;
TiXmlDocument doc;
TiXmlNode* EconomyNode;
};
#endif

50
src/EnvironmentObject.cpp Normal file
View File

@ -0,0 +1,50 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*/
/*
* This class is a parent to any object which may apear
* in the game. Initialy the things that I can think of now
* would be cities, hidden treasures, and maybe enemy ships.
*/
#include <string>
#include "ccmath.h"
#include "EnvironmentObject.h"
using namespace std;
EnvironmentObject::EnvironmentObject() {
locX = 0;
locZ = 0;
visible = false;
name = "";
}
EnvironmentObject::~EnvironmentObject() {
}
EnvironmentObject::EnvironmentObject(string objName, int objLocX, int objLocZ, bool objVisible) {
locX = objLocX;
locZ = objLocZ;
visible = objVisible;
name = objName;
}
string EnvironmentObject::getName() {
return name;
}
float EnvironmentObject::calcDist(float x, float z) {
return sqrt((x-locX)+(x-locX)+(z-locZ)*(z-locZ));
}
float EnvironmentObject::calcAngle(float x, float z) {
// Um, don't ask.
float angle = atan2(locZ - z, x - locX);
// atan2 returns from -PI to PI, so move 0 to 2*PI
if(angle < 0) angle = 2*M_PI + angle;
return angle;
}

42
src/EnvironmentObject.h Normal file
View File

@ -0,0 +1,42 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*/
#ifndef _ENVIRONMENTOBJECT_H_
#define _ENVIRONMENTOBJECT_H_
#include <string>
using namespace std;
class EnvironmentObject {
public:
// Construction is underway!
EnvironmentObject();
EnvironmentObject(string objName, int objLocX, int objLocZ, bool objVisible);
// No idea why this is needed here but not in GameState
virtual ~EnvironmentObject() = 0;
// Returns the name of the object.
string getName();
// Returns distance from (x, z) to object
float calcDist(float x, float z);
// Return angle in radians from (x, z) to object
float calcAngle(float x, float z);
virtual void DisplayObject() = 0;
protected:
int locX;
int locZ;
bool visible;
string name;
private: // ?
};
#endif

135
src/Frustum.cpp Normal file
View File

@ -0,0 +1,135 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*/
#if defined WIN32
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#endif
#include <GL/gl.h>
#include "Point.h"
#include "BoundBox.h"
#include "Frustum.h"
void Frustum::getFrustum() {
float proj[16];
float modl[16];
float clip[16];
//float t;
// Get the current PROJECTION matrix
glGetFloatv(GL_PROJECTION_MATRIX, proj);
// Get the current MODELVIEW matrix
glGetFloatv(GL_MODELVIEW_MATRIX, modl);
// Combine the two matrices (multiply projection by modelview)
clip[0] = modl[0]*proj[0] + modl[1]*proj[4] + modl[2]*proj[8] + modl[3]*proj[12];
clip[1] = modl[0]*proj[1] + modl[1]*proj[5] + modl[2]*proj[9] + modl[3]*proj[13];
clip[2] = modl[0]*proj[2] + modl[1]*proj[6] + modl[2]*proj[10] + modl[3]*proj[14];
clip[3] = modl[0]*proj[3] + modl[1]*proj[7] + modl[2]*proj[11] + modl[3]*proj[15];
clip[4] = modl[4]*proj[0] + modl[5]*proj[4] + modl[6]*proj[8] + modl[7]*proj[12];
clip[5] = modl[4]*proj[1] + modl[5]*proj[5] + modl[6]*proj[9] + modl[7]*proj[13];
clip[6] = modl[4]*proj[2] + modl[5]*proj[6] + modl[6]*proj[10] + modl[7]*proj[14];
clip[7] = modl[4]*proj[3] + modl[5]*proj[7] + modl[6]*proj[11] + modl[7]*proj[15];
clip[8] = modl[8]*proj[0] + modl[9]*proj[4] + modl[10]*proj[8] + modl[11]*proj[12];
clip[9] = modl[8]*proj[1] + modl[9]*proj[5] + modl[10]*proj[9] + modl[11]*proj[13];
clip[10] = modl[8]*proj[2] + modl[9]*proj[6] + modl[10]*proj[10] + modl[11]*proj[14];
clip[11] = modl[8]*proj[3] + modl[9]*proj[7] + modl[10]*proj[11] + modl[11]*proj[15];
clip[12] = modl[12]*proj[0] + modl[13]*proj[4] + modl[14]*proj[8] + modl[15]*proj[12];
clip[13] = modl[12]*proj[1] + modl[13]*proj[5] + modl[14]*proj[9] + modl[15]*proj[13];
clip[14] = modl[12]*proj[2] + modl[13]*proj[6] + modl[14]*proj[10] + modl[15]*proj[14];
clip[15] = modl[12]*proj[3] + modl[13]*proj[7] + modl[14]*proj[11] + modl[15]*proj[15];
// Extract the numbers for the RIGHT plane
frustum[0][0] = clip[3] - clip[0];
frustum[0][1] = clip[7] - clip[4];
frustum[0][2] = clip[11] - clip[8];
frustum[0][3] = clip[15] - clip[12];
// Normalize the result (not needed for boxes)
/*
t = sqrt(frustum[0][0]*frustum[0][0] + frustum[0][1]*frustum[0][1] + frustum[0][2]*frustum[0][2]);
frustum[0][0] /= t;
frustum[0][1] /= t;
frustum[0][2] /= t;
frustum[0][3] /= t;
*/
// Extract the numbers for the LEFT plane
frustum[1][0] = clip[3] + clip[0];
frustum[1][1] = clip[7] + clip[4];
frustum[1][2] = clip[11] + clip[ 8];
frustum[1][3] = clip[15] + clip[12];
// Normalize the result (not needed for boxes)
// Extract the BOTTOM plane
frustum[2][0] = clip[3] + clip[1];
frustum[2][1] = clip[7] + clip[5];
frustum[2][2] = clip[11] + clip[9];
frustum[2][3] = clip[15] + clip[13];
// Normalize the result (not needed for boxes)
// Extract the TOP plane
frustum[3][0] = clip[3] - clip[1];
frustum[3][1] = clip[7] - clip[5];
frustum[3][2] = clip[11] - clip[ 9];
frustum[3][3] = clip[15] - clip[13];
// Normalize the result (not needed for boxes)
// Extract the FAR plane
frustum[4][0] = clip[3] - clip[2];
frustum[4][1] = clip[7] - clip[6];
frustum[4][2] = clip[11] - clip[10];
frustum[4][3] = clip[15] - clip[14];
// Normalize the result (not needed for boxes)
// Extract the NEAR plane
frustum[5][0] = clip[3] + clip[2];
frustum[5][1] = clip[7] + clip[6];
frustum[5][2] = clip[11] + clip[10];
frustum[5][3] = clip[15] + clip[14];
// Normalize the result (not needed for boxes)
}
bool Frustum::checkBox(BoundBox *box) {
// Check each frustum plane
for(int p=0; p<6; p++) {
// Check each point of the box
// Bottom points
if(frustum[p][0]*box->b1->x + frustum[p][1]*box->b1->y + frustum[p][2]*box->b1->z + frustum[p][3] > 0)
continue;
if(frustum[p][0]*box->b2->x + frustum[p][1]*box->b2->y + frustum[p][2]*box->b2->z + frustum[p][3] > 0)
continue;
if(frustum[p][0]*box->b3->x + frustum[p][1]*box->b3->y + frustum[p][2]*box->b3->z + frustum[p][3] > 0)
continue;
if(frustum[p][0]*box->b4->x + frustum[p][1]*box->b4->y + frustum[p][2]*box->b4->z + frustum[p][3] > 0)
continue;
// Top points
if(frustum[p][0]*box->t1->x + frustum[p][1]*box->t1->y + frustum[p][2]*box->t1->z + frustum[p][3] > 0)
continue;
if(frustum[p][0]*box->t2->x + frustum[p][1]*box->t2->y + frustum[p][2]*box->t2->z + frustum[p][3] > 0)
continue;
if(frustum[p][0]*box->t3->x + frustum[p][1]*box->t3->y + frustum[p][2]*box->t3->z + frustum[p][3] > 0)
continue;
if(frustum[p][0]*box->t4->x + frustum[p][1]*box->t4->y + frustum[p][2]*box->t4->z + frustum[p][3] > 0)
continue;
// It's not in front of ANY plane, return false
return false;
}
// Got through all the checks, it passed
return true;
}

23
src/Frustum.h Normal file
View File

@ -0,0 +1,23 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*/
#ifndef _FRUSTUM_H_
#define _FRUSTUM_H_
class BoundBox;
// Frustum used for culling quadtree
class Frustum {
public:
// Extracts projection data
void getFrustum();
bool checkBox(BoundBox *box);
private:
float frustum[6][4];
};
#endif

195
src/GameState.cpp Normal file
View File

@ -0,0 +1,195 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*/
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <SDL/SDL.h>
#include "Log.h"
#include "Config.h"
#include "image.h"
#include "font.h"
#include "GameState.h"
using namespace std;
GameState *GameState::mainMenu = NULL;
GameState **GameState::currentPtr = NULL;
unsigned char GameState::nextScreen = 0;
GameState::GameState(GameState *prev) {
previous = prev;
}
// Destructor
// This has basicaly nothing to do.
GameState::~GameState() {
}
// Static function to set mainMenu pointer
void GameState::setMainMenu(GameState *menu) {
if((menu != NULL) && (mainMenu != NULL)) {
Log::logger->message("Warning: setMainMenu called with non-null mainMenu pointer");
}
mainMenu = menu;
}
// static function to set currentPtr pointer
void GameState::setCurrentPtr(GameState **current) {
if(currentPtr != NULL) {
Log::logger->message("Warning: setCurrentPtr called with non-null currentPtr pointer");
}
currentPtr = current;
}
void GameState::doExit() {
// The MainMenu object needs to overload this
if (mainMenu != NULL) {
mainMenu->doExit();
}
}
#if SDL_BYTEORDER == SDL_LIL_ENDIAN
const Uint32 Rmask = 0xFF,
Gmask = 0xFF<<8,
Bmask = 0xFF<<(2*8),
Amask = 0xFF<<(3*8);
#else
const Uint32 Rmask = 0xFF<<(3*8),
Gmask = 0xFF<<(2*8),
Bmask = 0xFF<<8,
Amask = 0xFF;
#endif
void GameState::takeScreenshot() {
//char buf[strlen("screenshotXXX.bmp")+1]; Need to look at this doesn't compile under vs for windows
char buf[18];
FILE* fp;
unsigned count = nextScreen;
//int width = Config::configuration->getWinWidth();
//int height = Config::configuration->getWinHeight();
while(1) {
if(count > 255) {
Log::logger->message("Error: All 256 screenshot names are taken, could not take screenshot");
return;
}
#ifdef WIN32
_snprintf(buf,strlen("screenshotXXX.bmp")+1,"Screenshot%u.bmp",count);
#endif
snprintf(buf,strlen("screenshotXXX.bmp")+1,"Screenshot%u.bmp",count);
// Check to see if the file already exists
if(!(fp = fopen(buf,"r")))
// The file does not exist, so may as well use it.
break;
fclose(fp);
++count;
}
nextScreen = count;
// Ginto is currently trying to make this work
// TODO: get openGL pixel data into a texture, then get pixel data from texture
int w = Config::configuration->getWinWidth(),h = Config::configuration->getWinHeight();
// get previous frame, because the current may not have been drawn yet
glReadBuffer(GL_FRONT);
Uint32* pixels = new Uint32[w*h];
glReadPixels(0,0,w,h,GL_RGBA,GL_UNSIGNED_BYTE,pixels);
// flip image vertically because GL normally gives pixels upside down
Uint32* tmpBuf = new Uint32[w];
for(int y=0;y<h/2;++y) {
memcpy(tmpBuf,pixels+y*w,w*sizeof(Uint32));
memcpy(pixels+y*w,pixels+(h-y-1)*w,w*sizeof(Uint32));
memcpy(pixels+(h-y-1)*w,tmpBuf,w*sizeof(Uint32));
}
delete tmpBuf;
SDL_Surface* img = SDL_CreateRGBSurfaceFrom(pixels,w,h,32,w*4,Rmask,Gmask,Bmask,Amask);
SDL_SaveBMP(img,buf);
SDL_FreeSurface(img);
delete pixels;
// if(!(fp = fopen(buf,"w"))) {
// Log::logger->message("could not open screenshot file for writing");
// return;
// }
}
void GameState::switchState(GameState *next, GameState *prev) {
// Prepare to leave this state
switchFrom();
// Set the next state's previous pointer, if it's not NULL
// If it is null, just leave the previous pointer alone
if(prev != NULL) {
next->previous = prev;
}
// Prepare to enter the next state
next->switchTo(prev);
// Hand control over to the next state
*currentPtr = next;
}
void GameState::displaySplashScreen(string imageFile, string text, float shade) {
GLuint loadingTexture;
// Temp storage for window width and height
int width = Config::configuration->getWinWidth();
int height = Config::configuration->getWinHeight();
// Show the loading screen
// Get ready for text mode
EnterTextMode(width, height);
glEnable(GL_TEXTURE_2D);
BuildTexture(imageFile.c_str(), &loadingTexture, GL_CLAMP, false);
glBindTexture(GL_TEXTURE_2D, loadingTexture);
// Clear the depth buffer
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
// Set the color
glColor3f(shade, shade, shade);
// Draw the actual background quad
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex3f(0, 0, 0);
glTexCoord2f(0, 1);
glVertex3f(0, height, 0);
glTexCoord2f(1, 1);
glVertex3f(width, height, 0);
glTexCoord2f(1, 0);
glVertex3f(width, 0, 0);
glEnd();
// Draw the text
glTranslatef(0, (float) height * .5 - (16/2), 0);
glTranslatef(width * 0.5 - (text.length() * 10 / 2), 0, 0);
glColor3f(0, 0, 1);
glPrint(text.c_str(), 0);
SDL_GL_SwapBuffers();
// Done with the texture so get shut of it
glDeleteTextures(1, &loadingTexture);
}

60
src/GameState.h Normal file
View File

@ -0,0 +1,60 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*/
#ifndef _GAMESTATE_H_
#define _GAMESTATE_H_
#include <string>
class GameState {
public:
// Constructor
GameState(GameState *prev);
// Need a virtual destructor to make sure the proper destructor get's called.
virtual ~GameState() = 0;
// Initialize the mainMenu pointer
// This only needs to happen once per execution
static void setMainMenu(GameState *menu);
// Initialize the currentPtr
// This only needs to happen once per execution
static void setCurrentPtr(GameState **current);
// Main state loop
virtual void loop() = 0;
// Call this to exit
virtual void doExit();
protected:
GameState *previous;
// All states share these pointers, so make them static
static GameState *mainMenu;
static GameState **currentPtr;
// For screenshots
static unsigned char nextScreen;
// Save a screenshot to disk
void takeScreenshot();
// Display a splash screen
void displaySplashScreen(std::string imageFile, std::string text, float shade);
// Switch to next, giving prev as the previous state
virtual void switchState(GameState *next, GameState *prev);
private:
// Things to do when switching to this state from oldState
virtual void switchTo(GameState *oldState) = 0;
// Things to do when switching from this state
virtual void switchFrom() = 0;
};
#endif

102
src/Log.cpp Normal file
View File

@ -0,0 +1,102 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*/
#include <iostream>
#include <fstream>
#include <string>
#include <ctime>
#include <cstdarg>
#include "Log.h"
using namespace std;
Log *Log::logger = NULL;
Log::Log(bool logToFile) {
time_t timestamp;
if(logToFile) {
logFile.open("Lephisto.log", ios::out);
if(!logToFile) {
// We can not open log file.
cerr << "Warning: Cannot open error.log for write, continuing without logging\n";
} else {
// Log file is open, let's give it a nice time stamp.
timestamp = time(NULL);
logFile << "Log Started: " << ctime(&timestamp) << endl;
}
}
}
Log::~Log() {
time_t timestamp;
// We only realy need to close logFile if it is already open.
if(logFile) {
// Give it a pretty closeing timestamp
timestamp = time(NULL);
logFile << endl << "Log Closed: " << ctime(&timestamp) << endl;
// Close log file
logFile.close();
}
}
void Log::message(std::string msg) {
if(logFile) {
logFile << msg << endl << endl;
}
cerr << msg << endl << endl;
}
void Log::message(const char *msg, ...) {
va_list vargList; // This is to handlle the variable arguments
char outBuf[1024];
unsigned short outLen;
// This takes the arguments and puts them into the character array.
va_start(vargList, msg);
#if defined WIN32
outLen = _vsnprintf(outBuf, sizeof(outBuf), msg, vargList);
#else
outLen = vsnprintf(outBuf, sizeof(outBuf), msg, vargList);
#endif
va_end(vargList);
if(outLen >= sizeof(outBuf)) {
outLen = sizeof(outBuf);
}
if(logFile) {
logFile << outBuf << endl;
}
cerr << outBuf << endl;
}
bool Log::openLog(bool logToFile) {
// Make sure the logger has not already been initialized.
if(logger != NULL) {
logger->message("Warning: Multiple calls to OpenLog()");
return false;
}
logger = new Log(logToFile);
return true;
}
void Log::closeLog() {
if(logger == NULL) {
cerr << "Warning: Call to closeLog with NULL logger pointer" << endl;
return;
}
delete logger;
logger = NULL;
}

33
src/Log.h Normal file
View File

@ -0,0 +1,33 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*/
#ifndef _LOG_H_
#define _LOG_H_
#include <fstream>
#include <string>
class Log {
public:
// Construtor
Log(bool logToFile);
// Deconstructor
~Log();
// Log an error message
void message(std::string msg);
void message(const char *msg, ...);
static bool openLog(bool logToFile);
static void closeLog();
static Log *logger;
private:
std::ofstream logFile;
};
#endif

158
src/MainMenu.cpp Normal file
View File

@ -0,0 +1,158 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*/
#if defined WIN32
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#endif
#include <cstdlib>
#include <SDL/SDL.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include "Config.h"
#include "image.h"
#include "Log.h"
#include "font.h"
#include "GameState.h"
#include "StateSailing.h"
#include "Menu.h"
#include "Callback.h"
#include "MainMenu.h"
MainMenu::MainMenu(bool *doneIn): GameState(NULL) {
displaySplashScreen("./data/title.png", "", 1);
// Set the static Gamestate mainMenu pointer to this
GameState::setMainMenu(this);
// Bool value to set to quit
done = doneIn;
// Set the pointer to the main sailing state to null
mainGame = NULL;
// Ahh.. this is better --Allanis
cont_callback.SetCallback(this, &MainMenu::continueGame);
new_callback.SetCallback(this, &MainMenu::newGame);
save_callback.SetCallback(this, &MainMenu::saveGame);
load_callback.SetCallback(this, &MainMenu::loadGame);
exit_callback.SetCallback(this, &MainMenu::exit);
menu = new Menu("./data/background.png", NULL, this);
menu->addList("Menu", 0, .4);
menu->addMenuItem("Continue Game", &cont_callback, "Menu", false);
menu->addMenuItem("New Game", &new_callback, "Menu", true);
menu->addMenuItem("Save Game", &save_callback, "Menu", false);
menu->addMenuItem("Load Game", &load_callback, "Menu", true);
menu->addMenuItem("Exit", &exit_callback, "Menu", true);
/*
if(!LoadOgg(".data/title.ogg", &buffer)) {
Log::logger->message("Could not load data/title.ogg");
}
SetListener();
source = GenSource(buffer);
alSourcePlay(source);
*/
Log::logger->message("MainMenu initialised");
}
MainMenu::~MainMenu() {
if(previous == mainGame) previous = NULL;
delete mainGame;
delete menu;
// Delete buffer and source
/*
alSourceStop(source);
alDeleteSources(1, &source);
alDeleteBuffers(1, &buffer);
*/
// Set the static GameState mainMenu back to NULL
GameState::setMainMenu(NULL);
Log::logger->message("MainMenu deleted");
}
void MainMenu::loop() {
menu->loop();
}
void MainMenu::doExit() {
*done = true;
}
void MainMenu::switchTo(GameState *oldState) {
if(previous == NULL) {
menu->changeEnabled("Continue Game", "Menu", false);
menu->changeEnabled("Save Game", "Menu", false);
} else {
menu->changeEnabled("Continue Game", "Menu", true);
menu->changeEnabled("Save Game", "Menu", true);
}
menu->switchTo(oldState);
/*
SetListener();
alSourcePlay(source);
*/
}
void MainMenu::switchFrom() {
//alSourceStop(source);
//music.
}
void MainMenu::continueGame(int i) {
if(previous != NULL) {
switchState(previous, NULL);
}
}
void MainMenu::newGame(int i) {
// New game
if(mainGame == NULL) {
// Create a new game
mainGame = new StateSailing();
} else {
// Just reset existing game
mainGame->newGame();
}
switchState(mainGame, NULL);
}
void MainMenu::saveGame(int i) {
// Save the game
// Once I allow multiple save games this will need to change
//Should not try to save if the game has not even started
if(mainGame != NULL) {
mainGame->saveGame();
switchState(mainGame, NULL);
}
}
void MainMenu::loadGame(int i) {
if(mainGame == NULL) {
// Need to initialize the gamestate
mainGame = new StateSailing();
}
// Load the game
mainGame->loadGame();
// Now switch to game mode
switchState(mainGame, NULL);
}
void MainMenu::exit(int ID) {
doExit();
}

63
src/MainMenu.h Normal file
View File

@ -0,0 +1,63 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*/
#ifndef _MAINMENU_H_
#define _MAINMENU_H_
#include <SDL/SDL.h>
#include <AL/al.h>
#include "GameState.h"
#include "Callback.h"
#include "Menu.h"
// So I don't have to include the headers
class StateSailing;
class MainMenu: public GameState {
public:
// Constructor
MainMenu(bool *doneIn);
// Destructor
~MainMenu();
// Need to implement the loop function
void loop();
// Need to implement the switchTo function
void switchTo(GameState *oldState);
// Need to implement the switchFrom function
void switchFrom();
// Override the exit function
void doExit();
// Callback functions
void continueGame(int i);
void newGame(int i);
void saveGame(int i);
void loadGame(int i);
void exit(int i);
private:
// Set to false to exit
bool *done;
// Main sailing game state
StateSailing *mainGame;
// Menu class
Menu *menu;
// Callback functions
TCallback<MainMenu> cont_callback;
TCallback<MainMenu> new_callback;
TCallback<MainMenu> save_callback;
TCallback<MainMenu> load_callback;
TCallback<MainMenu> exit_callback;
};
#endif

25
src/Makefile Normal file
View File

@ -0,0 +1,25 @@
CC = g++
CFLAGS = -ansi -Wall -g
LDADD = -lGL -lGLU -lpthread -lSDL -lSDL_image -lopenal -lalut -lvorbisfile -L/usr/X11
objects = BoundBox.o Camera.o City.o CityEconomy.o CityManager.o Config.o \
Economy.o EnvironmentObject.o Frustum.o GameState.o Log.o MainMenu.o \
Map.o Menu.o Model.o Ocean.o Player.o Point.o Product.o QuadBox.o \
QuadNode.o Ships.o SkyBox.o StateBattle.o StateCity.o \
StateSailing.o Terrain.o Wave.o WaveEmitter.o collisions.o \
extensions.o font.o image.o normals.o Cargo.o \
tinystr.o tinyxml.o tinyxmlerror.o tinyxmlparser.o
.PHONY: default all clean
default: all
%.cpp: %.h
%.o: %.cpp
$(CC) $(CFLAGS) -c -o $@ $<
all: $(objects)
clean:
rm -f $(objects)

240
src/Map.cpp Normal file
View File

@ -0,0 +1,240 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*/
#ifdef WIN32
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#endif
#include <cstdlib>
#include <SDL/SDL.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include "Log.h"
#include "Config.h"
#include "image.h"
#include "font.h"
#include "GameState.h"
#include "StateSailing.h"
#include "Player.h"
#include "Map.h"
#include "CityManager.h"
Map::Map(StateSailing *curGame, Player *playerPos) : GameState(curGame) {
winWidth = Config::configuration->getWinWidth();
winHeight = Config::configuration->getWinHeight();
// Set the pointer to the main sailing state to null
mainGame = NULL;
PlayerMap = playerPos;
// Load the background
glEnable(GL_TEXTURE_2D);
BuildTexture("./data/mapscreen.png", &map_background, GL_CLAMP, false);
glBindTexture(GL_TEXTURE_2D, map_background);
curMousePosX = 0;
curMousePosY = 0;
info = false;
transport = false;
}
Map::~Map() {
glDeleteTextures(1, &map_background);
}
void Map::loop() {
// Draw the scene
display();
// Process incoming events
processEvents();
}
void Map::display() {
float screenX, screenY;
float multi;
StateSailing* tempState;
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
// Draw the background
// Bind the background texture
glBindTexture(GL_TEXTURE_2D, map_background);
// Set the color
glColor3f(.6, .6, .6);
// Draw the actual background quad
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex3f(0, 0, 0);
glTexCoord2f(0, 1);
glVertex3f(0, winHeight, 0);
glTexCoord2f(1, 1);
glVertex3f(winWidth, winHeight, 0);
glTexCoord2f(1, 0);
glVertex3f(winWidth, 0, 0);
glEnd();
// Need to display the ship somehow!
multi = winWidth / 812.0;
screenX = (winWidth / 2) + (PlayerMap->x * multi);
multi = winHeight / 500.0;
screenY = (winHeight / 2) + (PlayerMap->z * multi);
glColor3f(0, 1, 1); // This is the color of the X
glLineWidth(3.0);
glBegin(GL_LINES);
glVertex3f(screenX - 5.0, screenY + 5.0, 0);
glVertex3f(screenX + 5.0, screenY - 5.0, 0);
glVertex3f(screenX - 5.0, screenY - 5.0, 0);
glVertex3f(screenX + 5.0, screenY + 5.0, 0);
glEnd();
glLineWidth(1.0);
// Draw the text -- This is for debugging!
if(info) {
glTranslatef(0, (float) winHeight * .4, 0);
glColor3f(0, 1, 1);
glPrintf(0, "MapScreen x=%f z=%f", PlayerMap->x, PlayerMap->z);
glNewLine();
glPrintf(0, "OnMap x=%f y=%f", screenX, screenY);
glNewLine();
}
glColor3f(1, 1, 1);
tempState = (StateSailing*)previous;
tempState->cities->MapDisplay();
SDL_GL_SwapBuffers();
}
void Map::processEvents() {
// Our SDL event placeholder.
SDL_Event event;
handle_mouse_move();
// Grab all the events off the queue.
while( SDL_PollEvent( &event ) ) {
switch( event.type ) {
case SDL_KEYDOWN:
//Handle key presses.
handle_key_down( &event.key.keysym );
break;
case SDL_KEYUP:
handle_key_up(&event.key.keysym);
break;
case SDL_QUIT:
//Handle quit requests (like Ctrl-c).
doExit();
break;
}
}
}
void Map::handle_mouse_move() {
float multi;
Uint8 buttons;
buttons = SDL_GetMouseState(&curMousePosX, &curMousePosY);
if((buttons == SDL_BUTTON(1)) && transport) {
multi = winWidth / 812.0;
PlayerMap->x = -1*((winWidth / 2) - curMousePosX) / multi;
multi = winHeight / 500.0;
PlayerMap->z = -1*((winHeight / 2) - curMousePosY) / multi;
}
}
void Map::handle_key_up(SDL_keysym* keysym) {
switch(keysym->sym) {
case SDLK_ESCAPE:
// Go back to the game, if it is loaded
if(previous != NULL) {
switchState(previous, this);
}
break;
case SDLK_m:
// Go back to the game, if it is loaded
if(previous != NULL) {
switchState(previous, this);
}
break;
case SDLK_t:
// Stop the transport function
transport = false;
break;
case SDLK_i:
// Turn info on/off
info = ((info) ? false : true);
break;
default:
break;
}
}
void Map::handle_key_down(SDL_keysym* keysym) {
switch( keysym->sym ) {
case SDLK_z:
takeScreenshot();
break;
case SDLK_t:
transport = true;
break;
default:
break;
}
}
void Map::doExit() {
*done = true;
}
void Map::switchTo(GameState *oldState) {
EnterTextMode(winWidth, winHeight); // What is this? Why do I need this here?
transport = false;
}
void Map::switchFrom() {
}
void Map::drawGui() {
glPushMatrix();
glLoadIdentity();
glBindTexture(GL_TEXTURE_2D, map_background);
glColor3f(0, 0, 0);
//Draw quad for map
glBegin(GL_QUADS);
glTexCoord2f(0,0);
glVertex3f(10, winHeight - 250, 0);
glTexCoord2f(0, 1);
glVertex3f(10, winHeight - 10, 0);
glTexCoord2f(1, 1);
glVertex3f(370, winHeight - 10, 0);
glTexCoord2f(1, 0);
glVertex3f(370, winHeight - 250, 0);
glEnd();
glColor3f(1, 1, 1);
glPopMatrix();
}

75
src/Map.h Normal file
View File

@ -0,0 +1,75 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*/
#ifndef _MAP_H_
#define _MAP_H_
#include <SDL/SDL.h>
#include "GameState.h"
// So I do not have to include the headers.
class StateSailing;
class Map: public GameState {
public:
//Constructor
Map(StateSailing *curGame, Player *playerPos);
// Destructor
virtual ~Map();
// Need to implement the loop function
void loop();
void switchTo(GameState *oldState);
void switchFrom();
void doExit();
// I plan on drawing the map in the upper left corner of the screen while sailing. let's see.
void drawGui();
private:
// Set to false to exit
bool *done;
// Background texture
GLuint map_background;
// Number of menu items
//int numItems;
// Selected menu item
// int selected;
// Handles processing SDL events
void processEvents();
// Main sailing game state
StateSailing *mainGame;
// Player, we will need to get our position on the map
Player *PlayerMap;
// Keyboard handler functions
void handle_key_up(SDL_keysym* keysym);
void handle_key_down(SDL_keysym* keysym);
void handle_mouse_move();
void display();
int winWidth;
int winHeight;
int curMousePosX;
int curMousePosY;
bool transport;
bool info;
};
#endif

391
src/Menu.cpp Normal file
View File

@ -0,0 +1,391 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*
* This class is intended to be a base class for all the menu systems
* in Lephisto. this will extend the GameState class.
*/
#ifdef WIN32
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#endif
#include <cstdlib>
#include <vector>
#include <string>
#include <SDL/SDL.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include "Config.h"
#include "image.h"
#include "font.h"
#include "GameState.h"
#include "Callback.h"
#include "Log.h"
#include "Menu.h"
using namespace std;
Menu::Menu(const char* image, GameState *from, GameState *to): GameState(NULL) {
// Bool valie to set to quit
done = false;
// Make Set from and to gamestates
fromState = from;
toState = to;
// Get ready for text mode
EnterTextMode(Config::configuration->getWinWidth(),
Config::configuration->getWinHeight());
// Load the background
glEnable(GL_TEXTURE_2D);
BuildTexture(image, &background, GL_CLAMP, false);
glBindTexture(GL_TEXTURE_2D, background);
Selected = 0;
ButtonID = 0;
mouseActive = true;
}
Menu::~Menu() {
unsigned int i;
glDeleteTextures(1, &background);
for(i = 0; i < lists.size(); i++) {
delete lists[i];
}
lists.clear();
}
void Menu::loop() {
while(!lists[Selected]->Select()) {
Selected += 1;
if(Selected > (int) lists.size()) Selected = 0;
}
// Draw the menu
display();
// Process incoming events
processEvents();
}
void Menu::display() {
int width = Config::configuration->getWinWidth();
int height = Config::configuration->getWinHeight();
int i;
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
// Draw the background
// Bind the background texture
glBindTexture(GL_TEXTURE_2D, background);
// Set the color
glColor3f(.8, .8, .8);
// Draw the actual background quad
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex3f(0, 0 , 0);
glTexCoord2f(0, 1);
glVertex3f(0, height, 0);
glTexCoord2f(1, 1);
glVertex3f(width, height, 0);
glTexCoord2f(1, 0);
glVertex3f(width, 0, 0);
glEnd();
// Draw the text.
for(i = 0; i < (signed)lists.size(); i++) {
glLoadIdentity();
//glTranslatef((float) width * lists[i].x, (float) height * lists[i].y, 0);
lists[i]->Display();
}
glColor3f(1, 1, 1);
SDL_GL_SwapBuffers();
}
void Menu::processEvents() {
// Our SDL event placeholder
SDL_Event event;
handle_mouse();
// Grab all the events off the queue
while(SDL_PollEvent(&event)) {
switch(event.type) {
case SDL_KEYDOWN:
// Handle key presses
handle_key_down(&event.key.keysym);
break;
case SDL_KEYUP:
handle_key_up(&event.key.keysym);
break;
case SDL_QUIT:
// Handle quit requests (like Ctrl-c)
doExit();
break;
}
}
}
void Menu::handle_key_up(SDL_keysym* keysym) {
switch(keysym->sym) {
case SDLK_ESCAPE:
// Go back to the game, if it is loaded anyway.
if((fromState != NULL) && (toState != NULL)) {
switchState(fromState, toState);
}
break;
case SDLK_RETURN:
lists[Selected]->Execute();
break;
case SDLK_p:
Print();
break;
default:
break;
}
}
void Menu::handle_key_down(SDL_keysym* keysym) {
mouseActive = false;
int newSelected;
switch(keysym->sym) {
case SDLK_UP:
lists[Selected]->SelectionUp();
break;
case SDLK_DOWN:
lists[Selected]->SelectionDown();
break;
case SDLK_LEFT:
newSelected = Selected - 1;
if(newSelected < 0) newSelected = lists.size() - 1;
while(!lists[newSelected]->Select()) {
newSelected -= 1;
if(newSelected < 0) newSelected = lists.size() - 1;
}
lists[Selected]->Deselect();
Selected = newSelected;
break;
case SDLK_RIGHT:
newSelected = Selected + 1;
if(newSelected >= (int) lists.size()) newSelected = 0;
while(!lists[newSelected]->Select()) {
newSelected += 1;
if(newSelected >= (int) lists.size()) newSelected = 0;
}
lists[Selected]->Deselect();
Selected = newSelected;
break;
case SDLK_z:
takeScreenshot();
break;
default:
break;
}
}
void Menu::doExit() {
*done = true;
}
void Menu::switchTo(GameState *oldState) {
// Set selected to return to game
Selected = 0;
while(!lists[Selected]->Select()) {
Selected += 1;
if(Selected > (int) lists.size()) Selected = 0;
}
EnterTextMode(Config::configuration->getWinWidth(),
Config::configuration->getWinHeight());
glEnable(GL_TEXTURE_2D);
}
void Menu::switchFrom() {
lists[Selected]->Deselect();
Selected = -1;
}
void Menu::addList(string Name, float x, float y) {
MenuContainer *tempContainer;
tempContainer = new MenuContainer(Name, x, y, maLeft);
lists.push_back(tempContainer);
}
void Menu::addList(string Name, float x, float y, int alignment) {
MenuContainer *tempContainer;
if((alignment < maLeft) || (alignment > maRight))
addList(Name, x, y);
tempContainer = new MenuContainer(Name, x, y, alignment);
lists.push_back(tempContainer);
}
int Menu::addMenuItem(string Text, cCallback *recallFunc, string List, bool enabled) {
unsigned int i;
for(i = 0; i < lists.size(); i++) {
if(lists[i]->GetName() == List) {
lists[i]->AddButton(Text, recallFunc, enabled, ButtonID);
ButtonID++;
break;
}
}
return ButtonID - 1;
}
int Menu::addMenuItem(string Text, cCallback *recallFunc, string List, bool enabled, float red, float green, float blue) {
unsigned int i;
for(i = 0; i < lists.size(); i++) {
if(lists[i]->GetName() == List) {
lists[i]->AddButton(Text, recallFunc, enabled, ButtonID, red, green, blue);
ButtonID++;
break;
}
}
return ButtonID - 1;
}
void Menu::addDataItem(string Text, string List) {
unsigned int i;
for(i = 0; i < lists.size(); i++) {
if(lists[i]->GetName() == List) {
lists[i]->AddData(Text);
break;
}
}
}
void Menu::addDataItem(string Text, string List, float red, float green, float blue) {
unsigned int i;
for(i = 0; i < lists.size(); i++) {
if(lists[i]->GetName() == List) {
lists[i]->AddData(Text, red, green, blue);
break;
}
}
}
void Menu::changeEnabled(string Text, string List, bool enabled) {
unsigned int i;
for(i = 0; i < lists.size(); i++) {
if(lists[i]->GetName() == List) {
lists[i]->ChangeEnabled(Text, enabled);
}
}
}
void Menu::handle_mouse() {
unsigned int i;
Uint8 buttons;
buttons = SDL_GetMouseState(&curMousePosX, &curMousePosY);
if((!mouseActive) && (!((curMousePosX == lastMousePosX) && (curMousePosY == lastMousePosY))))
mouseActive = true;
buttonDown = MouseButtonDown(buttons, 1);
for(i = 0; i < lists.size(); i++) {
if(lists[i]->LocationWithin(curMousePosX, curMousePosY)) {
if(lists[i]->MouseSelect(curMousePosX, curMousePosY)) {
if(Selected != (int) i) {
lists[Selected]->Deselect();
Selected = i;
}
if(mouseActive && buttonDown) {
lists[Selected]->Execute();
}
}
}
}
lastMousePosX = curMousePosX;
lastMousePosY = curMousePosY;
}
bool Menu::MouseLocToMenu(int locX, int locY) {
/*
unsigned int i;
for(i = 0; i < lists.size(); i++) {
if((locX >= lists[i].TopLeftX)
&& (locX <= lists[i].BottomRightX)
&& (locY >= lists[i].TopLeftY)
&& (locY <= lists[i].BottomRightY)) {
hSelected = (int) i;
return ContainerSelection(locX, locY, i);
}
}
return false;
*/
return false;
}
bool Menu::ContainerSelection(int locX, int locY, int container) {
/*
unsigned int i;
float vertical;
menuItem* tempItem;
vertical = lists[container].TopLeftY;
//tempItem = lists[container];
for(i = 0; i < lists[container].menuItems.size(); i++) {
tempItem = &lists[container].menuItems[i];
if((locY > (vertical + (18 * tempItem->order))
&& (locY < (vertical + (18 * (tempItem->order + 1)))))) {
vSelected = (int) i;
return true;
}
}
*/
return false;
}
void Menu::Print() {
unsigned int i;
for(i = 0; i < lists.size(); i++)
lists[i]->Print();
}
bool Menu::MouseButtonDown(Uint8 buttons, int buttonNumber) {
if(((buttons & buttonNumber) == buttonNumber) && ((lastButtonState & buttonNumber) == buttonNumber)) {
lastButtonState = buttons;
return false;
}
if(((buttons & buttonNumber) == buttonNumber) && ((lastButtonState & buttonNumber) != buttonNumber)) {
lastButtonState = buttons;
return true;
}
lastButtonState = buttons;
return false;
}

198
src/Menu.h Normal file
View File

@ -0,0 +1,198 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*
* The Menu Class is used as out basis for any of the menus in the game.
* It has functionality to create lists of buttons or to display data
* on top of a background image. There are a number of improvements
* which could be made to the Menu class (animation, better mouse control,
* changes in font, color, different kinds of input like a text box
* control, etc.) but at the moment, this is simple and functional.
*
*##############################################################################
* This is just a brief overview of the functionality of the new menu class.
* ---------------------------------------------------------------------------
* For a start, it is a child class of GameState. So it inherits all the
* functionality of the parent. Usualy you aren't going to give it full
* control of execution. You'll have another GameState call menu->loop()
* inside its own loop(). This also means that you need to call menu->switchTo()
* in your other GameStates switchTo() class, because there is some important
* display code that won't load if you don't. (Look at the way MainMenu.cpp is set up
* if you are confused.
*
* The constructor is typical, it takes a background image as an argument. It
* is then ready to be displayed with loop().
*
* The menu functionality of the class is found in two structures: Lists and
* items... If you think about how a menu is displayed, there are different
* options one on top of the next. So the idea of a lists is that it is the
* container for those options. Having this structure allows you to have different
* lists in different parts of the screen.
*
* To create a list, you'll use a Menu::addList(string Name, float x, float y).
* The name is realy important. It is how you get back to the list you have
* created. The two float arguments are the location on the location on the screen. The location
* is a percentage of the screen, so you're limited to between 1 and 0. It won't
* error check this because it just means you won't be able to see the list.
*
* To add items to the list, there are two different items you have access to.
* MenuItems are selectable. You need to provide the text to display, a callback
* function, which list you want it to be part of and whether or not it's
* selectable. You can change if it's selectable or not. Each MenuItem in a menu
* gets a unique ID which is returned when you call Menu::addMenuItem. This can
* be used to identify which button was pressed, or used to modify the buttons
* if needed. The recall function is is relatively complex, so you'll need to
* look at either MainMenu or StateCity to see it in use.
* The recall functions are void and takes one argument (int).
* This argument is the ID of the button which was pressed, so that mutiple
* buttons can use the same recall function and still distinguish between which
* called the recall function. At this point, there is no other kind of
* function allowed.
*
* The other kind of item is a data item. This needs no callback function because
* it can never be selected. It's handy when you need to just display information
* (say for example the economy in a city).
*
* Menu::changeEnabled(string Text, string List, bool enabled) moves a menu item
* from being enabled or not depending on if you pass false or true to the final
* argument.
*
* Menu::switchToData and Menu::switchToMenu are not fully tested and probably don't work.
* Please don't use them.
*#######################################################################################
*/
#ifndef _MENU_H_
#define _MENU_H_
#include <vector>
#include <string>
#include "SDL/SDL.h"
#include "GameState.h"
#include "Callback.h"
#include "StateSailing.h"
#include "Menu/MenuContainer.h"
using namespace std;
typedef enum {maLeft, maCenter, maRight} MenuAlignment;
class Menu: public GameState {
public:
// Constructor
Menu(const char* image, GameState *from, GameState *to);
// Destructor
~Menu();
// Need to implement the loop function
void loop();
// Need to implement the switchTo function
void switchTo(GameState *oldState);
// Need to implement the switchFrom function
void switchFrom();
// Override the exit function
void doExit();
// Add a list
void addList(string Name, float x, float y);
void addList(string Name, float x, float y, int alignment);
// Add a menu item
int addMenuItem(string Text, cCallback *recallFunc, string List, bool enabled);
//int addMenuItem(string Text, cCallback *recallFunc, string List, bool enabled, GLuint image);
int addMenuItem(string Text, cCallback *recallFunc, string List, bool enabled, float red, float green, float blue);
//int addMenuItem(string Text, cCallback *recallFunc, string List, bool enabled, GLuint image,
//float red, float green, float blue);
// Add a data item
void addDataItem(string Text, string List); // Doesn't need a callback because it is not selectable
//void addDataItem(string Text, string List, GLuint image);
void addDataItem(string Text, string List, float red, float green, float blue);
// Enable/Disable a menu Item
void changeEnabled(string Text, string List, bool enabled);
private:
void Print();
// Set to false to exit
bool *done;
// Background texture
GLuint background;
// Menu lists
vector<MenuContainer*> lists;
// Selected list item
int Selected;
// Handles processing SDL events
void processEvents();
// Keyboard handler functions
void handle_key_up(SDL_keysym* keysym);
void handle_key_down(SDL_keysym* keysym);
// Mouse functions
void handle_mouse();
/*
* MouseButtonDown takes a button number
* (Left = 1, Middle = 2, Right = 3),
* and the current butons pressed, it
* tells you true if this is the first frame
* in which the button was pressed. So it
* will not return true every frame the button
* is pressed, but only the first time for
* each click.
* to find out if the buttin is pressed every fram try:
* buttonDown = (buttons == SDL_BUTTON(buttonNumber));
*/
bool MouseButtonDown(Uint8 buttons, int buttonNumber);
Uint8 lastButtonState;
/*
* MouseLocToMenu translates the location
* of the mouse to the corresponding button
* on the menu. It returns true if it is
* within a button, and false otherwise.
* It also changes the hSelected if it needs to.
*/
bool MouseLocToMenu(int locX, int locY);
/*
* This is similar to MoseLocToMenu exept
* its at the listContainer level and it will
* change vSelected.
*/
bool ContainerSelection(int locX, int locY, int container);
// Mouse variables
int curMousePosX;
int curMousePosY;
int lastMousePosX;
int lastMousePosY;
bool buttonDown;
bool mouseActive;
// Gamestates for switching
GameState *fromState;
GameState *toState;
void display();
/*
* ButtonID is a unique identifier for each button,
* it can be used instead of the name of the button,
* and the name of the list together. It is also used
* in callback situations.
*/
int ButtonID;
};
#endif

124
src/Menu/Button.cpp Normal file
View File

@ -0,0 +1,124 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*/
#ifdef WIN32
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#endif
#include <string>
#include <SDL/SDL.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include "../font.h"
#include "../Log.h"
#include "DataContainer.h"
#include "Button.h"
using namespace std;
Button::Button(string Text, cCallback *recallFunc, bool enabled,
int ID): DataContainer(Text) {
reFunc = recallFunc;
amIEnabled = enabled;
myID = ID;
selected = false;
if(enabled) {
redColor = .8;
blueColor = .8;
greenColor = .8;
}
permRed = redColor;
permBlue = blueColor;
permGreen = greenColor;
amISelectable = true;
}
Button::Button(string Text, float red, float green, float blue,
cCallback *recallFunc, bool enabled,
int ID): DataContainer(Text, red, green, blue) {
reFunc = recallFunc;
amIEnabled = enabled;
myID = ID;
selected = false;
permRed = red;
permGreen = green;
permBlue = blue;
amISelectable = true;
}
Button::~Button() {
}
void Button::ChangeCallback(cCallback *recallFunc) {
reFunc = recallFunc;
}
void Button::ChangeEnabled(bool enabled) {
amIEnabled = enabled;
if(enabled) {
redColor = .8;
blueColor = .8;
greenColor = .8;
} else {
redColor = .2;
blueColor = .2;
greenColor = .2;
}
permRed = redColor;
permBlue = blueColor;
permGreen = greenColor;
}
void Button::Execute() {
reFunc->Execute(myID);
}
bool Button::GetEnabled() {
return amIEnabled;
}
int Button::GetID() {
return myID;
}
void Button::Select() {
selected = true;
redColor = 0;
greenColor = 1;
blueColor = 1;
}
void Button::Deselect() {
selected = false;
redColor = permRed;
greenColor = permGreen;
blueColor = permBlue;
}
bool Button::Selectable() {
return amIEnabled;
}
void Button::Print() {
Log::logger->message("\n\tText:\t%s", myText.c_str());
if (amIEnabled)
Log::logger->message("\tSelectable:\tTrue");
else
Log::logger->message("\tSelectable:\tFalse");
if (selected)
Log::logger->message("\tSelected:\tTrue");
else
Log::logger->message("\tSelected:\tFalse");
Log::logger->message("\tID:\t%i", myID);
Log::logger->message("\tColor RGB:\t%i %i %i", redColor, greenColor, blueColor);
}

56
src/Menu/Button.h Normal file
View File

@ -0,0 +1,56 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*/
#ifndef _BUTTON_H_
#define _BUTTON_H_
#include <string>
#include "../Callback.h"
#include "DataContainer.h"
using namespace std;
class Button: DataContainer {
public:
// Constructor
Button(string Text, cCallback *recallFunc, bool enabled, int ID);
Button(string Text, float red, float green, float blue,
cCallback *recallFunc, bool enabled, int ID);
// Deconstructor
~Button();
// Methods
void ChangeEnabled(bool enabled);
bool GetEnabled();
void ChangeCallback(cCallback *recallFunc);
int GetID();
void Select();
void Deselect();
void Execute();
bool Selectable();
void Print();
private:
cCallback *reFunc;
bool amIEnabled;
int myID;
bool selected;
float permRed;
float permGreen;
float permBlue;
};
#endif

View File

@ -0,0 +1,76 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*/
#ifdef WIN32
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#endif
#include <string>
#include <SDL/SDL.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include "../font.h"
#include "../Log.h"
#include "DataContainer.h"
using namespace std;
DataContainer::DataContainer(string Text) {
myText = Text;
redColor = 0.2;
blueColor = 0.2;
greenColor = 0.2;
amISelectable = false;
}
DataContainer::DataContainer(string Text, float red, float green, float blue) {
myText = Text;
redColor = red;
blueColor = blue;
greenColor = green;
amISelectable = false;
}
DataContainer::~DataContainer() {
}
void DataContainer::ChangeText(string Text) {
myText = Text;
}
string DataContainer::GetText() {
return myText;
}
void DataContainer::Display() {
float color[4];
glGetFloatv(GL_CURRENT_COLOR, color);
glColor3f(redColor, greenColor, blueColor);
glPrint(myText.c_str(), 0);
glColor3f(color[0], color[1], color[2]);
}
bool DataContainer::Selectable() {
return amISelectable;
}
void DataContainer::Print() {
Log::logger->message("\n\tText:\t%s", myText.c_str());
if(amISelectable)
Log::logger->message("\tSelectable:\tTrue");
else
Log::logger->message("\tSelectable:\tFalse");
Log::logger->message("\tColor RGB:\t%i %i %i", redColor, greenColor, blueColor);
}
int DataContainer::GetLength() {
return (int)myText.length();
}

53
src/Menu/DataContainer.h Normal file
View File

@ -0,0 +1,53 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*
* This class is the parent of the button class. It is
* what text or data is displayed with. It is also what
* the button will derive.
*/
#ifndef _DATACONTAINER_H_
#define _DATACONTAINER_H_
#include <string>
using namespace std;
class DataContainer {
public:
// Constructor
DataContainer(string Text);
DataContainer(string Text, float red, float green, float blue);
// Destructor
virtual ~DataContainer();
// Methods
void ChangeText(string Text);
string GetText();
void Display();
void SetColor(float red, float green, float blue);
int GetLength();
virtual bool Selectable();
virtual void Print();
protected:
string myText;
float redColor;
float greenColor;
float blueColor;
bool amISelectable; // ???????????
private:
};
#endif

18
src/Menu/Makefile Normal file
View File

@ -0,0 +1,18 @@
CC = g++
CFLAGS = -ansi -Wall -g
LDADD = -lGL -lGLU -lpthread -lSDL -lSDL_image -lopenal -lalut -lvorbisfile -L/usr/X11
objects = Button.o DataContainer.o MenuContainer.o
.PHONY: default all clean
default: all
%.cpp: %.h
%.o: %.cpp
$(CC) $(CFLAGS) -c -o $@ $<
all: $(objects)
clean:
rm -f $(objects)

300
src/Menu/MenuContainer.cpp Normal file
View File

@ -0,0 +1,300 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*/
#ifdef WIN32
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#endif
#include <string>
#include <vector>
#include <SDL/SDL.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include "../font.h"
#include "../Callback.h"
#include "../Config.h"
#include "../Log.h"
#include "../Menu.h"
#include "DataContainer.h"
#include "Button.h"
#include "MenuContainer.h"
using namespace std;
MenuContainer::MenuContainer(string name, float x, float y, int alignment) {
myName = name;
locX = x;
locY = y;
TopLeftX = (float)Config::configuration->getWinWidth() * x;
TopLeftY = (float)Config::configuration->getWinHeight() * y;
BottomRightX = TopLeftX;
BottomRightY = TopLeftY;
align = alignment;
selected = false;
button = -1;
}
MenuContainer::~MenuContainer() {
unsigned int i;
for (i = 0; i < list.size(); i++)
delete list[i];
list.empty();
}
void MenuContainer::AddButton(string Text, cCallback *recallFunc, bool enabled, int ID) {
Button *tempButton;
tempButton = new Button(Text, recallFunc, enabled, ID);
list.push_back((DataContainer*)tempButton);
BottomRightY += 18;
if ((BottomRightX - TopLeftX) < (Text.length() * 16))
BottomRightX = TopLeftX + (Text.length() * 16);
}
void MenuContainer::AddButton(string Text, cCallback *recallFunc, bool enabled, int ID, float red, float green, float blue) {
Button *tempButton;
tempButton = new Button(Text, red, green, blue, recallFunc, enabled, ID);
list.push_back((DataContainer*)tempButton);
BottomRightY += 18;
if((BottomRightX - TopLeftX) < (Text.length() * 16))
BottomRightX = TopLeftX + (Text.length() * 16);
}
void MenuContainer::AddData(string Text) {
DataContainer *tempContainer;
tempContainer = new DataContainer(Text);
list.push_back(tempContainer);
BottomRightY += 18;
if ((BottomRightX - TopLeftX) < (Text.length() * 16))
BottomRightX = TopLeftX + (Text.length() * 16);
}
void MenuContainer::AddData(string Text, float red, float green, float blue) {
DataContainer *tempContainer;
tempContainer = new DataContainer(Text, red, green, blue);
list.push_back(tempContainer);
BottomRightY += 18;
if((BottomRightX - TopLeftX) < (Text.length() * 16))
BottomRightX = TopLeftX + (Text.length() * 16);
}
void MenuContainer::Display() {
unsigned int i;
float alignTranslate;
glPushMatrix();
glLoadIdentity();
glTranslatef(TopLeftX, TopLeftY, 0.0);
for (i = 0; i < list.size(); i++) {
alignTranslate = 0.0;
if(align == maCenter) {
// If the text is centered, we need to move it left half its length
alignTranslate = (float)((list[i]->GetLength() * 10) / 2);
} else if(align == maRight) {
// If the text is right alligned, move it left the whole length
alignTranslate = (float)(list[i]->GetLength() * 10);
}
glPushMatrix();
glTranslatef((-1.0) * alignTranslate, 0, 0);
list[i]->Display();
glPopMatrix();
glNewLine();
}
glPopMatrix();
}
bool MenuContainer::LocationWithin(int x, int y) {
if ((x >= TopLeftX) && (x <= BottomRightX) && (y >= TopLeftY) && (y <= BottomRightY)) return true;
return false;
/*
for (i = 0; i < list.size(); i++) {
if (list[i]->Selectable()) {
tempItem = (Button*)list[i];
if ((locY > (TopLeftY + (18 * i)) && (locY < (TopLeftY + (18 * (i + 1)))))) {
tempItem->Select();
return true;
}
}
}
return false;
*/
}
void MenuContainer::SelectionDown() {
unsigned int i;
Button *tempButton;
if (!selected) return;
for (i = button + 1; i < list.size(); i++) {
if (list[i]->Selectable()) {
tempButton = (Button*)list[i];
tempButton->Select();
tempButton = (Button*)list[button];
tempButton->Deselect();
button = i;
return;
}
}
for (i = 0; (int) i < button; i++) {
if (list[i]->Selectable()) {
tempButton = (Button*)list[i];
tempButton->Select();
tempButton = (Button*)list[button];
tempButton->Deselect();
button = i;
return;
}
}
}
void MenuContainer::SelectionUp() {
int i;
Button *tempButton;
if (!selected) return;
for (i = button - 1; i >= 0; i--) {
if (list[i]->Selectable()) {
tempButton = (Button*)list[i];
tempButton->Select();
tempButton = (Button*)list[button];
tempButton->Deselect();
button = i;
return;
}
}
for (i = (int)list.size() - 1; i > button; i--) {
if (list[i]->Selectable()) {
tempButton = (Button*)list[i];
tempButton->Select();
tempButton = (Button*)list[button];
tempButton->Deselect();
button = i;
return;
}
}
}
bool MenuContainer::Select() {
unsigned int i;
Button* tempButton;
if (selected) return true;
for (i = 0; i < list.size(); i++) {
if (list[i]->Selectable()) {
button = i;
tempButton = (Button*)list[i];
tempButton->Select();
selected = true;
return true;
}
}
return false;
}
void MenuContainer::Deselect() {
Button *tempButton;
if (!selected) return;
tempButton = (Button*)list[button];
tempButton->Deselect();
button = -1;
selected = false;
}
string MenuContainer::GetName() {
return myName;
}
void MenuContainer::Execute() {
Button *tempButton;
if (!selected) {
Log::logger->message("Error: MenuContainer not Selected!");
return;
}
tempButton = (Button*)list[button];
tempButton->Execute();
}
void MenuContainer::Print() {
unsigned int i;
Log::logger->message("-----------------");
Log::logger->message("List:\t%s", myName.c_str());
Log::logger->message("-----------------");
for (i = 0; i < list.size(); i++)
list[i]->Print();
}
void MenuContainer::ChangeEnabled(string Text, bool enabled) {
unsigned int i;
Button* tempButton;
for (i = 0; i < list.size(); i++) {
if (list[i]->GetText() == Text) {
tempButton = (Button*) list[i];
tempButton->ChangeEnabled(enabled);
}
}
}
bool MenuContainer::MouseSelect(int x, int y) {
unsigned int i;
Button* tempItem;
for (i = 0; i < list.size(); i++) {
if (list[i]->Selectable()) {
tempItem = (Button*)list[i];
if ((y > (TopLeftY + (18 * i)) && (y < (TopLeftY + (18 * (i + 1)))))) {
// This short circuits the problem of
// hovering. If you hover over a button
// without this line, it will always
// select and deselect the same button...
// not a good thing.
if (button == (int) i) return true;
tempItem->Select();
if (button != -1) {
tempItem = (Button*)list[button];
tempItem->Deselect();
}
button = i;
return true;
}
}
}
return false;
}

79
src/Menu/MenuContainer.h Normal file
View File

@ -0,0 +1,79 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*/
#ifndef _MENUCONTAINER_H_
#define _MENUCONTAINER_H_
#include <string>
#include <vector>
#include "../Callback.h"
#include "DataContainer.h"
#include "Button.h"
using namespace std;
class MenuContainer {
public:
// Constructor
MenuContainer(string name, float x, float y, int alignment);
// Destructor
~MenuContainer();
// Methods
void AddButton(string Text, cCallback *recallFunc, bool enabled, int ID);
void AddButton(string Text, cCallback *recallFunc, bool enabled, int ID, float red, float green, float blue);
void AddData(string Text);
void AddData(string Text, float red, float green, float blue);
// These two methods are for mouse handling.
// The first simply returns if the mouse is
// within the MenuContainer. The second should
// only get called if the first returns true.
// MouseSelect changes the selection if
// appropriate and returns true, or it does
// nothing and returns false.
bool LocationWithin(int x, int y);
bool MouseSelect(int x, int y);
void Display();
// These methods move the selected item up and down the list
void SelectionDown();
void SelectionUp();
// This tells this list that it is selected and can display
// one of its items as such. It returns true if it has some
// selectable items and false if not.
bool Select();
void Deselect();
void ChangeEnabled(string Text, bool enabled);
string GetName();
void Execute();
void Print();
private:
vector<DataContainer*> list;
string myName;
float locX;
float locY;
int align;
float TopLeftX;
float TopLeftY;
float BottomRightX;
float BottomRightY;
int button;
bool selected;
};
#endif

514
src/Model.cpp Normal file
View File

@ -0,0 +1,514 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*/
#include <SDL/SDL.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include "Log.h"
#include "image.h"
#include "BoundBox.h"
#include "extensions.h"
#include "Model.h"
// Helpers for loadObj
#define T(x) (model->triangles[(x)])
struct ObjTriangle {
GLuint vindices[3]; // Array of triangle vertex indices
GLuint nindices[3]; // Array of triangle normal indices
GLuint tindices[3]; // Array of triangle texcoord indices
GLuint findex; // index of triangle facet normal
};
struct ObjGroup {
char* name; // Name of this group
GLuint numtriangles; // Number of triangles in this group
GLuint* triangles; // Array of triangle indices
//GLuint material; // Index to material for group
struct ObjGroup* next; // Pointer to next group in model
};
/*
struct ObjMaterial
{
char* name; // Name of material
GLfloat diffuse[4]; // Diffuse component
GLfloat ambient[4]; // Ambient component
GLfloat specular[4]; // Specular component
GLfloat emmissive[4]; // Emmissive component
GLfloat shininess; // Specular exponent
};
*/
struct ObjModel {
char* pathname; // Path to this model
char* mtllibname; // Name of the material library
GLuint numvertices; // Number of vertices in model
GLfloat* vertices; // Srray of vertices
GLuint numnormals; // Number of normals in model
GLfloat* normals; // Array of normals
GLuint numtexcoords; // Number of texcoords in model
GLfloat* texcoords; // Array of texture coordinates
GLuint numfacetnorms; // Number of facetnorms in model
GLfloat* facetnorms; // Array of facetnorms
GLuint numtriangles; // Number of triangles in model
ObjTriangle* triangles; // Array of triangles */
//GLuint nummaterials; // Number of materials in model
//ObjMaterial* materials; // Array of materials
GLuint numgroups; // Number of groups in model
ObjGroup* groups; // Linked list of groups
GLfloat position[3]; // Position of the model
};
Model::Model(const char *textureName) {
loaded = false;
BuildTexture(textureName, &texture, GL_CLAMP_TO_EDGE, true);
glBindTexture(GL_TEXTURE_2D, texture);
}
Model::~Model() {
glDeleteTextures(1, &texture);
glDeleteLists(displayList, 1);
delete modelBox;
}
void Model::draw() {
if (loaded) {
glCallList(displayList);
}
}
void Model::startList() {
GLfloat material[4];
material[0] = 1.0;
material[1] = 1.0;
material[2] = 1.0;
material[3] = 1.0;
displayList = glGenLists(1);
if (displayList == 0) {
// Probably should throw and exception
Log::logger->message("Could not generate model display list");
return;
}
glNewList(displayList, GL_COMPILE);
glMaterialfv(GL_FRONT, GL_AMBIENT, material);
glMaterialfv(GL_FRONT, GL_DIFFUSE, material);
glBindTexture(GL_TEXTURE_2D, texture);
}
void Model::loadObj(const char *filename, float scale) {
ObjModel *model;
model = objLoad(filename);
if (!model) {
return;
}
// Scale it properly
objScale(model, scale);
modelBox = objGenerateBox(model);
startList();
objDraw(model);
glEndList();
loaded = true;
}
ObjModel* Model::objLoad(const char *filename) {
ObjModel* model;
FILE* file;
/* open the file */
file = fopen(filename, "r");
if (!file) {
// Probably should throw an exception
Log::logger->message("Warning: Failed to open file %s", filename);
return NULL;
}
/* allocate a new model */
model = (ObjModel*)malloc(sizeof(ObjModel));
model->pathname = strdup(filename);
model->mtllibname = NULL;
model->numvertices = 0;
model->vertices = NULL;
model->numnormals = 0;
model->normals = NULL;
model->numtexcoords = 0;
model->texcoords = NULL;
model->numfacetnorms = 0;
model->facetnorms = NULL;
model->numtriangles = 0;
model->triangles = NULL;
//model->nummaterials = 0;
//model->materials = NULL;
model->numgroups = 0;
model->groups = NULL;
model->position[0] = 0.0;
model->position[1] = 0.0;
model->position[2] = 0.0;
/* Make a first pass through the file to get a count of the number
* of vertices, normals, texcoords & triangles
*/
objFirstPass(model, file);
/* allocate memory */
model->vertices = (GLfloat*)malloc(sizeof(GLfloat) *
3 * (model->numvertices + 1));
model->triangles = (ObjTriangle*)malloc(sizeof(ObjTriangle) *
model->numtriangles);
if (model->numnormals) {
model->normals = (GLfloat*)malloc(sizeof(GLfloat) *
3 * (model->numnormals + 1));
}
if (model->numtexcoords) {
model->texcoords = (GLfloat*)malloc(sizeof(GLfloat) *
2 * (model->numtexcoords + 1));
}
// rewind to beginning of file and read in the data this pass
rewind(file);
objSecondPass(model, file);
/* close the file */
fclose(file);
return model;
}
void Model::objDraw(ObjModel *model) {
ObjGroup* group;
ObjTriangle* triangle;
glBegin(GL_TRIANGLES);
group = model->groups;
while (group) {
for (unsigned int i = 0; i < group->numtriangles; i++) {
triangle = &T(group->triangles[i]);
glNormal3fv(&model->normals[3 * triangle->nindices[0]]);
glTexCoord2fv(&model->texcoords[2 * triangle->tindices[0]]);
glVertex3fv(&model->vertices[3 * triangle->vindices[0]]);
glNormal3fv(&model->normals[3 * triangle->nindices[1]]);
glTexCoord2fv(&model->texcoords[2 * triangle->tindices[1]]);
glVertex3fv(&model->vertices[3 * triangle->vindices[1]]);
glNormal3fv(&model->normals[3 * triangle->nindices[2]]);
glTexCoord2fv(&model->texcoords[2 * triangle->tindices[2]]);
glVertex3fv(&model->vertices[3 * triangle->vindices[2]]);
}
group = group->next;
}
glEnd();
}
void Model::objFirstPass(ObjModel *model, FILE* file) {
GLuint numvertices; // Number of vertices in model
GLuint numnormals; // Number of normals in model
GLuint numtexcoords; // Number of texcoords in model
GLuint numtriangles; // Number of triangles in model
ObjGroup* group; // Current group */
unsigned v, n, t;
char buf[128];
/* Make a default group */
group = objAddGroup(model, "default");
numvertices = numnormals = numtexcoords = numtriangles = 0;
while(fscanf(file, "%s", buf) != EOF) {
switch(buf[0]) {
case '#': /* comment */
/* eat up rest of line */
fgets(buf, sizeof(buf), file);
break;
case 'v': /* v, vn, vt */
switch(buf[1]) {
case '\0': /* vertex */
/* eat up rest of line */
fgets(buf, sizeof(buf), file);
numvertices++;
break;
case 'n': /* normal */
/* eat up rest of line */
fgets(buf, sizeof(buf), file);
numnormals++;
break;
case 't': /* texcoord */
/* eat up rest of line */
fgets(buf, sizeof(buf), file);
numtexcoords++;
break;
default:
printf("glmFirstPass(): Unknown token \"%s\".\n", buf);
exit(1);
break;
}
break;
case 'm':
/* eat up rest of line */
fgets(buf, sizeof(buf), file);
break;
case 'u':
/* eat up rest of line */
fgets(buf, sizeof(buf), file);
break;
case 'g': /* group */
/* eat up rest of line */
fgets(buf, sizeof(buf), file);
#if SINGLE_STRING_GROUP_NAMES
sscanf(buf, "%s", buf);
#else
buf[strlen(buf)-1] = '\0'; /* nuke '\n' */
#endif
group = objAddGroup(model, buf);
break;
case 'f': /* face */
v = n = t = 0;
fscanf(file, "%s", buf);
if (sscanf(buf, "%d/%d/%d", &v, &t, &n) == 3) {
/* v/t/n */
fscanf(file, "%d/%d/%d", &v, &t, &n);
fscanf(file, "%d/%d/%d", &v, &t, &n);
numtriangles++;
group->numtriangles++;
while(fscanf(file, "%d/%d/%d", &v, &t, &n) > 0) {
numtriangles++;
group->numtriangles++;
}
} else {
Log::logger->message("Warning: Invalid .obj file");
}
break;
default:
/* eat up rest of line */
fgets(buf, sizeof(buf), file);
break;
}
}
// Set the stats in the model structure
model->numvertices = numvertices;
model->numnormals = numnormals;
model->numtexcoords = numtexcoords;
model->numtriangles = numtriangles;
// Allocate memory for the triangles in each group
group = model->groups;
while(group) {
group->triangles = (GLuint*)malloc(sizeof(GLuint) * group->numtriangles);
group->numtriangles = 0;
group = group->next;
}
}
ObjGroup* Model::objAddGroup(ObjModel *model, char *name) {
ObjGroup* group;
group = objFindGroup(model, name);
if (!group) {
group = (ObjGroup*)malloc(sizeof(ObjGroup));
group->name = strdup(name);
//group->material = 0;
group->numtriangles = 0;
group->triangles = NULL;
group->next = model->groups;
model->groups = group;
model->numgroups++;
}
return group;
}
ObjGroup* Model::objFindGroup(ObjModel* model, char* name) {
ObjGroup* group;
group = model->groups;
while(group) {
if (!strcmp(name, group->name))
break;
group = group->next;
}
return group;
}
void Model::objSecondPass(ObjModel* model, FILE* file) {
GLuint numvertices; // Number of vertices in model
GLuint numnormals; // Number of normals in model
GLuint numtexcoords; // Number of texcoords in model
GLuint numtriangles; // Number of triangles in model
GLfloat* vertices; // Array of vertices
GLfloat* normals; // Array of normals
GLfloat* texcoords; // Array of texture coordinates
ObjGroup* group; // Current group pointer
//GLuint material; // Current material
GLuint v, n, t;
char buf[128];
/* set the pointer shortcuts */
vertices = model->vertices;
normals = model->normals;
texcoords = model->texcoords;
group = model->groups;
/* On the second pass through the file, read all the data into the
* allocated arrays
*/
numvertices = numnormals = numtexcoords = 1;
numtriangles = 0;
//material = 0;
while(fscanf(file, "%s", buf) != EOF) {
switch(buf[0]) {
case '#': /* comment */
/* eat up rest of line */
fgets(buf, sizeof(buf), file);
break;
case 'v': /* v, vn, vt */
switch(buf[1]) {
case '\0': /* vertex */
fscanf(file, "%f %f %f",
&vertices[3 * numvertices + 0],
&vertices[3 * numvertices + 1],
&vertices[3 * numvertices + 2]);
numvertices++;
break;
case 'n': /* normal */
fscanf(file, "%f %f %f",
&normals[3 * numnormals + 0],
&normals[3 * numnormals + 1],
&normals[3 * numnormals + 2]);
numnormals++;
break;
case 't': /* texcoord */
fscanf(file, "%f %f",
&texcoords[2 * numtexcoords + 0],
&texcoords[2 * numtexcoords + 1]);
numtexcoords++;
break;
}
break;
case 'u':
fgets(buf, sizeof(buf), file);
sscanf(buf, "%s %s", buf, buf);
//group->material = material = glmFindMaterial(model, buf);
break;
case 'g': /* group */
/* eat up rest of line */
fgets(buf, sizeof(buf), file);
#if SINGLE_STRING_GROUP_NAMES
sscanf(buf, "%s", buf);
#else
buf[strlen(buf)-1] = '\0'; /* nuke '\n' */
#endif
group = objFindGroup(model, buf);
//group->material = material;
break;
case 'f': /* face */
v = n = t = 0;
fscanf(file, "%s", buf);
if (sscanf(buf, "%d/%d/%d", &v, &t, &n) == 3) {
/* v/t/n */
T(numtriangles).vindices[0] = v;
T(numtriangles).tindices[0] = t;
T(numtriangles).nindices[0] = n;
fscanf(file, "%d/%d/%d", &v, &t, &n);
T(numtriangles).vindices[1] = v;
T(numtriangles).tindices[1] = t;
T(numtriangles).nindices[1] = n;
fscanf(file, "%d/%d/%d", &v, &t, &n);
T(numtriangles).vindices[2] = v;
T(numtriangles).tindices[2] = t;
T(numtriangles).nindices[2] = n;
group->triangles[group->numtriangles++] = numtriangles;
numtriangles++;
while(fscanf(file, "%d/%d/%d", &v, &t, &n) > 0) {
T(numtriangles).vindices[0] = T(numtriangles-1).vindices[0];
T(numtriangles).tindices[0] = T(numtriangles-1).tindices[0];
T(numtriangles).nindices[0] = T(numtriangles-1).nindices[0];
T(numtriangles).vindices[1] = T(numtriangles-1).vindices[2];
T(numtriangles).tindices[1] = T(numtriangles-1).tindices[2];
T(numtriangles).nindices[1] = T(numtriangles-1).nindices[2];
T(numtriangles).vindices[2] = v;
T(numtriangles).tindices[2] = t;
T(numtriangles).nindices[2] = n;
group->triangles[group->numtriangles++] = numtriangles;
numtriangles++;
}
} else {
Log::logger->message("Warning: Invalid .obj file");
}
break;
default:
/* eat up rest of line */
fgets(buf, sizeof(buf), file);
break;
}
}
}
void Model::objScale(ObjModel* model, float scale) {
GLuint i;
for (i = 1; i <= model->numvertices; i++) {
model->vertices[3 * i + 0] *= scale;
model->vertices[3 * i + 1] *= scale;
model->vertices[3 * i + 2] *= scale;
}
}
BoundBox* Model::objGenerateBox(ObjModel* model) {
float minX, maxX, minY, maxY, minZ, maxZ;
float tempVertex;
minX = 10000;
maxX = -10000;
minY = 10000;
maxY = -10000;
minZ = 10000;
maxZ = -10000;
for(unsigned int i = 1; i <= model->numvertices; i++) {
tempVertex = model->vertices[3 * i + 0];
if(tempVertex < minX) minX = tempVertex;
if(tempVertex > maxX) maxX = tempVertex;
tempVertex = model->vertices[3 * i + 1];
if(tempVertex < minY) minY = tempVertex;
if(tempVertex > maxY) maxY = tempVertex;
tempVertex = model->vertices[3 * i + 2];
if(tempVertex < minZ) minZ = tempVertex;
if(tempVertex > maxZ) maxZ = tempVertex;
}
return new BoundBox(minX, maxX, minY, maxY, minZ, maxZ);
}

56
src/Model.h Normal file
View File

@ -0,0 +1,56 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*/
#ifndef _MODEL_H_
#define _MODEL_H_
struct ObjModel;
struct ObjGroup;
class BoundBox;
class Model {
public:
// This just loads a texture, need to call a loadFORMAT metod
Model(const char *textureName);
// do whatever cleanup is necessary
~Model();
// Draws the actual model
void draw();
// Add all file format dependant loadFORMAT functions here
// Loads a .obj file
void loadObj(const char *filename, float scale);
BoundBox *modelBox;
private:
// Starts and sets up display list, call from all LoadFORMAT functions
void startList();
// texture the model
GLuint texture;
// Display list to display the model
// Eventually this will be replaced by a VBO/VA
GLuint displayList;
// Whether the model has been loaded or not
bool loaded;
// Add all loadFORMAT helper functions here
ObjModel* objLoad(const char *filename);
void objDraw(ObjModel *model);
void objFirstPass(ObjModel *model, FILE *file);
ObjGroup* objAddGroup(ObjModel *model, char *name);
ObjGroup* objFindGroup(ObjModel *model, char *name);
void objSecondPass(ObjModel* model, FILE* file);
void objScale(ObjModel* model, float scale);
BoundBox* objGenerateBox(ObjModel* model);
};
#endif

144
src/Ocean.cpp Normal file
View File

@ -0,0 +1,144 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*/
#if defined WIN32
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#endif
#include "ccmath.h"
#include <vector>
#include <cstdio>
#include <GL/gl.h>
#include "image.h"
#include "normals.h"
#include "Ocean.h"
#include "extensions.h"
#include "Log.h"
#include "WaveEmitter.h"
#define OCEAN_TEXSCALE 6
using namespace std;
Ocean::Ocean(int sizeX, int sizeZ) {
width = sizeX;
height = sizeZ;
count = 0;
// Set up the texture
glEnable(GL_TEXTURE_2D);
BuildTexture("./data/water.png", &texture, GL_REPEAT, true);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
// Set up the wave texture
BuildTexture("./data/surf.png", &waveTexture, GL_CLAMP_TO_EDGE, true);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
// Set up the material;
material[0] = 0.23;
material[1] = 0.35;
material[2] = 0.7;
material[3] = 0.45;
// Generate the display list
list = glGenLists(1);
if(list == 0) {
printf("Could not generate waves\n");
}
glNewList(list, GL_COMPILE);
// Draw the actual water
// Use the material
glMaterialfv(GL_FRONT, GL_AMBIENT, material);
glMaterialfv(GL_FRONT, GL_DIFFUSE, material);
// Enable the texture
glBindTexture(GL_TEXTURE_2D, texture);
glNormal3f(0, 1, 0);
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex3f(-1*width/2, 0, -1*height/2);
glTexCoord2f(0, height/OCEAN_TEXSCALE);
glVertex3f(-1*width/2, 0, height/2);
glTexCoord2f(width/OCEAN_TEXSCALE, height/OCEAN_TEXSCALE);
glVertex3f(width/2, 0, height/2);
glTexCoord2f(width/OCEAN_TEXSCALE, 0);
glVertex3f(width/2, 0, -1*height/2);
glEnd();
// Done with the list
glEndList();
// Generate the wave list
WaveEmitter::generateWaveList();
}
Ocean::~Ocean() {
// Delete the texture
glDeleteTextures(1, &texture);
// Delete the display list
glDeleteLists(list, 1);
// The wave emitters will be deleted by the quad tree
waveEmitters.clear();
WaveEmitter::deleteActiveWaves();
WaveEmitter::deleteWaveList();
Log::logger->message("Ocean deleted");
}
void Ocean::draw() {
float mult = sin(count);
float mult2 = cos(count);
GLfloat shift = (.25*mult)/OCEAN_TEXSCALE;
GLfloat shift2 = (.25*mult2*(width/height))/OCEAN_TEXSCALE;
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
glBindTexture(GL_TEXTURE_2D, waveTexture);
WaveEmitter::drawActiveWaves();
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// Get ready to manipulate the texture matrix
glMatrixMode(GL_TEXTURE);
glPushMatrix();
// Move around the texture
glTranslatef(shift, shift2, 0);
// Draw the actual waves
glCallList(list);
// Reset the matrix
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
}
void Ocean::update(unsigned int ticks) {
unsigned int numEmitters = waveEmitters.size();
count += .002*ticks;
if(count > TWO_PI) count -= TWO_PI;
for(unsigned int i = 0; i < numEmitters; i++) {
waveEmitters[i]->update(ticks);
}
WaveEmitter::updateActiveWaves(ticks);
}
void Ocean::addEmitter(WaveEmitter*emitter) {
// This just puts a pointer to a wave emitter into the vector
waveEmitters.push_back(emitter);
}

56
src/Ocean.h Normal file
View File

@ -0,0 +1,56 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*/
#ifndef _OCEAN_H_
#define _OCEAN_H_
#include <vector>
using namespace std;
class WaveEmitter;
class Ocean {
public:
// Constructor
Ocean(int sizeX, int sizeZ);
// Destructor
~Ocean();
// Draw the actual water
void draw();
// Update the waters position
void update(unsigned int ticks);
// Add a WaveEmitter to the master list
void addEmitter(WaveEmitter *emitter);
private:
// Size of water patch
int width;
int height;
// Texture handle
GLuint texture;
// Texture handle for waves
GLuint waveTexture;
// Material
GLfloat material[4];
// For sin/cos to move texture
GLfloat count;
// For display list
GLuint list;
// Pointer to all of the wave emitters (This makes update easier)
vector< WaveEmitter* > waveEmitters;
};
#endif

229
src/Player.cpp Normal file
View File

@ -0,0 +1,229 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*/
#if defined WIN32
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#endif
#include <cstdio>
#include <vector>
#include <GL/gl.h>
#include "Player.h"
#include "Log.h"
#include "Ships.h"
#include "Economy.h"
#include "tinyxml.h"
using namespace std;
Player::Player() {
x = 0.0;
z = 0.0;
rot = 0.0;
speed = 0.0;
gold = 100;
ship = ShipManager::list->newShip(0, "Player");
}
Player::~Player() {
delete ship;
}
bool Player::load(int number) {
GLfloat tx, tz, trot, tspeed;
int tdamage;
int n;
TiXmlDocument doc("./LSave.xml");
TiXmlElement* Lephisto;
TiXmlElement* SavedGame;
TiXmlElement* Location;
TiXmlElement* loc;
TiXmlElement* Direction;
TiXmlElement* Speed;
TiXmlElement* Damage;
TiXmlText* data;
doc.LoadFile();
if(doc.Error()) {
Log::logger->message("\nError: Could not open saved game file\n");
return false;
}
Lephisto = doc.FirstChildElement("Lephisto");
if(Lephisto == NULL) {
Log::logger->message("\nError: <Lephisto> did not parse correctly.\n");
return false;
}
SavedGame = Lephisto->FirstChildElement("SavedGame");
if(SavedGame == NULL) {
Log::logger->message("\nError: <SavedGame> did not parse correctly.\n");
return false;
}
try {
Location = SavedGame->FirstChildElement("Location");
if(Location == NULL) throw 0;
// Handle location
loc = Location->FirstChildElement("x");
if(loc == NULL) throw 1;
data = loc->FirstChild()->ToText();
if(data == NULL) throw 1;
n = sscanf(data->Value(), "%f", &tx);;
if(n != 1) throw 1;
loc = Location->FirstChildElement("z");
if(loc == NULL) throw 2;
data = loc->FirstChild()->ToText();
if(data == NULL) throw 2;
n = sscanf(data->Value(), "%f", &tz);
if(n != 1) throw 2;
// Handle the direction
Direction = SavedGame->FirstChildElement("Direction");
if(Direction == NULL) throw 3;
data = Direction->FirstChild()->ToText();
if(data == NULL) throw 3;
n = sscanf(data->Value(), "%f", &trot);
if(n != 1) throw 3;
// Handle speed
Speed = SavedGame->FirstChildElement("Speed");
if(Speed == NULL) throw 4;
data = Speed->FirstChild()->ToText();
if(data == NULL) throw 4;
n = sscanf(data->Value(), "%f", &tspeed);
if(n != 1) throw 4;
// Deal with ship
// Idealy this would call a method of the ship object that would get itself loaded from XML
// that could also call a method on the cargo object that loads itself. However, for now, just saving the damage will do.
Damage = SavedGame->FirstChildElement("Damage");
if(Damage == NULL) throw 5;
data = Damage->FirstChild()->ToText();
if(data == NULL) throw 5;
n = sscanf(data->Value(), "%d", &tdamage);
if(n != 1) throw 5;
} catch(int i) {
switch(i) {
case 0:
Log::logger->message("\nWarning: <Location> did not parse correctly\n");
break;
case 1:
Log::logger->message("\nWarning: <x> did not parse correctly\n");
break;
case 2:
Log::logger->message("\nWarning: <z> did not parse correctly\n");
break;
case 3:
Log::logger->message("\nWarning: <Direction> did not parse correctly\n");
break;
case 4:
Log::logger->message("\nWarning: <Speed> did not parse correctly");
break;
case 5:
Log::logger->message("\nWarning: <Damage> did not parse correctly\n");
break;
default:
Log::logger->message("\nWarning: Unknown Saved Game.. Error\n");
break;
}
return false;
}
x = tx;
z = tz;
rot = trot;
speed = tspeed;
ship->damage = tdamage;
return true;
}
bool Player::save(int number) {
int n;
TiXmlDocument doc;
TiXmlElement* Lephisto = new TiXmlElement("");
TiXmlElement* SavedGame = new TiXmlElement("");
TiXmlElement* Location = new TiXmlElement("");
TiXmlElement* locX = new TiXmlElement("");
TiXmlElement* locZ = new TiXmlElement("");
TiXmlElement* Direction = new TiXmlElement("");
TiXmlElement* Speed = new TiXmlElement("");
TiXmlElement* Damage = new TiXmlElement("");
TiXmlText* data = new TiXmlText("");
char temp[80] = ""; // Needs to have a size otherwise we will get a buffer overflow
//Lephisto = doc.RootElement();
Lephisto->SetValue("Lephisto");
SavedGame->SetValue("SavedGame");
Location->SetValue("Location");
locX->SetValue("x");
locZ->SetValue("z");
n = sprintf(temp, "%f", z);
data->SetValue(temp);
locZ->InsertEndChild(*data);
Location->InsertEndChild(*locX);
Location->InsertEndChild(*locZ);
Direction->SetValue("Direction");
n = sprintf(temp, "%f", rot);
data->SetValue(temp);
Direction->InsertEndChild(*data);
Speed->SetValue("Speed");
n = sprintf(temp, "%f", speed);
data->SetValue(temp);
Speed->InsertEndChild(*data);
Damage->SetValue("Damage");
n = sprintf(temp, "%d", ship->damage);
data->SetValue(temp);
Damage->InsertEndChild(*data);
SavedGame->InsertEndChild(*Location);
SavedGame->InsertEndChild(*Direction);
SavedGame->InsertEndChild(*Speed);
SavedGame->InsertEndChild(*Damage);
Lephisto->InsertEndChild(*SavedGame);
doc.InsertEndChild(*Lephisto);
doc.SaveFile(".LSave.xml");
return true;
}
void Player::reset() {
x = 0.0;
z = 0.0;
rot = 0.0;
speed = 0.0;
}
void Player::dump() {
Log::logger->message("X: %f Z:%f\nRot: %f\nSpeed: %f\n\n", x, z, rot, speed);
ship->dump();
Log::logger->message("Gold:\t%i\n", gold);
}
Cargo* Player::getCargo() {
return ship->cargo;
}

43
src/Player.h Normal file
View File

@ -0,0 +1,43 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*/
#ifndef _PLAYER_H_
#define _PLAYER_H_
#include <vector>
class Ship;
class Cargo;
using namespace std;
class Player {
public:
Player();
~Player();
// The ship contains all of these fields, we could just use them..
GLfloat x;
GLfloat z;
GLfloat rot;
GLfloat speed;
bool load(int);
bool save(int);
void reset();
void dump();
// This just returns the ship's cargo, so you can avoid going through the ship
Cargo* getCargo();
// We will need to work this out once we get things like fleets and stuff.
Ship *ship;
int gold;
};
#endif

49
src/Point.cpp Normal file
View File

@ -0,0 +1,49 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*/
#if defined WIN32
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#endif
#include <cstdio>
#include <GL/gl.h>
#include "./Point.h"
// Generic constructor
Point::Point() {
x = 0;
y = 0;
z = 0;
}
// Copy constructor
Point::Point(Point *copy) {
x = copy->x;
y = copy->y;
z = copy->z;
}
// Construct point at (xIn, yIn, zIn)
Point::Point(GLfloat xIn, GLfloat yIn, GLfloat zIn) {
x = xIn;
y = yIn;
z = zIn;
}
void Point::dump() {
printf("(%f, %f, %f)\n", x, y, z);
}
// Average two points, store in result
void Point::average(Point *a, Point *b, Point *result) {
result->x = (int) (a->x + b->x)/2;
result->y = (int) (a->y + b->y)/2;
result->z = (int) (a->z + b->z)/2;
}
void Point::draw() {
glVertex3f(x, y, z);
}

36
src/Point.h Normal file
View File

@ -0,0 +1,36 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*/
#ifndef _POINT_H_
#define _POINT_H_
// A point in 3d space
class Point {
public:
// Generic constructor
Point();
// Copy contrustor
Point(Point *copy);
// Construct a point at (xIn, yIn, zIn);
Point(GLfloat xIn, GLfloat yIn, GLfloat zIn);
GLfloat x;
GLfloat y;
GLfloat z;
// Dump the coords
void dump();
// Give the glVertex3f call for this point
void draw();
// Average two points, store the result
static void average(Point *a, Point *b, Point *result);
};
#endif

77
src/Product.cpp Normal file
View File

@ -0,0 +1,77 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*/
#ifdef WIN32
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#endif
#include <string>
#include <iostream>
#include "Economy.h"
#include "Product.h"
using namespace std;
Product::Product() {
ID = -1;
medianPrice = 0.0;
demand = 0;
}
Product::Product(int myID, float myMedianPrice, int myDemand) {
ID = myID;
medianPrice = myMedianPrice;
demand = myDemand;
}
Product::~Product() {
}
void Product::SetMedianPrice(float Price) {
medianPrice = Price;
}
void Product::SetDemand(int Demand) {
demand = Demand;
}
int Product::IncreaseDemand() {
++demand;
return demand;
}
int Product::IncreaseDemand(int amount) {
demand += amount;
return demand;
}
int Product::DecreaseDemand() {
--demand;
return demand;
}
int Product::DecreaseDemand(int amount) {
demand -= amount;
return amount;
}
string Product::GetName() {
return Economy::Econ->ProdList[ID];
}
float Product::GetMedianPrice() {
return medianPrice;
}
int Product::GetDemand() {
return demand;
}
void Product::Print() {
cout << "Product Name: " << GetName() << "\n\tPrice: " << medianPrice << "\n\tDemand: " << demand
<< endl;
}

47
src/Product.h Normal file
View File

@ -0,0 +1,47 @@
/* This software is the propery of 'SaraCraft' - developed by Allanis.
* Only members directly assosiated with the SaraCraft project may view/change
* this code.
*/
#ifndef _PRODUCT_H_
#define _PRODUCT_H_
#include <string>
using namespace std;
class Product {
public:
// Constructor
Product();
Product(int myID, float myMedianPrice, int myDemand);
// Destructor
~Product();
//methods
void SetMedianPrice(float Price);
void SetDemand(int Demand);
// Without an argument, the increase is one
int IncreaseDemand();
int IncreaseDemand(int amount);
// Without an argument, the decrease is one
int DecreaseDemand();
int DecreaseDemand(int amount);
// these get the private data
string GetName();
float GetMedianPrice();
int GetDemand();
void Print();
private:
int ID;
float medianPrice;
int demand;
};
#endif

Some files were not shown because too many files have changed in this diff Show More