Puck, the Netrek Hockey Robot, Documentation

Who:  Initially by Terence Chang
      Then by Brick Verser
      Now by Michael Kantner
      With input and help from many others

What: A hockey robot for netrek guzzler/bronco servers.  Made
      popular at hockey.ksu.edu.  

To build:  cd ntserv; make puck
To run:    puck &
To exit:   kill -2 "process id"

Customization:  The game can be modified through a few defaults in
puckdefs.h.  Here is a list.

#define        for INHL   for good game  comment
---------------------------------------------------------------------
SOCCER_SHOOT   disable    disable        from old code, not used
HAVE_GOALIE    disable    disable        no one seems to like this
WALL_BOUNCE    disable    enable         improves game
GOAL_CLEAR     disable    enable         improves game
NEWGAME_RESET  enable     enable         makes stats nicer
NO_BRUTALITY   disable    who cares      more like real hockey
ALLOW_EJECT    disable    enable         allows ejecting twinks
SHORT_GAME     enable     who cares      disable is like NHL hockey
ANNOUNCER      disable    enable         help people on B/W terminals
OFFSIDE        disable    disable        does NOT work well yet


To receive the most recent version of the code, contact Michael
Kantner at kantner@hot.caltech.edu.  Also, please send any comments
or bug reports there, too.


/******
 *
 * Change Log
 *
 ******/


Known Features/Problems (not necessarily bugs)

a)  It is possible (but rare) that you can deflect your own shot
    while dribbling.  Haven't checked into this yet, but the code
    is the same as the original from hockey.ksu.edu

b)  Resurrection occasionally acts weird.  I have never seen it,
    but one person has commented on it.

------
Upcoming Potential Events

a)  New reset idea:  The current stuff works fine.  It discourages
    random killing.  Lot's of other suggestions...

b)  New goalie ideas:  Someone suggested that the goalie should
    always reappear in front of the net, but otherwise be a
    normal ship.  Any other ideas?

------
Version 2.01Bpl0, November 8, 1993 ***Beta Release Version***

1)  Appropriate stuff was taken from rmoveII.c to allow it to run
    with the -DS stuff.  Will still work without -DS

2)  Stats Message:  It no longer lists blank lines for the
    space filling robots.

3)  Offsides code:  It has been started and is fully functional,
    but not much fun to play with.  It will be improved in future
    releases.  I do NOT recommend using it.
    Enable via #define OFFSIDE

4)  Player Eject by voting:  Works great but is a potential
    memory hog.  Discussed topic with BAV, no decision yet.
    Enable via #define ALLOW_EJECT

5)  Clock does not tick while puck is not in play:  That is, time
    does not tick during faceoff.  Currently, 35 seconds is lost
    every time a goal is scored.  This will cause a 15 goal game to
    last about 8 minutes longer.
    Disable via #define SHORT_GAME (i.e clock always ticks)

6)  Loquacious Announcer:  Announces each time puck possession changes.
    Enable via #define ANNOUNCER

7)  Restructured the control flow of the game.  Is now in a more
    "logical" pattern, and returns from the routine ASAP.  This
    requires less if checking later through the code.  Also added
    more comments to the code.

8)  The track typedef has changed dramatically.  Read the code if
    you are truly interested.  New fields were added.

9)  Voting now requires 50% + 1 player to pass a motion.

------
Version 2.00, October 1, 1993

1)  Can't fly through goal or out of bounds:  You can't leave the
    rink unintentionally.  If you hit the side walls or goal, you
    stop moving in that direction, however, it doesn't slow your
    speed.  i.e.  Fly warp 12 into the side, you still use warp 12
    fuel and change angle at the warp 12 rate.  These are #IFDEF's
    Enable via #define WALL_BOUNCE
    Enable via #define GOAL_CLEAR

    Known feature:  if orbiting a goal planet, you can enter
    the goal area.  If you want into the goal, you must go slow...

2)  Sitout code:  send "sitout" to puck, and you are teleported out
    of the rink.  In addition, fuel goes to zero and hull to 5.  
    This prevents people from taking advantage of the code.  Ori's
    go to right side, Kli's to the left.  Very useful with a) above.
    Can skate back onto rink at any time.  Messages are sent 
    announcing the sitout and return.  If someone manages to kill 
    you while sitting out (improbable with a above) you reappear
    where you died, still sitting out.  Always enabled.

    Known feature:  Players sitting out can sit near the side line 
    and lob torps.

3)  Version announcement:  send "version" to puck and he tells you
    what puck is running.

4)  NEWGAME reset:  Upon a successful NEWGAME vote, all stats are
    reset.  This is very useful for INHL games.  This is an #IFDEF
    Enable via #define NEWGAME_RESET

5)  Kinder, gentler hockey:  After a goal, everyone is made peaceful.
    This ends the annoying wars in the 5 seconds after goal before
    faceoff.  This is an #IFDEF (that I keep turned off.)  It falls
    into more like life category.
    Enable via #define NO_BRUTALITY

------
Version 1.00, September 20, 1993

1)  It will NOT work with old servers (non-guzzler), or at least I
    I won't guarantee it.

2)  It is now 3 files.  puckdefs.h was added for things that are 
    needed in both puck and puckmove, such as the rink layout.

3)  Messages now use variable argument lists and the smessage.c
    It is trivial to follow the new syntax

4)  Puck exits gracefully with a "kill -2"  Upon exiting, it now
    frees the slots it held (potential minor bug here if someone
    is joining at puck is exiting) and sends a message that 
    hockey is over.

5)  The variable rmove per/sec (define PERSEC) is located in 
    puckdefs.h and sets the timer in puck.c (added by MK) and
    all the appropriate values in puckmove.c (BAV)  

6)  Goalie ships are enabled via a define in puckdefs.h.  In 
    addition, the "free repair bug" has been fixed (from Jamie)
    Upon ungoalie, you now have 50% damage, 50% fuel, and 50% shields.
    Enabled via #define HAVE_GOALIE

7)  do_war is now executed immediately after config so that the
    planets are immediately at 2 armies and slots are held.  More of
    a technicality than anything else.

8)  some other cosmetic changes probably occurred, and they should be
    documented in the code.

I tried to credit everyone with their contributions whenever possible.
I'm sure I forgot some.  

------
Version 0.9999999

1)  started with puck code as running on hockey.ksu.edu, as was 
    maintained by Bric Verser


/******
 *
 * Old Documentation Follows
 *
 ******/

Puck.  Beta release v0.3.  Written 7/6/92 by Terence Chang.

Changes from v0.2
-----------------
Shot speed upped to 40.  Tractor ranges proportional to standard
ranges per class -- Puck's shield goes up/down as it enters/leaves
tractor range of nearest player, if within "shot range".  Puck can be
intercepted at 1/3 of shot speed (and will stop moving), and deflected
at speeds above that (deflect == new random direction).  Intercepts
and deflects only require that the Puck notice possession.

Puck takes a length argument (-l<number of 3-period games to play>).
Puck stores the galaxy status on startup and restores the old galaxy
status (locations, ownership, armies, everything) on shutdown.  Puck
also restores all ships back to normal characteristics.

Puck tracks ships' locations and attempts to relocate reentering ships
where they died (with a random forward/backward offset).  This is
generally confusing... may want to disable this.

Puck tracks goals and assists per player, and reports them to players
who send "stat" to Puck.

After a goal is scored, only offsides players get teleported onsides.

Puck does some random game commentary, based on who is in possession
and where the puck is.

Sending the message 'help' to ALL produces a clarification from Puck.

Changes from v0.1
-----------------
Puck will turn into a pretty starbase explosion upon entering a goal,
instead of simply disappearing.

Puck keeps track of the last two players on each team that had "possession"
of the puck (was nearest and was pressoring/tractoring).  The last player to
touch the puck on the scoring team is credited with the goal.  The next to
last player is credited with an assist.

Puck checks for messages sent to it.  Upon sending a message containing
"help" to Puck, it replies with the rules.

[ This may be distributed freely and improved upon.  It was coded
  for use the Bronco Netrek server code, but should work with any flavor
  of server.  Recent Bronco code may be gotten by anonymous FTP from
  gs69.sp.cs.cmu.edu. ]

Installation
------------
Along with this Readme are the files puck.c and puckmove.c.  These are
analogous to robotII.c and rmove.c, so you need to add these lines to
ntserv/Makefile and then do "make puck":

P_OBJS =        data.o \
                detonate.o \
                enter.o \
                getship.o \
                interface.o \
                orbit.o \
                phaser.o \
                puck.o \
                puckmove.o \
                sintab.o \
                startdaemon.o \
		sysdefaults.o \
                torp.o \
                util.o

puck: $(P_OBJS)
	cc $(CFLAGS) -o puck $(P_OBJS) $(LIBS)
	chmod 4751 puck

Usage
-----
Just execute "puck" from the command line.  It has one option
(-l<number of periods>).  You may want to tailor .sysdef to your taste
(e.g., set TOURNPLAYERS=9, possibly disallow SBs).

Rules
-----
This is Netrek hockey.  "puck" adds an indestructible, lightweight,
weaponless, independent, peaceful robot that serves as a hockey puck.
Kli and Ori players attempt to move the puck into the opposing goal
using tractors/pressors and by "shooting" the puck.  No Feds or Roms
may enter the game.

The galaxy is rearranged into a hockey rink as follows:

                              
           --Ear              K-And   K-Cyg   K-Pol             --Rom
                              K-Sco           K-Lyr
           --Rig                                                --Eri

           --Can                                                --Ald
                      --Lal           K-Kli          --Cas
           --Bet                                                --Reg

           --Org                                                --Cap
                      --Pro     --Pli      --El      --Mir
           --Den                                                --Tau

           --Cet      --Urs           O-Ori          --Her      --Dra

           --Alt                                                --Sir

           --Veg                                                --Ind
                              O-Spi           O-Cas
           --Alp              O-Pol   O-Arc   O-Ant             --Hyd


The goals are at the top and bottom of the rink.  Orions and Klingons
appear on their respective blue lines (1/3 up from their own goal).
The red line is at the center of the galaxy.  All planets within the
rink are fuel/repair.  There is no carrying of armies allowed.  Klis
are always hostile to Oris and vice versa.  

Players may shoot the puck.  They can do so if they are closest to the
puck and they are close enough (Puck will raise his shields if this is
so).  By pressoring, the puck acquires a velocity of warp 40
(SHOTSPEED) in the direction the shooter's ship is pointing in.  Puck
velocity will decay nonlinearly (full range is barely from red line to
the goal).

Puck can be intercepted.  If tractored/pressored while moving at low
speed (currently SHOTSPEED/3), Puck stops moving.  If tractored/
pressored at speeds above that, Puck changes direction randomly.
Note:  Puck can only check every 0.5 sec for shots/intercepts/deflects.

Puck bounces off the sides of the rink (players may move freely within
the entire galaxy) and bounces off the sides and backs of the goals.
At faceoff time any offsides players are placed back onsides (during
faceoff countdown, all ships are peaceful and tractors have virtually
zero strength).

Any other robots in the game will be nuked by Puck.  All ships have
scaled down tractor range/strength based on ship class.  All ships
have essentially no etmp.

Puck will keep score, keep time, track goals and assists (last
teammate to hand off puck to scorer), and announce who shoots along
with other random game commentary.

Terminating Puck
----------------
To restore the server to its normal state, kill the puck process (not
kill -9).  Restore .sysdef.

Possible extensions
-------------------
So far this has been a one week hack.  Possible additional features:

- Keep stats for each period.
- Allow SB goalies but constrain their movement to a zone near the
  goal.
- Make the shot velocity/dir based more on the physics of the situation.
- Give the puck momentum not just with shots, but all tractor/pressor
  contact as well.
- (Complicated) Without t-mode, teams cannot be forced to be balanced,
  but having t-mode on would mess up global and player stats.
  Swapping in a hockey-specific .global and .players would be ideal.
- Maintain some stats.  Replace "t-mode planets" with goals and
  "t-mode armies" with assists, for example.
- Determine which shots were directed towards a goal from within
  range, and keep count of shots on goal.
- (Silly) Turn the Puck into a Zamboni between periods and have it
  sweep up and down the rink.
- (Complicated) Make cross-ogging (cross-checking) illegal.  Penalize
  players who kill an enemy that does not have control of the puck.
- (Complicated) Enforce icing and offsides.
- Experiment with non-uniform shot speeds.
- Calibrate the ships so they don't run out of fuel as fast?  Maybe
  make torps very cheap to fire?
- Make shooting easier.  Presently requires the shooter to slow down
  to low warp.