From 35613f0860a2d8cb643ca8de006de08503e48e53 Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Sat, 18 Oct 2008 17:58:45 +0000 Subject: example module --- src/game/Makefile.am | 4 +- src/game/base/base.cc | 8 +-- src/game/base/base.h | 13 +++-- src/game/example/Makefile.am | 7 +++ src/game/example/example.cc | 125 ++++++++++++++++++++++++++++++++++++++++++ src/game/example/example.h | 65 ++++++++++++++++++++++ src/game/example/spectator.cc | 65 ++++++++++++++++++++++ src/game/example/spectator.h | 32 +++++++++++ src/game/game.cc | 4 ++ src/game/intro/intro.cc | 5 +- src/game/intro/intro.h | 12 ++-- 11 files changed, 315 insertions(+), 25 deletions(-) create mode 100644 src/game/example/Makefile.am create mode 100644 src/game/example/example.cc create mode 100644 src/game/example/example.h create mode 100644 src/game/example/spectator.cc create mode 100644 src/game/example/spectator.h (limited to 'src/game') diff --git a/src/game/Makefile.am b/src/game/Makefile.am index a6a5290..47ca032 100644 --- a/src/game/Makefile.am +++ b/src/game/Makefile.am @@ -6,6 +6,6 @@ libgame_la_SOURCES = game.cc noinst_LTLIBRARIES = libgame.la noinst_HEADERS = game.h -SUBDIRS = base intro +SUBDIRS = base example intro libgame_la_LIBADD = $(top_builddir)/src/game/base/libbase.la \ - $(top_builddir)/src/game/intro/libintro.la + $(top_builddir)/src/game/intro/libintro.la $(top_builddir)/src/game/example/libexample.la diff --git a/src/game/base/base.cc b/src/game/base/base.cc index f27d013..530e520 100644 --- a/src/game/base/base.cc +++ b/src/game/base/base.cc @@ -166,7 +166,7 @@ void func_impulse(core::Player *player, std::string const &args) Base *Base::game_instance = 0; -Base::Base() : core::Module("base", "Project::OSiRiON") +Base::Base() : core::Module("base", "Project::OSiRiON", true) { game_instance = this; g_impulsespeed = 0; @@ -179,8 +179,6 @@ Base::~Base() void Base::init() { - module_running = false; - ShipModel::clear(); if (!load_world()) { @@ -231,9 +229,6 @@ void Base::init() g_devel = core::Cvar::get("g_devel", "0", core::Cvar::Archive); g_devel->set_info("[bool] enable or disable developer mode"); - - // indicate the module is ready to run frames - module_running = true; } void Base::shutdown() @@ -245,7 +240,6 @@ void Base::shutdown() core::Func::remove("list_ship"); ShipModel::clear(); - module_running = false; } bool Base::load_world() diff --git a/src/game/base/base.h b/src/game/base/base.h index db3e7d9..2393a2e 100644 --- a/src/game/base/base.h +++ b/src/game/base/base.h @@ -34,12 +34,6 @@ public: Base(); ~Base(); - /// initialize the game - void init(); - - /// shutdown the game - void shutdown(); - /// run one time frame void frame(float seconds); @@ -57,6 +51,13 @@ public: core::Cvar *g_jumppointrange; core::Cvar *g_devel; +protected: + /// initialize the game + void init(); + + /// shutdown the game + void shutdown(); + private: bool got_entity_key(filesystem::IniFile &inifile, core::Entity *entity); diff --git a/src/game/example/Makefile.am b/src/game/example/Makefile.am new file mode 100644 index 0000000..81fb507 --- /dev/null +++ b/src/game/example/Makefile.am @@ -0,0 +1,7 @@ +INCLUDES = -I$(top_srcdir)/src -I$(top_srcdir)/src/game +METASOURCES = AUTO +libexample_la_LDFLAGS = -avoid-version +noinst_LTLIBRARIES = libexample.la +noinst_HEADERS = example.h +libexample_la_SOURCES = example.cc spectator.cc +_SOURCES = spectator.h diff --git a/src/game/example/example.cc b/src/game/example/example.cc new file mode 100644 index 0000000..d8e18ea --- /dev/null +++ b/src/game/example/example.cc @@ -0,0 +1,125 @@ +/* + intro/intro.cc + This file is part of the Osirion project and is distributed under + the terms of the GNU General Public License version 2 +*/ + +#include "core/gameserver.h" +#include "example/example.h" +#include "example/spectator.h" + +namespace example { + +Example::Example() : core::Module("example", "The Osirion Project Example", true) +{ +} + +Example::~Example() +{ +} + +void Example::init() +{ + /* + Initialize engine game variables + */ + Spectator::g_spectatorspeed = core::Cvar::get("g_spectatorspeed", "4", core::Cvar::Game | core::Cvar::Archive); + Spectator::g_spectatorspeed->set_info("[float] speed of the spectator"); + + Spectator::g_spectatorrotation = core::Cvar::get("g_spectatorrotation", "45", core::Cvar::Game | core::Cvar::Archive); + Spectator::g_spectatorrotation->set_info("[float] rotation speed of the spectator in degrees per second"); + + /* + The Osirion world consists of Zones. Zones are different + areas in the game. The example has only one zone. + */ + zone = new core::Zone("example"); // create a Zone object + zone->set_name("Example Zone"); // set the zone name + core::Zone::add(zone); // add the zone to the world + + /* + Every object in the Osirion world is derived from core::Entity. + We create a few basic entities + */ + + core::Entity *cube = new core::Entity(); // a new entity + cube->set_label("cube"); + cube->set_name("The Red Cube"); + cube->entity_shape = core::Entity::Cube; // set the shape to cube + cube->entity_location.assign(16, -8, 0); // set location + cube->entity_color.assign(1, 0, 0); // set RGB color red + cube->entity_radius = 0.25f; // set radius, in game units + cube->set_zone(zone); // add the entity to the zone + + core::Entity *sphere = new core::Entity(); // a new entity + sphere->set_label("sphere"); + sphere->set_name("The Green Sphere"); + sphere->entity_shape = core::Entity::Sphere; // set the shape to sphere + sphere->entity_location.assign(16, 0, 0); // set location + sphere->entity_color.assign(0, 1, 0); // set RGB color green + sphere->entity_radius = 0.25f; // set radius, in game units + sphere->set_zone(zone); // add the entity to the zone + + core::Entity *diamond = new core::Entity(); // a new entity + diamond->set_label("diamond"); + diamond->set_name("The Blue Diamond"); + diamond->entity_shape = core::Entity::Diamond; // set the shape to cube + diamond->entity_location.assign(16, 8, 0); // set location + diamond->entity_color.assign(0, 0, 1); // set RGB color blue + diamond->entity_radius = 0.25f; // set radius, in game units + diamond->set_zone(zone); // add the entity to the zone + + core::Entity *axis = new core::Entity(); // a new entity + axis->set_label("origin"); + axis->set_name("The Origin"); + axis->entity_shape = core::Entity::Axis; // set the shape to axis + axis->entity_location.assign(0, 0, 0); // set location + axis->entity_color.assign(1); // set greyscale color white + axis->entity_color_second.assign(0.5f, 0.0f, 0.5f); // set RGB secondary color + axis->entity_radius = 0.25f; // set radius, in game units + axis->set_zone(zone); // add the entity to the zone + +} + + +void Example::player_connect(core::Player *player) +{ + // add a spectator object for the new player + Spectator *spectator; + spectator = new Spectator(player); + spectator->set_zone(zone); + spectator->set_dirty(); + + // set the player's control to the spectator object + player->set_zone(zone); + player->set_control(spectator); + player->set_dirty(); + + // send a message to the player + core::server()->send(player, "Welcome to " + name()); + + // broadcast a message to all players + core::server()->broadcast("^B" + player->name() + " entered."); +} + +void Example::player_disconnect(core::Player *player) +{ + // broadcast a message to all players + core::server()->broadcast("^B" + player->name() + " has left."); +} + +void Example::frame(float elapsed) +{ + +} + +void Example::shutdown() +{ + /* + The world is automaticly deleted on shutdown, + but local variables have to be cleaned up + */ + zone = 0; +} + +} diff --git a/src/game/example/example.h b/src/game/example/example.h new file mode 100644 index 0000000..ba8aa72 --- /dev/null +++ b/src/game/example/example.h @@ -0,0 +1,65 @@ +/* + intro/example.h + This file is part of the Osirion project and is distributed under + the terms of the GNU General Public License version 2 +*/ + +#ifndef __INCLUDED_EXAMPLE_H__ +#define __INCLUDED_EXAMPLE_H__ + +// import core functionality +#include "core/core.h" + +// console functions +#include "sys/sys.h" + +/// example game module +/** This is the osirion Project example module. It describes + * how to create custom modules and how to use the engine functionality. + */ +namespace example +{ + +/// example game module +/** Every game module derives from core::Module and has to implement a + * number of virtual functions + */ +class Example : public core::Module +{ +public: + /// constructor, called on module load + /** Modules are loaded at the start of the program, + * the constructor is only called once. + */ + Example(); + + /// desctructor, called on module unload + ~Example(); + + /// called once every server frame + /** @param elapsed time elapsed since the precious server frame, in seconds + */ + void frame(float elapsed); + + /// called when a player connects + void player_connect(core::Player *player); + + /// called when a player disconnects + void player_disconnect(core::Player *player); + +protected: + /// called when the game starts + void init(); + + /// called when the game is shut down + void shutdown(); + + +private: + core::Zone *zone; +}; + +} + +#endif // __INCLUDED_EXAMPLE_H__ + diff --git a/src/game/example/spectator.cc b/src/game/example/spectator.cc new file mode 100644 index 0000000..7b3a165 --- /dev/null +++ b/src/game/example/spectator.cc @@ -0,0 +1,65 @@ +/* + base/spectator.cc + This file is part of the Osirion project and is distributed under + the terms and conditions of the GNU General Public License version 2 +*/ + +#include "example/spectator.h" + +namespace example { + +core::Cvar *Spectator::g_spectatorspeed = 0; +core::Cvar *Spectator::g_spectatorrotation = 0; + +Spectator::Spectator(core::Player *owner) : core::EntityControlable(owner) +{ + // default properties + entity_shape = core::Entity::Diamond; + entity_radius = 0.25f; + + // the spectator gets player color + entity_color.assign(owner->color()); + entity_color_second.assign(owner->color_second()); + + // set dirty flag + set_dirty(); +} + +Spectator::~Spectator() +{ +} + +void Spectator::frame(float elapsed) +{ + // only update if necessary + if (!entity_speed && ! target_thrust && !target_direction && !target_pitch && !target_roll) + return; + + // assign thrust value from input + entity_thrust = target_thrust; + + // rotate according to input + float rotation = g_spectatorrotation->value() * elapsed; + entity_axis.change_direction(target_direction * rotation); + entity_axis.change_pitch(target_pitch * rotation); + entity_axis.change_roll(target_roll * rotation); + + // assign speed from thruster + float maxspeed = g_spectatorspeed->value(); + entity_speed = entity_thrust * maxspeed; + + // assign new location + if (entity_speed) + entity_location += entity_axis.forward() * entity_speed * elapsed; + + if (target_afterburner) + entity_location += entity_axis.forward() * maxspeed * target_afterburner * elapsed; + + if (target_strafe) + entity_location += entity_axis.left() * maxspeed * target_strafe * elapsed; + + // set dirty flag + set_dirty(); +} + +} diff --git a/src/game/example/spectator.h b/src/game/example/spectator.h new file mode 100644 index 0000000..435c45c --- /dev/null +++ b/src/game/example/spectator.h @@ -0,0 +1,32 @@ +/* + base/spectator.h + This file is part of the Osirion project and is distributed under + the terms and conditions of the GNU General Public License version 2 +*/ + +#ifndef __INCLUDED_EXAMPLE_SPECTATOR_H__ +#define __INCLUDED_EXAMPLE_SPECTATOR_H__ + +#include "core/entity.h" +#include "core/cvar.h" + +namespace example { + +/// A spectator entity +class Spectator : public core::EntityControlable +{ +public: + Spectator(core::Player *owner); + ~Spectator(); + + /// update the ship state + virtual void frame(float elapsed); + + static core::Cvar *g_spectatorspeed; + static core::Cvar *g_spectatorrotation; +}; + +} + +#endif // __INCLUDED_EXAMPLE_SPECTATOR_H__ + diff --git a/src/game/game.cc b/src/game/game.cc index 9f5b395..01a2574 100644 --- a/src/game/game.cc +++ b/src/game/game.cc @@ -5,8 +5,11 @@ */ #include "game/game.h" + #include "base/base.h" +#include "example/example.h" #include "intro/intro.h" + #include "core/core.h" #include "sys/sys.h" @@ -20,6 +23,7 @@ void register_modules(bool register_noninteractive_modules) // non-interactive modules core::Module::add(new base::Base()); + core::Module::add(new example::Example()); // interactive modules if (register_noninteractive_modules) { diff --git a/src/game/intro/intro.cc b/src/game/intro/intro.cc index abb3ba8..95d003a 100644 --- a/src/game/intro/intro.cc +++ b/src/game/intro/intro.cc @@ -14,9 +14,8 @@ namespace intro { -Intro::Intro() : core::Module("intro", "Introduction") +Intro::Intro() : core::Module("intro", "Introduction", false) { - module_interactive = false; intro_zone = 0; intro_convoy = 0; } @@ -39,8 +38,6 @@ void Intro::init() abort(); return; } - - module_running = true; } bool Intro::load_world() diff --git a/src/game/intro/intro.h b/src/game/intro/intro.h index 748432c..da6fb80 100644 --- a/src/game/intro/intro.h +++ b/src/game/intro/intro.h @@ -23,12 +23,6 @@ public: /// delete an introduction game module ~Intro(); - /// run the introduction - void init(); - - /// shutdown the introduction - void shutdown(); - /// run one frame void frame(float seconds); @@ -38,6 +32,12 @@ public: /// is called when a player disconnects void player_disconnect(core::Player *player); +protected: + /// run the introduction + void init(); + + /// shutdown the introduction + void shutdown(); private: core::Zone *intro_zone; Convoy *intro_convoy; -- cgit v1.2.3