diff --git a/SBA_Serv/Game/AsteroidMiner.py b/SBA_Serv/Game/AsteroidMiner.py
deleted file mode 100644
index 0559b69..0000000
--- a/SBA_Serv/Game/AsteroidMiner.py
+++ /dev/null
@@ -1,49 +0,0 @@
-"""
-Space Battle Arena is a Programming Game.
-
-Copyright (C) 2012-2016 Michael A. Hawker and Brett Wortzman
-
-This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
-
-This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-The full text of the license is available online: http://opensource.org/licenses/GPL-2.0
-"""
-
-from Game import BasicGame
-from Utils import CallbackTimer
-from World.Entities import Entity
-from World.WorldEntities import Ship, Asteroid, Torpedo
-from GUI.ObjWrappers.GUIEntity import GUIEntity
-from World.WorldMath import intpos, friendly_type, PlayerStat, getPositionAwayFromOtherObjects
-from GUI.GraphicsCache import Cache
-from GUI.Helpers import debugfont
-import logging
-import pygame
-from operator import attrgetter
-
-class AsteroidMinerGame(BasicGame):
-
- def __init__(self, cfgobj):
- super(AsteroidMinerGame, self).__init__(cfgobj)
-
- self.__torpedopoints = self.cfg.getint("AsteroidMiner", "points_torpedo")
- self.__shippoints = self.cfg.getint("AsteroidMiner", "points_ship")
-
- def world_add_remove_object(self, wobj, added):
- logging.debug("BH Add Object(%s): #%d (%s)", repr(added), wobj.id, friendly_type(wobj))
- if not added and isinstance(wobj, Asteroid) and hasattr(wobj, "killedby") and wobj.killedby != None:
- obj = wobj.killedby
- if isinstance(obj, Torpedo):
- self.player_update_score(obj.owner.player, self.__torpedopoints)
-
- logging.info("Torpedo Owner (#%d) Destroyed Asteroid", obj.owner.id)
- elif isinstance(obj, Ship) and obj.health.value > 0:
- self.player_update_score(obj.player, self.__shippoints)
-
- logging.info("Ship (#%d) Destroyed Asteroid", obj.id)
-
- super(AsteroidMinerGame, self).world_add_remove_object(wobj, added)
-
diff --git a/SBA_Serv/Game/BaubleHunt.py b/SBA_Serv/Game/BaubleHunt.py
index d82377a..6538a56 100644
--- a/SBA_Serv/Game/BaubleHunt.py
+++ b/SBA_Serv/Game/BaubleHunt.py
@@ -125,7 +125,7 @@ def collectBaubles(self, ship, bauble):
def depositBaubles(self, ship, home):
logging.info("Player Depositing Baubles #%d", ship.id)
for b in ship.player.carrying:
- self.player_update_score(ship.player, b.value)
+ ship.player.update_score(b.value)
home.stored += b.value
ship.player.totalcollected += len(ship.player.carrying)
diff --git a/SBA_Serv/Game/CombatExercise.py b/SBA_Serv/Game/CombatExercise.py
index 3cd4c3a..175e38c 100644
--- a/SBA_Serv/Game/CombatExercise.py
+++ b/SBA_Serv/Game/CombatExercise.py
@@ -43,7 +43,7 @@ def player_died(self, player, gone):
player.object.killedby != None and \
player.object.killedby.owner != None and \
player.object.killedby.owner.player != None:
- self.player_update_score(player.object.killedby.owner.player, player.object.timealive / self.cfg.getint("CombatExercise", "points_time_alive_divide_by"))
+ player.object.killedby.owner.player.update_score(player.object.timealive / self.cfg.getint("CombatExercise", "points_time_alive_divide_by"))
super(CombatExerciseGame, self).player_died(player, gone)
"""
@@ -53,7 +53,7 @@ def world_add_remove_object(self, wobj, added):
if not added and isinstance(wobj, Asteroid) and hasattr(wobj, "killedby") and wobj.killedby != None:
obj = wobj.killedby
if isinstance(obj, Torpedo):
- self.player_update_score(obj.owner.player, self.cfg.getint("CombatExercise", "points_shoot_asteroid"))
+ obj.owner.player.update_score(self.cfg.getint("CombatExercise", "points_shoot_asteroid"))
logging.info("Torpedo Owner (#%d) Destroyed Asteroid", obj.owner.id)
"""
@@ -65,11 +65,11 @@ def world_add_remove_object(self, wobj, added):
elif not added and isinstance(wobj, Ship) and hasattr(wobj, "killedby") and wobj.killedby != None:
obj = wobj.killedby
if isinstance(obj, Torpedo):
- self.player_update_score(obj.owner.player, wobj.timealive / self.cfg.getint("CombatExercise", "points_time_alive_divide_by"))
+ obj.owner.player.update_score(wobj.timealive / self.cfg.getint("CombatExercise", "points_time_alive_divide_by"))
logging.info("Torpedo Owner (#%d) Destroyed Ship (#%d)", obj.owner.id, wobj.id)
elif isinstance(obj, Ship) and obj.health.value > 0:
- self.player_update_score(obj.player, wobj.timealive / self.cfg.getint("CombatExercise", "points_time_alive_divide_by"))
+ obj.player.update_score(wobj.timealive / self.cfg.getint("CombatExercise", "points_time_alive_divide_by"))
logging.info("Ship (#%d) Destroyed Ship (#%d)", obj.id, wobj.id)
diff --git a/SBA_Serv/Game/DiscoveryQuest.py b/SBA_Serv/Game/DiscoveryQuest.py
index 66ce4b6..4485da7 100644
--- a/SBA_Serv/Game/DiscoveryQuest.py
+++ b/SBA_Serv/Game/DiscoveryQuest.py
@@ -206,7 +206,7 @@ def dq_finished_scan(self, ship, obj, success):
# establish as ship's Outpost
ship.player.outpost = obj
obj.home_for.append(ship.player)
- self.player_update_score(ship.player, ship.player.buffervalue + obj.value * 2) # Score initial points + 2*outpost value for establishing base
+ ship.player.update_score(ship.player.buffervalue + obj.value * 2) # Score initial points + 2*outpost value for establishing base
ship.player.buffervalue = 0
ship.player.sound = "SUCCESS"
@@ -216,7 +216,7 @@ def dq_finished_scan(self, ship, obj, success):
for obj in ship.player.scanned:
points += obj.value
ship.player.sound = "MISSION"
- self.player_update_score(ship.player, points * self.cfg.getfloat("DiscoveryQuest", "mission_bonus_multiplier"))
+ ship.player.update_score(points * self.cfg.getfloat("DiscoveryQuest", "mission_bonus_multiplier"))
self.player_reset_mission(ship.player)
@@ -234,7 +234,7 @@ def dq_finished_scan(self, ship, obj, success):
obj.scanned_by.append(ship.player)
ship.player.sound = "SUCCESS"
if ship.player.outpost != None:
- self.player_update_score(ship.player, obj.value)
+ ship.player.update_score(obj.value)
else: #haven't found outpost, need to buffer points
ship.player.buffervalue += obj.value
#end dq_finished_scan
diff --git a/SBA_Serv/Game/FindTheMiddle.py b/SBA_Serv/Game/FindTheMiddle.py
index 4078304..c44bd68 100644
--- a/SBA_Serv/Game/FindTheMiddle.py
+++ b/SBA_Serv/Game/FindTheMiddle.py
@@ -89,7 +89,7 @@ def game_update(self, t):
break
x += 1
ship.body.position = self.player_get_start_position()
- self.player_update_score(ship.player, self.__objective_points[x])
+ ship.player.update_score(self.__objective_points[x])
ship.player.time = 0
elif self.__reset_timer:
ship.player.time = 0
diff --git a/SBA_Serv/Game/Game.py b/SBA_Serv/Game/Game.py
index 4bea37e..e64664d 100644
--- a/SBA_Serv/Game/Game.py
+++ b/SBA_Serv/Game/Game.py
@@ -295,7 +295,7 @@ def server_register_player(self, name, color, imgindex, netid, aiship=None):
if (self.__started and self.__allowafterstart) or not self.__started:
# create new player
#
- p = Player(name, color, imgindex, netid, None)
+ p = Player(name, color, imgindex, netid, self._primary_victory_high)
self.player_added(p, BasicGame._ADD_REASON_REGISTER_)
self._players[netid] = p
@@ -467,21 +467,6 @@ def player_get_by_network_id(self, netid):
#endregion
#region Player Scoring / Leaderboard Functions
- def player_update_score(self, player, amount):
- """
- Should be called to manipulate a player's score, will do extra bookkeeping and sanity for you.
- """
- player.score += amount
-
- # scores can't be negative
- if player.score < 0:
- player.score = 0
-
- # TODO: #118 should probably check if primary highest flag to see if we want to keep track of lowest or highest score here
- # update if this is a new personal best
- if player.score > player.bestscore:
- player.bestscore = player.score
-
def player_died(self, player, gone):
"""
Will be called when a player dies, will adjust score appropriately based on game rules.
@@ -495,7 +480,7 @@ def player_died(self, player, gone):
logging.info("Player %s Died", player.name)
player.deaths += 1
if self._points_lost_on_death > 0:
- self.player_update_score(player, -self._points_lost_on_death)
+ player.update_score(-self._points_lost_on_death)
if self._reset_score_on_death:
self._player_reset_score(player)
diff --git a/SBA_Serv/Game/HungryHungryBaubles.py b/SBA_Serv/Game/HungryHungryBaubles.py
index 2dc441b..80c214e 100644
--- a/SBA_Serv/Game/HungryHungryBaubles.py
+++ b/SBA_Serv/Game/HungryHungryBaubles.py
@@ -62,7 +62,7 @@ def collectBaubles(self, ship, bauble):
# collect own Bauble?
if self.__assign_specific_bauble and bauble == self.__baubles[ship.player.netid]:
logging.info("Collected Own Bauble #%d", ship.id)
- self.player_update_score(ship.player, self.__points_extra)
+ ship.player.update_score(self.__points_extra)
ship.player.sound = "COLLECT"
# add new bauble
self.__addBauble(ship.player, True)
@@ -82,7 +82,7 @@ def collectBaubles(self, ship, bauble):
ship.player.sound = "BAUBLE"
Bauble.spawn(self.world, self.cfg)
#eif
- self.player_update_score(ship.player, bauble.value)
+ ship.player.update_score(bauble.value)
bauble.destroyed = True
logging.info("Done Collecting Baubles #%d", ship.id)
diff --git a/SBA_Serv/Game/KingOfTheBubble.py b/SBA_Serv/Game/KingOfTheBubble.py
index a6e635b..963303c 100644
--- a/SBA_Serv/Game/KingOfTheBubble.py
+++ b/SBA_Serv/Game/KingOfTheBubble.py
@@ -48,7 +48,7 @@ def player_died(self, player, gone):
# calculate points to lose
addyum = player.score * (self.__pointpercent / 100.0) > self.__pointatleast
stealpoints = max(player.score * (self.__pointpercent / 100.0), self.__pointatleast)
- self.player_update_score(player, -stealpoints)
+ player.update_score(-stealpoints)
# see if a Bubble is near us
added = False
@@ -148,8 +148,7 @@ def update(self, t):
ships.append(obj)
for ship in ships:
- #HACK: Need to refigure out how game objects can get game reference with new spawn paradigm, is it the spawn manager passing game instead of world?
- self.__world._GameWorld__game.player_update_score(ship.player, t * self.pointspeed)
+ ship.player.update_score(t * self.pointspeed)
#logging.info("Player %s getting points %d", ship.player.name, ship.player.score)
self.size -= (t * self.pointspeed * len(ships))
diff --git a/SBA_Serv/Game/Players.py b/SBA_Serv/Game/Players.py
index e3338e4..7233cef 100644
--- a/SBA_Serv/Game/Players.py
+++ b/SBA_Serv/Game/Players.py
@@ -2,12 +2,12 @@
class Player(object):
"""Controller of an object in the world"""
- def __init__(self, name, color, imageindex, netid, wobj):
+ def __init__(self, name, color, imageindex, netid, highscore=True):
self.name = name
self.color = color
self.image = imageindex
self.netid = netid
- self.object = wobj
+ self.object = None # Assigned Later
self.roundover = False
self.waiting = False
self.sound = None
@@ -16,6 +16,23 @@ def __init__(self, name, color, imageindex, netid, wobj):
self.deaths = 0
self.disconnected = False
self.lastkilledby = None
+ self.wanthighscore = highscore
+
+ def update_score(self, amount):
+ """
+ Should be called to manipulate a player's score, will do extra bookkeeping and sanity for you.
+ """
+ self.score += amount
+
+ # scores can't be negative
+ if self.score < 0:
+ self.score = 0
+
+ # update personal best
+ if self.wanthighscore and self.score > self.bestscore:
+ self.bestscore = self.score
+ elif not self.wanthighscore and self.score < self.bestscore:
+ self.bestscore = self.score
#TODO: Put alliegiences in here?
diff --git a/SBA_Serv/Game/Survivor.py b/SBA_Serv/Game/Survivor.py
index 4c91b86..1880a3d 100644
--- a/SBA_Serv/Game/Survivor.py
+++ b/SBA_Serv/Game/Survivor.py
@@ -40,7 +40,7 @@ def game_update(self, t):
for player in self.game_get_current_player_list():
# Update a player's score only when they're moving
if player.object != None and player.object.body.velocity.length > self._min_vel:
- self.player_update_score(player, t)
+ player.update_score(t)
super(SurvivorGame, self).game_update(t)
diff --git a/SBA_Serv/Game/Utils.py b/SBA_Serv/Game/Utils.py
index 04f9cb4..094be63 100644
--- a/SBA_Serv/Game/Utils.py
+++ b/SBA_Serv/Game/Utils.py
@@ -9,6 +9,7 @@
import World.WorldEntities
from World.WorldMath import intpos, friendly_type, cfg_rand_min_max, getPositionAwayFromOtherObjects
from World.Entities import Entity
+from World.WorldEntities import Ship, Torpedo
class CallbackTimer(Thread):
"""
@@ -65,6 +66,7 @@ def __init__(self, name, ctype, initialnum):
self._max = False
self._player = False
self._shortlife = False
+ self._points = False
def add_timed_spawn(self, time_num, time_min, time_max): # int, int, int
if time_num > 0 and time_min > 0 and time_max >= time_min:
@@ -127,6 +129,20 @@ def add_shortlife(self, min, max):
def get_shortlife(self):
return random.randint(self._life_min, self._life_max)
+ def add_points(self, torpedo, ram):
+ self._points = True
+ self._points_torpedo = torpedo
+ self._points_ram = ram
+
+ def is_points(self):
+ return self._points
+
+ def get_points_torpedo(self):
+ return self._points_torpedo
+
+ def get_points_ram(self):
+ return self._points_ram
+
class SpawnManager:
ENTITY_TYPES = None
"""
@@ -185,6 +201,10 @@ def __init__(self, cfg, world):
if cfg.has_option(entity, "spawn_alive_time_min"):
sc.add_shortlife(cfg.getint(entity, "spawn_alive_time_min"), cfg.getint(entity, "spawn_alive_time_max"))
+ # do we want to give points on destruction of this object
+ if cfg.has_option(entity, "points_torpedo"):
+ sc.add_points(cfg.getint(entity, "points_torpedo"), cfg.getint(entity, "points_ram"))
+
self._spawns[entity] = sc
self._timers = {}
@@ -271,11 +291,27 @@ def stop(self):
def check_number(self, wobj):
"""
Checks the number of objects in the world to see if more need to be added over minimum.
+
+ Called by game when object removed from the world.
"""
name = friendly_type(wobj)
- if self._running and self._spawns.has_key(name):
+ #logging.debug("Checking Number in Spawn Manager for %s - Running: %s Config: %s", name, repr(self._running), repr(self._spawns.has_key(name)))
+ if self._running and self._spawns.has_key(name):
sc = self._spawns[name]
+ #logging.debug("Configured for Points: %s and Has Info %s", repr(sc.is_points()), repr(hasattr(wobj, "killedby")))
+ if sc.is_points() and hasattr(wobj, "killedby") and wobj.killedby != None:
+ obj = wobj.killedby
+ #logging.debug("Killed By: %s", repr(obj))
+ if isinstance(obj, Torpedo) and hasattr(obj, "owner") and obj.owner != None and isinstance(obj.owner, Ship):
+ obj.owner.player.update_score(sc.get_points_torpedo())
+
+ logging.info("Torpedo Owner (#%d) Destroyed %s for %d Points", obj.owner.id, name, sc.get_points_torpedo())
+ elif isinstance(obj, Ship) and obj.health.value > 0:
+ obj.player.update_score(sc.get_points_ram())
+
+ logging.info("Ship (#%d) Destroyed %s for %d Points", obj.id, name, sc.get_points_ram())
+
if sc.is_min():
count = self._world.get_count_of_objects(type(wobj))
logging.info("Found %d %s Entities", count, name)
diff --git a/SBA_Serv/SBA_Serv.pyproj b/SBA_Serv/SBA_Serv.pyproj
index d6dd695..d968922 100644
--- a/SBA_Serv/SBA_Serv.pyproj
+++ b/SBA_Serv/SBA_Serv.pyproj
@@ -41,7 +41,6 @@
Code
-
diff --git a/SBA_Serv/Tests/test_asteroidminer.cfg b/SBA_Serv/Tests/test_asteroidminer.cfg
index 0ce8817..763c8e5 100644
--- a/SBA_Serv/Tests/test_asteroidminer.cfg
+++ b/SBA_Serv/Tests/test_asteroidminer.cfg
@@ -6,10 +6,5 @@ spawn_time_max = 10
spawn_on_player_num = 1
spawn_on_player_start = true
spawn_on_player_respawn = false
-
-[Game]
-game = AsteroidMiner
-
-[AsteroidMiner]
points_torpedo = 2
-points_ship = 1
+points_ram = 1
diff --git a/SBA_Serv/basicgame_asteroid.cfg b/SBA_Serv/basicgame_asteroid.cfg
index c81524b..2afe5ed 100644
--- a/SBA_Serv/basicgame_asteroid.cfg
+++ b/SBA_Serv/basicgame_asteroid.cfg
@@ -7,10 +7,5 @@ spawn_time_max = 20
spawn_on_player_num = 1
spawn_on_player_start = true
spawn_on_player_respawn = false
-
-[Game]
-game = AsteroidMiner
-
-[AsteroidMiner]
points_torpedo = 2
-points_ship = 1
+points_ram = 1
diff --git a/SBA_Serv/basicgame_dragonslair.cfg b/SBA_Serv/basicgame_dragonslair.cfg
index 756fbb6..d209ef0 100644
--- a/SBA_Serv/basicgame_dragonslair.cfg
+++ b/SBA_Serv/basicgame_dragonslair.cfg
@@ -13,6 +13,8 @@ spawn_keep_min = 12
spawn_keep_max = 12
move_speed_min = 10
move_speed_max = 50
+points_torpedo = 2
+points_ram = 0
[Dragon]
number = 6
@@ -26,6 +28,8 @@ attack_time_min = 0.5
attack_time_max = 1.5
attack_amount_min = 15
attack_amount_max = 25
+points_torpedo = 8
+points_ram = 0
[Game]
game = Survivor
diff --git a/SBA_Serv/buildnum b/SBA_Serv/buildnum
index 63539d7..a2998a8 100644
--- a/SBA_Serv/buildnum
+++ b/SBA_Serv/buildnum
@@ -1 +1 @@
-1119
\ No newline at end of file
+1120
\ No newline at end of file
diff --git a/SBA_Serv/default.cfg b/SBA_Serv/default.cfg
index 397e561..74fcb29 100644
--- a/SBA_Serv/default.cfg
+++ b/SBA_Serv/default.cfg
@@ -39,6 +39,8 @@ buffer_object = 60
buffer_edge = 30
move_speed_min = 5
move_speed_max = 30
+points_torpedo = 0
+points_ram = 0
[Dragon]
number = 0
@@ -56,6 +58,8 @@ attack_amount_min = 15
attack_amount_max = 25
health_min=300
health_max=600
+points_torpedo = 0
+points_ram = 0
[SpaceMine]
number = 0
diff --git a/changelog.md b/changelog.md
index 8cf54fd..361ce06 100644
--- a/changelog.md
+++ b/changelog.md
@@ -18,14 +18,21 @@ v1.2 : Planned - May 2016 [Season 5]
* Updated Find the Middle Basic Game
* Added new *reset_timer* option
* Better Generation of Spawn Points and other Bug Fixes
-* *Optimized Network Code to half required Threads*
-* Spawn Manager fixed to only look at specific Type for evaluating min/max not Subclasses.
-* Added option for Torpedoes to be effected by gravity
-* Added *enable_commands* [Server] config option.
-* Split 'explodable' from 'gravitable' for Entities, two separate object flags now.
-* Can click ships in tracking mode to switch tracking to the clicked ship.
-* Separated option for 'showip' in Application settings to decouple from showing statistics, no longer always show IP in Debug mode.
-* 2 New Ship Graphics
+* Added **Dragon's Lair** Basic Game (based on Survivor)
+ * Dragons AI has been slightly improved
+ * Asteroids and Dragons Initial Movement Speed can be Configured
+ * Dragons highlight target in Debug mode
+ * Added Ability for Points to be Generally Handled by Spawn Manager for Asteroids and Dragons for Torpedos and Ramming
+* General Fixes/Improvements
+ * *Optimized Network Code to half required Threads*
+ * Spawn Manager fixed to only look at specific Type for evaluating min/max not Subclasses.
+ * Added option for Torpedoes to be effected by gravity **pull_weapon**
+ * Added **enable_commands** [Server] config option.
+ * Split 'explodable' from 'gravitable' for Entities, two separate object flags now.
+ * Can click ships in tracking mode to switch tracking to the clicked ship.
+ * Separated option for 'showip' in Application settings to decouple from showing statistics, no longer always show IP in Debug mode.
+ * 2 New Ship Graphics
+ * Fixed issue with LowerEnergyScoopCommand and Dragons
* **Breaking Changes:**
* Made **Hungry Hungry Baubles** a Basic Game by creating a *getObjectiveLocation()* method on BasicGameInfo (instead of *getGoldenBaublePosition()*). This is now also used by **Bauble Hunt** and **Discovery Quest** instead of *getHomeBasePosition()*.
* Hungry Hungry Baubles has new options for configuration (default is similar to previous incarnation).
@@ -34,6 +41,8 @@ v1.2 : Planned - May 2016 [Season 5]
* RotateCommand/Orientation Related Client code now uses **int** vs. **double**.
* Client code now does some validation of command arguments, can **throw IllegalArgumentException**.
* **Removed SelfDestructCommand**
+ * Game API: Removed **AsteroidMiner** as an example game, now configurable generally, config file for game still exists.
+ * Game API: Player object now has **update_score** method instead of Game.
v1.1.0.1111 : 04/21/2016 [Season 4 Release] - Discovery Quest
----
diff --git a/doc/games/asteroidminer.md b/doc/games/asteroidminer.md
index 2b2ed84..7dcd05b 100644
--- a/doc/games/asteroidminer.md
+++ b/doc/games/asteroidminer.md
@@ -17,15 +17,6 @@ Asteroid Miner [Basic Game]
**Asteroid Miner** is a basic game which is a great way to introduce locating and avoiding objects.
-Players must destroy asteroids using torpedoes or by ramming into them with their ships (ouch). Each asteroid is worth 2 points if destroyed with a torpedo or 1 point if rammed (by default). These point values can be configured.
+Players must destroy asteroids using torpedoes or by ramming into them with their ships (ouch). Each asteroid is worth 2 points if destroyed with a torpedo or 1 point if rammed (by default). These point values can be configured via the Spawn Manager.
-Control asteroid spawning by using the standard [Spawn Manager](../server/config.html#spawnmanager) properties.
-
-Configuration
------------
-
-###points_torpedo = int
-Number of points for destroying an asteroid with a torpedo.
-
-###points_ship = int
-Number of points for destroying an asteroid with a ship (without destroying your ship).
+Control asteroid spawning and point values by using the standard [Spawn Manager](../server/config.html#spawnmanager) properties.
diff --git a/doc/games/basic.md b/doc/games/basic.md
index ee32ebb..8d0c10a 100644
--- a/doc/games/basic.md
+++ b/doc/games/basic.md
@@ -6,6 +6,7 @@ outline-header: Basic Games
outline:
- { url: "findthemiddle.html", title: "Find The Middle" }
- { url: "survivor.html", title: "Survivor" }
+ - { url: "survivor.html#dl", title: "Dragon's Lair" }
- { url: "asteroidminer.html", title: "Asteroid Miner" }
- { url: "combatexercise.html", title: "Combat Exercise" }
- { url: "hungryhungrybaubles.html", title: "Hungry Hungry Baubles" }
diff --git a/doc/games/index.md b/doc/games/index.md
index 931b3a3..ed9ecf9 100644
--- a/doc/games/index.md
+++ b/doc/games/index.md
@@ -5,6 +5,7 @@ outline:
- { url: "basic.html", title: "Basic Games" }
- { url: "findthemiddle.html", title: "Find The Middle" }
- { url: "survivor.html", title: "Survivor" }
+ - { url: "survivor.html#dl", title: "Dragon's Lair" }
- { url: "asteroidminer.html", title: "Asteroid Miner" }
- { url: "combatexercise.html", title: "Combat Exercise" }
- { url: "hungryhungrybaubles.html", title: "Hungry Hungry Baubles" }
diff --git a/doc/games/survivor.md b/doc/games/survivor.md
index 690f895..4cecf0f 100644
--- a/doc/games/survivor.md
+++ b/doc/games/survivor.md
@@ -7,6 +7,7 @@ outline-header: Outline
outline:
- { url: "#overview", title: "Overview" }
- { url: "#config", title: "Configuration" }
+ - { url: "#dl", title: "Dragon's Lair" }
---
Survivor [Basic Game]
@@ -28,3 +29,8 @@ A player's best record is used to determine their ranking, so even if your inter
###minimum_velocity = int
The minimum speed a ship must be travelling in order to accumulate points.
+
+
+Dragon's Lair
+-----------
+**Dragon's Lair** is a variant of Survivor in where the world is populated with Dragons. Players earn not only points for surviving in the world, but also for hunting dragons.
diff --git a/doc/index.md b/doc/index.md
index 1ac3708..e84880f 100644
--- a/doc/index.md
+++ b/doc/index.md
@@ -57,6 +57,7 @@ Documentation
* ['Basic' Games](games/basic.html)
* [Find The Middle](games/findthemiddle.html)
* [Survivor](games/survivor.html)
+ * [Dragon's Lair (Variant)](games/survivor.html#dl)
* [Asteroid Miner](games/asteroidminer.html)
* [Combat Exercise](games/combatexercise.html)
* [Hungry Hungry Baubles](games/hungryhungrybaubles.html)
diff --git a/doc/server/config.md b/doc/server/config.md
index a0d7d80..b450b6f 100644
--- a/doc/server/config.md
+++ b/doc/server/config.md
@@ -170,7 +170,7 @@ Minimum number of [Entity] to keep in the world. If the number falls below this
Maximum cut-off for spawning new [Entity] types on the timer. If the number of objects has reached this level, no new entities will be spawned using the spawn timing settings below. Games or other events may still spawn entities of this type however.
###spawn_time_num = integer
-Number of entities to spawn at a time with the timing settings below. If specified, you must also specify the spawn_time_min and spawn_time_max options.
+Number of entities to spawn at a time with the timing settings below. *If specified, you must also specify the spawn_time_min and spawn_time_max options.*
###spawn_time_min = integer
Minimum time in seconds before spawning the spawn_time_num of [Entity] unless spawn_keep_max has been reached.
@@ -189,6 +189,13 @@ Number of [Entity] to add to the universe when a player is added to it.
###spawn_on_player_respawn = boolean
Specify which scenarios (first created in round and/or whenever re-added) to add the spawn_on_player_num [Entity] to the world.
+###points_torpedo = int
+Number of points for destroying the spawned entity with a torpedo (if applicable). *Must specify both points_torpedo and points_ram.*
+
+###points_ram = int
+Number of points for destroying the spawned entity with a ship via ramming (without destroying your ship).
+
+
[Asteroid]
---------------------------------------
Asteroids are flying debris in space. They start off with a set amount of momentum and will continue flying in space until impacting ships or destroyed by torpedos.