backExamples

Xelagot action script

LaserTag Bot

This script would not have been possible without the invaluable help and advice of Killamo, and the generosity of LordVector of VectorScape.

Preparation
This is a Laser Tag game for two teams, Reds and Greens. It uses objects marked with a 'create name xxx' in the action field. Reading the value of xxx, the bot will know what the object is for. The actual contents of the action field of the objects are kept in the data file Settings.txt, and can be customised without rewriting the script. They are shown here in brackets or in bold: (NameLaserNotice=name LaserNotice) means that item in the Settings.txt file. There are 3 files, which must be in the same directory:
  1. LaserTag01.txt (for Eminent Domain bots) or LaserTag02.txt (for other bots). This is the actual script which must be loaded in the xelagot.
  2. Avatar.txt and
  3. Settings.txt contain data used by the script.

The script has 4 stages:

  1. the initialisation stage: the bot scans the area and initialises the game settings.
  2. a paused stage, followed by
  3. a registration stage. If registration of team members is successful, this is followed by
  4. a playing stage (the game), which is followed again by the paused stage.

It needs two areas in the same zone of the world:

  1. the Registration area
  2. the Battlefield
The Registation area is for registering the teams. It must have a few objects used during registration. These must be signs accepting visible text. The Battlefield, that must be rectangular and face North-South or West-East, needs:

To play, team members must wear appropriate avatars, as specified in the file Avatar.txt. There, Red=0,MrTourist means red team members must wear avatar 0, which is called on the avatar list "MrTourist". You must edit this file and put the right avatar number and name for reds and greens.

The Settings.txt has more items:

See also the note on energizers if you are having trouble with them.

Download the LaserTag bot script

LaserTag01.zip is for bots using Eminent Domain rights. They may change objects belonging to others (provided these others have build rights).

LaserTag02.zip is for other bots, they must log in with the citizen number of the owner of the objects they must modify.


The data file Settings.txt
Field=0.000n 0.000w 0.00a 0.0
GameLength=10
Red=Red
Green=Green
RedTitle=Reds
GreenTitle=Greens
NameNWTop=name NWTop
NameSEBottom=name SEBottom
NameRedBase=name RedBase
NameGreenBase=name GreenBase
NameRedEnergizer=name RedEnergizer
NameGreenEnergizer=name GreenEnergizer
NameRedBoard=name RedBoard
NameGreenBoard=name GreenBoard
NameNoJoin=name NoJoin
NameRedJoin=name RedJoin
NameGreenJoin=name GreenJoin
NameRedNames=name RedNames
NameGreenNames=name GreenNames
NameLaserNotice=name LaserNotice
ScoreHitAv=1
ScoreHitBase=10
ScoreHitOwnAv=-1
ScoreHitOwnBase=0
ScoreHitMiss=0
AvRecoverySec=10
BaseRecoverySec=10
MaxShots=10
JoinRedTeam=Click to join Read Team
JoinGreenTeam=Click to join Green Team
Withdraw=Click to withdraw
BreakLength=3
RegMinimum=5
RegMaximum=10


The avatar file Avatar.txt
Red=0,MrTourist
Green=1,MrsTourist


The script file LaserTag02.txt
Note: if the energizers are giving you trouble, you can remove the check on distance from the code in the Sub RedEnergize and Sub GreenEnergize. I have emphasized it in red here and in the Script example:
...

   IfLoc &Source IsInVCylinder @a 1.5 1.5 #
   Else Goto RedEnergizeNot


...

   IfLoc &Source IsInVCylinder @a 1.5 1.5 #
   Else Goto GreenEnergizeNot


[Head]
Type=Script
Version=2.0

[Settings]
Origin=0.000n 0.000w 0.00a 0.0

[Script]
                         ###################################
                         #        The LaserTag Bot         #
                         #        a Xelagot script         #
                         # (c) 1999 Alex Grigny de Castro  #                       
                         #      written with the help of   #
                         #            Killamo              #
                         ###################################


# does not use ED rights to change objects

# general
var %Stage
var /s_Menu, $Chatline, $Value, %Value, $BotName
var /s_MenuAll
var $Error, $Err, %Error
var @Field, @Seat, ~NWTSEB, %IsQuerying
var %GameLength, %GameSec, %WarnSec, %LastMinuteWarn
var /s_Avatar, $AvatarFile
var $Red, $Green, $NoJoin, $RedAv, %RedAv, $GreenAv, %GreenAv
var $JoinRedDes, $JoinGreenDes, $NoJoinDes
#
var $NoJoin, $RedJoin, $GreenJoin, $RedNames, $GreenNames
var $RedMembers, $GreenMembers
var %SourceColor, %TargetColor
var ~RedJoin, ~GreenJoin, ~NoJoin
var $LaserNotice, ~LaserNotice, $LaserNoticeDes

var ~RedBase, ~GreenBase, $RedBase, $GreenBase
var ~RedEnergizer, ~GreenEnergizer, $RedEnergizer, $GreenEnergizer
# boards
var $RedBoard, $GreenBoard
var %ScoreI, %ScoreC
var %ScoreRed, %ScoreGreen, $Score
# for Sub IsInField
var @WhereIs, @NWTop, @SEBottom, $NWTop, $SEBottom
var %IsInField
# TEAMS
var $RedTitle, $GreenTitle
var /s_REDS, /s_GREENS, $FReds, $FGreens
var /s_Settings, $FSettings
var /t_Recovering, /t_BaseHit
# Timeouts
var %RecoveryTime, %BaseHitTime
var %BreakLength, %RegMinimum, %RegMaximum
var %BreakSec, %RegMinSec, %RegMaxSec

# Players
var &Source, &Target, ~Target, $Source, $Target
var %SourceAv, %TargetAv
var %SourceIsInField, %TargetIsInField
var %HitAv, %HitBase, %HitOwnAv, %HitOwnBase, %Miss
var %TeamScore, %ShotsLeft, $Team, %acc, $acc
var %SShotsLeft, %SShots, %SHitAv, %SWasHit, %SHitBase
var %SHitOwnAv, %SHitOwnBase, %SScore, $SScoreCard
var %TShotsLeft, %TShots, %THitAv, %TWasHit, %THitBase
var %THitOwnAv, %THitOwnBase, %TScore, $TScoreCard

Label Start
   %Stage = 0
   Gosub Initialise

   OnWorldReconnectEvent Reconnect
   Gosub ScanField
   Label Scanning
   IfInt %IsQuerying = 1 Goto Scanning
   %Error = 0
   $Error = ""

   Say Searching for notice board...
   $LaserNoticeDes = "Initialising..."
   Gosub SetLaserNotice
   IfString $Error <> "" Goto Error
   Say Found notice board

   Say Searching for markers...
   Gosub FindNWTSEB
   IfString $Error <> "" Goto Error
   Say Found field markers

   Gosub BotPosition

   Say Searching for registrars...
   Gosub FindJoin
   IfString $Error <> "" Goto Error
   Say Found registrars
   Gosub ClearJoin

   Say Searching for bases...
   Gosub FindBases
   IfString $Error <> "" Goto Error
   Say Found bases

   Say Searching for energizers...
   Gosub FindEnergizers
   IfString $Error <> "" Goto Error
   Say Found energizers

   Say Searching for score boards...
   Gosub SetScores
   IfString $Error <> "" Goto Error
   Say Found score boards

   Say Searching for team boards...
   Gosub SetNames
   IfString $Error <> "" Goto Error
   Say Found team boards

   Say Ready! 
   Goto InitBreak2

Label InitRegister
   $LaserNoticeDes = "Registering"
   Gosub ClearConfirmed
   Gosub SetLaserNotice
   Gosub InitialiseRegister
   GetDateTime !t
   !v = !t
   Label LoopRegister
      GetDifSecond %s !t
      IfInt %s > 5 Gosub CheckRegisters
      GetDifSecond %s !v
      IfInt %s < %RegMinSec Goto LoopRegister
      OnObjectClickEvent ObjectClickRegister2
      $LaserNoticeDes = "Click to start playing"
      Gosub SetLaserNotice
      Sbt %a %RegMaximum %RegMinimum
      StringFromReal $b %a
      Concat $a "Timeout for registering is in " $b " minutes. Click on sign to start playing"
      Say $a
   Label LoopRegister2
      GetDifSecond %s !t
      IfInt %s > 5 Gosub CheckRegisters
      GetDifSecond %s !v
      IfInt %s < %RegMaxSec Goto LoopRegister2
      Say Timed out, sorry....
      Goto InitBreak2

Label InitPlay
   Gosub InitialisePlay
   GetDateTime !t
   !u = !t
   Label LoopPlay
      GetDifSecond %s !t
      IfInt %s > %WarnSec IfInt %LastMinuteWarn <> 0 GoSub WarnLastMinute
      Else Gosub CheckScores
      IfInt %s < %GameSec Goto LoopPlay
      Else Gosub TerminatePlay

Label InitBreak
   Gosub InitialiseBreak
   $LaserNoticeDes = "Game over"
   Gosub SetLaserNotice
   GetDateTime !v
   Label LoopBreak
      GetDifSecond %s !v
      IfInt %s < %BreakSec Goto LoopBreak

      OnObjectClickEvent ObjectClickBreak2
      $LaserNoticeDes = "Click to start registering"
      Gosub SetLaserNotice
   Label LoopBreakA
      Goto LoopBreakA

Label InitBreak2
   Gosub InitialiseBreak
   OnObjectClickEvent ObjectClickBreak2
   $LaserNoticeDes = "Click to start registering"
   Gosub SetLaserNotice
   Label LoopBreak2
      Goto LoopBreak2


End
Label Error
   Say $Error
End

Sub Initialise
   $FSettings = "Settings.txt"
   $AvatarFile = "Avatar.txt"
   $FReds = "Reds.txt"
   $FGreens = "Greens.txt"
   $NoJoin = "Withdraw"
   Gosub LoadSettings
   GetName $BotName
   %IsQuerying = 0
   %ScoreRed = 0
   %ScoreGreen = 0
   SListLoad /s_REDS $FReds %r
   SListNameValueOnly /s_REDS
   SListSave /s_REDS $Freds %r
   SListLoad /s_GREENS $FGreens %r
   SListNameValueOnly /s_GREENS
   SListSave /s_GREENS $FGreens %r
   Gosub LoadAvatar
   Gosub SaveSettings
EndSub

Sub LoadSettings
   SListLoad /s_Settings $FSettings %r
   # scan position, middle of zone, altitude/rotation irrelevant
   IfSlistGetValue /s_Settings "Field" $v @Field = $v
   Else @Field = 0n 0w
   # length of game in minutes
   IfSlistGetValue /s_Settings "GameLength" $v %GameLength = $v   
   Else %GameLength = 20
   Max %GameLength %GameLength 2
   # length of break in minutes
   IfSlistGetValue /s_Settings "BreakLength" $v %BreakLength = $v   
   Else %BreakLength = 3
   Max %BreakLength %BreakLength 1
   # minimum length of registration in minutes
   IfSlistGetValue /s_Settings "RegMinimum" $v %RegMinimum = $v   
   Else %RegMinimum = 1
   Max %RegMinimum %RegMinimum 1
   # maximum length of registration in minutes
   IfSlistGetValue /s_Settings "RegMaximum" $v %RegMaximum = $v   
   Else %RegMaximum = 2
   Add %a %RegMinimum 1
   Max %RegMaximum %RegMaximum %a

   # change to seconds
   Mul %GameSec %GameLength 60
   Sbt %WarnSec %GameSec 60
   Mul %BreakSec %BreakLength 60
   Mul %RegMinSec %RegMinimum 60
   Mul %RegMaxSec %RegMaximum 60

   IfSlistGetValue /s_Settings "Red" $v $Red = $v
   Else $Red = "Red"
   IfSlistGetValue /s_Settings "Green" $v $Green = $v
   Else $Green = "Green"
   IfSlistGetValue /s_Settings "RedTitle" $v $RedTitle = $v
   Else $RedTitle = "Reds"
   IfSlistGetValue /s_Settings "GreenTitle" $v $GreenTitle = $v
   Else $GreenTitle = "Greens"
   IfSlistGetValue /s_Settings "NameNWTop" $v $NWTop = $v
   Else $NWTop = "name NWTop"
   IfSlistGetValue /s_Settings "NameSEBottom" $v $SEBottom = $v
   Else $SEBottom = "name SEBottom"
   IfSlistGetValue /s_Settings "NameRedBase" $v $RedBase = $v
   Else $RedBase = "name RedBase"
   IfSlistGetValue /s_Settings "NameGreenBase" $v $GreenBase = $v
   Else $GreenBase = "name GreenBase"
   IfSlistGetValue /s_Settings "NameRedEnergizer" $v $RedEnergizer = $v
   Else $RedEnergizer = "name RedEnergizer"
   IfSlistGetValue /s_Settings "NameGreenEnergizer" $v $GreenEnergizer = $v
   Else $GreenEnergizer = "name GreenEnergizer"
   IfSlistGetValue /s_Settings "NameRedBoard" $v $RedBoard = $v
   Else $RedBoard = "name RedBoard"
   IfSlistGetValue /s_Settings "NameGreenBoard" $v $GreenBoard = $v
   Else $GreenBoard = "name GreenBoard"
   IfSlistGetValue /s_Settings "NameNoJoin" $v $NoJoin = $v
   Else $NoJoin = "name NoJoin"
   IfSlistGetValue /s_Settings "NameRedJoin" $v $RedJoin = $v
   Else $RedJoin = "name RedJoin"
   IfSlistGetValue /s_Settings "NameGreenJoin" $v $GreenJoin = $v
   Else $GreenJoin = "name GreenJoin"
   IfSlistGetValue /s_Settings "NameRedNames" $v $RedNames = $v
   Else $RedNames = "name RedNames"
   IfSlistGetValue /s_Settings "NameGreenNames" $v $GreenNames = $v
   Else $GreenNames = "name GreenNames"
   IfSlistGetValue /s_Settings "JoinRedTeam" $v $JoinRedDes = $v
   Else $JoinRedDes = "Click to join Read Team"
   IfSlistGetValue /s_Settings "JoinGreenTeam" $v $JoinGreenDes = $v
   Else $JoinGreenDes = "Click to join Green Team"
   IfSlistGetValue /s_Settings "Withdraw" $v $NoJoinDes = $v
   Else $NoJoinDes = "Click to withdraw"
   IfSlistGetValue /s_Settings "NameLaserNotice" $v $LaserNotice = $v
   Else $LaserNotice = "name LaserNotice"


   IfSlistGetValue /s_Settings "ScoreHitAv" $v %HitAv = $v
   Else %HitAv = 1
   IfSlistGetValue /s_Settings "ScoreHitBase" $v %HitBase = $v
   Else %HitBase = 10
   IfSlistGetValue /s_Settings "ScoreHitOwnAv" $v %HitOwnAv = $v
   Else %HitOwnAv = -1
   IfSlistGetValue /s_Settings "ScoreHitOwnBase" $v %HitOwnBase = $v
   Else %HitOwnBase = 0
   IfSlistGetValue /s_Settings "ScoreHitMiss" $v %Miss = $v
   Else %Miss = 0
   IfSlistGetValue /s_Settings "AvRecoverySec" $v %RecoveryTime = $v
   Else %RecoveryTime = 10
   IfSlistGetValue /s_Settings "BaseRecoverySec" $v %BaseHitTime = $v
   Else %BaseHitTime = 30
   IfSlistGetValue /s_Settings "MaxShots" $v %ShotsLeft = $v
   Else %ShotsLeft = 15
   Max %ShotsLeft %ShotsLeft 10
EndSub

Sub SaveSettings
   $v = @Field
   SlistSetValue /s_Settings "Field" $v
   $v = %GameLength
   SlistSetValue /s_Settings "GameLength" $v
   $v = %RegMinimum
   SlistSetValue /s_Settings "RegMinimum" $v
   $v = %RegMaximum
   SlistSetValue /s_Settings "RegMaximum" $v
   $v = %BreakLength
   SlistSetValue /s_Settings "BreakLength" $v
   SlistSetValue /s_Settings "Red" $Red
   SlistSetValue /s_Settings "Green" $Green
   SlistSetValue /s_Settings "RedTitle" $RedTitle
   SlistSetValue /s_Settings "GreenTitle" $GreenTitle
   SlistSetValue /s_Settings "NameNWTop" $NWTop
   SlistSetValue /s_Settings "NameSEBottom" $SEBottom
   SlistSetValue /s_Settings "NameRedBase" $RedBase
   SlistSetValue /s_Settings "NameGreenBase" $GreenBase
   SlistSetValue /s_Settings "NameRedEnergizer" $RedEnergizer
   SlistSetValue /s_Settings "NameGreenEnergizer" $GreenEnergizer
   SlistSetValue /s_Settings "NameRedBoard" $RedBoard
   SlistSetValue /s_Settings "NameGreenBoard" $GreenBoard
   SlistSetValue /s_Settings "NameNoJoin" $NoJoin
   SlistSetValue /s_Settings "NameRedJoin" $RedJoin
   SlistSetValue /s_Settings "NameGreenJoin" $GreenJoin
   SlistSetValue /s_Settings "NameRedNames" $RedNames
   SlistSetValue /s_Settings "NameGreenNames" $GreenNames
   SlistSetValue /s_Settings "JoinRedTeam" $JoinRedDes
   SlistSetValue /s_Settings "JoinGreenTeam" $JoinGreenDes
   SlistSetValue /s_Settings "Withdraw" $NoJoinDes
   SlistSetValue /s_Settings "NameLaserNotice" $LaserNotice
   $v = %HitAv
   SlistSetValue /s_Settings "ScoreHitAv" $v
   $v = %HitBase
   SlistSetValue /s_Settings "ScoreHitBase" $v
   $v =  %HitOwnAv
   SlistSetValue /s_Settings "ScoreHitOwnAv" $v
   $v = %HitOwnBase
   SlistSetValue /s_Settings "ScoreHitOwnBase" $v
   $v = %Miss
   SlistSetValue /s_Settings "ScoreHitMiss" $v
   $v = %RecoveryTime
   SlistSetValue /s_Settings "AvRecoverySec" $v
   $v = %BaseHitTime
   SlistSetValue /s_Settings "BaseRecoverySec" $v
   $v = %ShotsLeft
   SlistSetValue /s_Settings "MaxShots" $v
   SListSave /s_Settings $FSettings %r
EndSub

Sub SetGameLength
   %GameLength = %Value
   Max %GameLength %GameLength 2
   # change to seconds
   Mul %GameSec %GameLength 60
   Sbt %WarnSec %GameSec 60
   Gosub SaveSettings
   Concat $a "GameLength set to " %GameLength " minutes"
   Whisper &Source $a
EndSub

Sub SetMaxShots
   %ShotsLeft = %Value
   Max %ShotsLeft %ShotsLeft 10
   Gosub SaveSettings
   Concat $a "MaxShots set to " %ShotsLeft " for new team members and for energizers"
   Whisper &Source $a
EndSub

Sub LoadAvatar
   SListLoad /s_Avatar $AvatarFile %r
   IfInt %r = 0 Goto LoadAvatar1
   $RedAv = "First one on list"
   %RedAv = 0
   $GreenAv = "Second one on list"
   %GreenAv = 1
Label LoadAvatar1
   SListGetField /s_Avatar "Red" 1 %RedAv
   SListGetField /s_Avatar "Red" 2 $RedAv
   SListGetField /s_Avatar "Green" 1 %GreenAv
   SListGetField /s_Avatar "Green" 2 $GreenAv
   IntAdd %r %RedAv 1
   Concat $a "Red avatar is # " %r " on the list: " $RedAv
   Say $a
   IntAdd %r %GreenAv 1
   Concat $a "Green avatar is # " %r " on the list: " $GreenAv
   Say $a
EndSub

Sub ScanField
   ClearLists
   Concat $a "Scanning at " @Field ", please wait until I finish..."
   Say $a
   %IsQuerying = 1
   OnQueryCompleteEvent EndScan
   QueryAt @Field
EndSub

Event EndScan
   %IsQuerying = 2
   Say Finished scanning
EndEvent

Event Reconnect
   IfInt %IsQuerying > 0 Gosub ScanField
EndEvent

Sub AddError
   Concat $Error $Error $Err
   Inc %Error
EndSub

Sub FindNWTSEB
# searches for NWTop ans SEBottom markers
   Concat $Err "North-West-Top marker not found, please include in Action field: 'create " $NWTop "'. "
   FilterClear
   ResClear
   FilterAction $NWTop
   ResFromSurveyFilter
   IfGetResObjectItem ~NWTSEB 1 @NWTop = ~NWTSEB
   Else Gosub AddError
   
   Concat $Err "Sout-East-Bottom marker not found, please include in Action field: 'create " $SEBottom "'. "
   FilterClear
   ResClear
   FilterAction $SEBottom
   ResFromSurveyFilter
   IfGetResObjectItem ~NWTSEB 1 @SEBottom = ~NWTSEB
   Else Gosub AddError

EndSub

Sub BotPosition
   LocMidPoint @Seat @NWTop @SEBottom
   GetAltitude @Seat @NWTop
   WarpLocal @Seat
EndSub

Sub FindBases
# searches for bases
   Concat $Err $Green " base not found, please include in Action field: 'create " $GreenBase "'. "
   FilterClear
   ResClear
   FilterAction $GreenBase
   ResFromSurveyFilter
   IfGetResObjectItem ~NWTSEB 1 ~GreenBase = ~NWTSEB
   Else Gosub AddError
   
   Concat $Err $Red " base not found, please include in Action field: 'create " $RedBase "'. "
   FilterClear
   ResClear
   FilterAction $RedBase
   ResFromSurveyFilter
   IfGetResObjectItem ~NWTSEB 1 ~RedBase = ~NWTSEB
   Else Gosub AddError
   
EndSub

Sub FindJoin
# searches for registrars
   Concat $Err $Green " registrar not found, please include in Action field: 'create " $GreenJoin "'. "
   FilterClear
   ResClear
   FilterAction $GreenJoin
   ResFromSurveyFilter
   IfGetResObjectItem ~NWTSEB 1 ~GreenJoin = ~NWTSEB
   Else Gosub AddError
   
   Concat $Err $Red " registrar not found, please include in Action field: 'create " $RedJoin "'. "
   FilterClear
   ResClear
   FilterAction $RedJoin
   ResFromSurveyFilter
   IfGetResObjectItem ~NWTSEB 1 ~RedJoin = ~NWTSEB
   Else Gosub AddError
   
   Concat $Err $NoJoin " registrar not found, please include in Action field: 'create " $NoJoin "'. "
   FilterClear
   ResClear
   FilterAction $NoJoin
   ResFromSurveyFilter
   IfGetResObjectItem ~NWTSEB 1 ~NoJoin = ~NWTSEB
   Else Gosub AddError
EndSub

Sub SetJoin
   Suspend
   FilterClear
   ResClear
   FilterAction $RedJoin
   ResFromSurveyFilter
   ResCount %ScoreC
   %ScoreI = 1
   IfInt %ScoreI > %ScoreC Gosub AddError
   Label SetJoin_Red
      IfGetResObjectItem ~NWTSEB %ScoreI Gosub SetRedJoin
      Inc %ScoreI
      IfInt %ScoreI <= %ScoreC Goto SetJoin_Red
   FilterClear
   ResClear
   FilterAction $GreenJoin
   ResFromSurveyFilter
   ResCount %ScoreC
   %ScoreI = 1
   IfInt %ScoreI > %ScoreC Gosub AddError
   Label SetJoin_Green
      IfGetResObjectItem ~NWTSEB %ScoreI Gosub SetGreenJoin
      Inc %ScoreI
      IfInt %ScoreI <= %ScoreC Goto SetJoin_Green
   FilterClear
   ResClear
   FilterAction $NoJoin
   ResFromSurveyFilter
   ResCount %ScoreC
   %ScoreI = 1
   IfInt %ScoreI > %ScoreC Gosub AddError
   Label SetJoin_No
      IfGetResObjectItem ~NWTSEB %ScoreI Gosub SetNoJoin
      Inc %ScoreI
      IfInt %ScoreI <= %ScoreC Goto SetJoin_No
   Do
EndSub

Sub SetRedJoin
   ~n = ~NWTSEB
   GetDescription ~n $JoinRedDes
   ObjectChange ~NWTSEB ~n
EndSub

Sub SetGreenJoin
   ~n = ~NWTSEB
   GetDescription ~n $JoinGreenDes
   ObjectChange ~NWTSEB ~n
EndSub

Sub SetNoJoin
   ~n = ~NWTSEB
   GetDescription ~n $NoJoinDes
   ObjectChange ~NWTSEB ~n
EndSub

Sub ClearJoin
   Suspend
   FilterClear
   ResClear
   FilterAction $RedJoin
   ResFromSurveyFilter
   ResCount %ScoreC
   %ScoreI = 1
   IfInt %ScoreI > %ScoreC Gosub AddError
   Label ClearJoin_Red
      IfGetResObjectItem ~NWTSEB %ScoreI Gosub ClearDescription
      Inc %ScoreI
      IfInt %ScoreI <= %ScoreC Goto ClearJoin_Red
   FilterClear
   ResClear
   FilterAction $GreenJoin
   ResFromSurveyFilter
   ResCount %ScoreC
   %ScoreI = 1
   IfInt %ScoreI > %ScoreC Gosub AddError
   Label ClearJoin_Green
      IfGetResObjectItem ~NWTSEB %ScoreI Gosub ClearDescription
      Inc %ScoreI
      IfInt %ScoreI <= %ScoreC Goto ClearJoin_Green
   FilterClear
   ResClear
   FilterAction $NoJoin
   ResFromSurveyFilter
   ResCount %ScoreC
   %ScoreI = 1
   IfInt %ScoreI > %ScoreC Gosub AddError
   Label ClearJoin_No
      IfGetResObjectItem ~NWTSEB %ScoreI Gosub ClearDescription
      Inc %ScoreI
      IfInt %ScoreI <= %ScoreC Goto ClearJoin_No
   Do
EndSub

Sub ClearDescription
   ~n = ~NWTSEB
   GetDescription ~n ""
   ObjectChange ~NWTSEB ~n
EndSub

Sub FindEnergizers
# searches for energizers

   Concat $Err $Green " energizer not found, please include in Action field: 'create " $GreenEnergizer "'. "
   FilterClear
   ResClear
   FilterAction $GreenEnergizer
   ResFromSurveyFilter
   IfGetResObjectItem ~NWTSEB 1 ~GreenEnergizer = ~NWTSEB
   Else Gosub AddError
   
   Concat $Err $Red " energizer not found, please include in Action field: 'create " $RedEnergizer "'. "
   FilterClear
   ResClear
   FilterAction $RedEnergizer
   ResFromSurveyFilter
   IfGetResObjectItem ~NWTSEB 1 ~RedEnergizer = ~NWTSEB
   Else Gosub AddError
   
EndSub

Sub SetScores
   Suspend
   Concat $Err $Red " score board(s) not found, please include in Action field: 'create " $RedBoard "'. "
   FilterClear
   ResClear
   FilterAction $RedBoard
   ResFromSurveyFilter
   ResCount %ScoreC
   %ScoreI = 1
   IfInt %ScoreI > %ScoreC Gosub AddError
   Label SetScores_Red
      IfGetResObjectItem ~NWTSEB %ScoreI Gosub SetScoreRed
      Inc %ScoreI
      IfInt %ScoreI <= %ScoreC Goto SetScores_Red

   Concat $Err $Green " score board(s) not found, please include in Action field: 'create " $GreenBoard "'. "
   FilterClear
   ResClear
   FilterAction $GreenBoard
   ResFromSurveyFilter
   ResCount %ScoreC
   %ScoreI = 1
   IfInt %ScoreI > %ScoreC Gosub AddError
   Label SetScores_Green
      IfGetResObjectItem ~NWTSEB %ScoreI Gosub SetScoreGreen
      Inc %ScoreI
      IfInt %ScoreI <= %ScoreC Goto SetScores_Green
   Do
EndSub

Sub SetScoreRed
   SListAddField /s_REDS 8 %ScoreRed
   Concat $Score %ScoreRed
   ~n = ~NWTSEB
   GetDescription ~n $Score
   ObjectChange ~NWTSEB ~n
EndSub

Sub SetScoreGreen
   SListAddField /s_GREENS 8 %ScoreGreen
   Concat $Score %ScoreGreen
   ~n = ~NWTSEB
   GetDescription ~n $Score
   ObjectChange ~NWTSEB ~n
EndSub

#-
Sub SetNames
   Suspend
   Concat $Err $Red " names board(s) not found, please include in Action field: 'create " $RedNames "'. "
   SListGetNames /s_REDS $RedMembers
   FilterClear
   ResClear
   FilterAction $RedNames
   ResFromSurveyFilter
   ResCount %ScoreC
   %ScoreI = 1
   IfInt %ScoreI > %ScoreC Gosub AddError
   Label SetNames_Red
      IfGetResObjectItem ~NWTSEB %ScoreI Gosub SetNamesRed
      Inc %ScoreI
      IfInt %ScoreI <= %ScoreC Goto SetNames_Red

   Concat $Err $Green " names board(s) not found, please include in Action field: 'create " $GreenNames "'. "
   SListGetNames /s_GREENS $GreenMembers
   FilterClear
   ResClear
   FilterAction $GreenNames
   ResFromSurveyFilter
   ResCount %ScoreC
   %ScoreI = 1
   IfInt %ScoreI > %ScoreC Gosub AddError
   Label SetNames_Green
      IfGetResObjectItem ~NWTSEB %ScoreI Gosub SetNamesGreen
      Inc %ScoreI
      IfInt %ScoreI <= %ScoreC Goto SetNames_Green
   Do
EndSub

Sub SetNamesRed
   ~n = ~NWTSEB
   GetDescription ~n $RedMembers
   ObjectChange ~NWTSEB ~n
EndSub

Sub SetNamesGreen
   ~n = ~NWTSEB
   GetDescription ~n $GreenMembers
   ObjectChange ~NWTSEB ~n
EndSub

Sub SetLaserNotice
   Concat $Err "Notice board not found, please include in Action field: 'create " $LaserNotice "'. "
   FilterClear
   FilterAction $LaserNotice
   ResClear
   ResFromSurveyFilter
   ResCount %c
   %d = 1
   IfInt %c < 1 Gosub AddError
   IfGetResObjectItem ~NWTSEB %d #
   Else EndSub
   ~n = ~NWTSEB
   GetDescription ~n $LaserNoticeDes
   ObjectChange ~NWTSEB ~n
EndSub


# ======================
#     REGISTER TEAMS
# ======================

Sub InitialiseRegister
   %Stage = 1
   OnChatEvent
   OnObjectClickEvent
   OnAvatarClickEvent
   SlistSetText /s_Menu MenuRegister
   SlistSetText /s_MenuAll MenuAllRegister
   SListLoad /s_REDS $FReds %r
   SListLoad /s_GREENS $FGreens %r
   SListClear /s_REDS
   SListClear /s_GREENS
   SListSave /s_REDS $FReds %r
   SListSave /s_GREENS $FGreens %r
   Gosub CheckRegisters
   Gosub SetScores
   Gosub SetJoin
   OnChatEvent ChatRegister
   OnObjectClickEvent ObjectClickRegister
   $b = %RegMinimum
   $c = %RegMaximum
   Concat $a "Registering teams... You have from " $b " to " $c " minutes to register, "
   Concat $a $a "you may start playing after " $b " minutes"
   Say $a
EndSub

Event ChatRegister
   %o = 0
   GetChatPerson &Source
   GetName $Source &Source
   GetAvatar %SourceAv &Source
   GetChatline $Chatline
   Trim $Chatline $Chatline
   Split $a $b $Chatline " "
   IfString $a = $BotName %o = 1
   Else IfChatIsWhisper %o = 2
   IfInt %o = 0 EndEvent
   Else IfInt %o = 2 $b = $Chatline
   SplitFromEnd $d $Value $b " "
   Trim $d $d
   %Value = $Value
   IfPerson &Source IsNotBoss Goto ChatRegisterAll

   IfSListGetValue /s_Menu $b $c Do $c
   Else IfSListGetValue /s_Menu $d $c Do $c
   Else Whisper &Source Unknown command
EndEvent
Label ChatRegisterAll
   IfSListGetValue /s_MenuAll $b $c Do $c
   Else Whisper &Source Unknown player-command
EndEvent

Event ObjectClickRegister
   OnObjectClickEvent
   GetSourcePerson &Source
   GetAvatar %SourceAv &Source
   GetName $Source &Source
   IfPerson &Source IsBot Goto OCREnd
   GetTargetObject ~j
   GetAction $z ~j
   IfString $RedJoin IsIn $z Gosub RegisterRed
   Else  IfString $GreenJoin IsIn $z Gosub RegisterGreen
   Else  IfString $NoJoin IsIn $z Gosub RegisterOut
Label OCREnd
   OnObjectClickEvent ObjectClickRegister
EndEvent

Event ObjectClickRegister2
   OnObjectClickEvent
   GetSourcePerson &Source
   GetAvatar %SourceAv &Source
   GetName $Source &Source
   IfPerson &Source IsBot Goto OCR2End
   GetTargetObject ~j
   GetAction $z ~j
   IfString $RedJoin IsIn $z Gosub RegisterRed
   Else  IfString $GreenJoin IsIn $z Gosub RegisterGreen
   Else  IfString $NoJoin IsIn $z Gosub RegisterOut
   Else  IfString $LaserNotice IsIn $z Gosub CheckPlayers
Label OCR2End
   OnObjectClickEvent ObjectClickRegister2
EndEvent

Sub ClearTeams
   SListClear /s_REDS
   SListClear /s_GREENS
   SListSave /s_REDS $FReds %r
   SListSave /s_GREENS $FGreens %r
   Gosub CheckRegisters
   Say Teams cleared
EndSub

Sub LoadTeams
   SListLoad /s_REDS $FReds %r
   SListSave /s_REDS $FReds %r
   SListLoad /s_GREENS $FGreens %r
   SListSave /s_GREENS $FGreens %r
   Gosub CheckRegisters
   Say Teams loaded
EndSub

Sub SaveTeams
   SListSave /s_REDS $FReds %r
   SListSave /s_GREENS $FGreens %r
   Say Teams saved
EndSub

Sub RegisterRed
   IfSlistGetValue /s_GREENS $Source $d SListDeleteName /s_GREENS $Source
   # youhit, hityou, hitbase, missed
   Concat $b %ShotsLeft ",0,0,0,0,0,0,0,0"
   SListSetValue /s_REDS $Source $b
   SListSave /s_REDS $FReds %r
   SListSave /s_GREENS $FGreens %r
   Gosub SetNames
   Concat $a $Source ", you are now in " $RedTitle
   IfInt %SourceAv = %RedAv Goto RegisterRedWhisper
   Concat $a $a ", you must wear avatar " $RedAv
Label RegisterRedWhisper
   Gosub GetRedSource
   Gosub MakeSScoreCard
   Concat $a $a " - " $SScoreCard
   Whisper &Source $a
EndSub

Sub RegisterGreen
   IfSlistGetValue /s_REDS $Source $d SListDeleteName /s_REDS $Source
   # youhit, hityou, hitbase, missed
   Concat $b %ShotsLeft ",0,0,0,0,0,0,0,0"
   SListSetValue /s_GREENS $Source $b
   SListSave /s_REDS $FReds %r
   SListSave /s_GREENS $FGreens %r
   Gosub SetNames
   Concat $a $Source ", you are now in " $GreenTitle
   IfInt %SourceAv = %GreenAv Goto RegisterGreenWhisper
   Concat $a $a ", you must wear avatar " $GreenAv
Label RegisterGreenWhisper
   Gosub GetGreenSource
   Gosub MakeSScoreCard
   Concat $a $a " - " $SScoreCard
   Whisper &Source $a
EndSub

Sub RegisterOut
   IfSlistGetValue /s_REDS $Source $d SListDeleteName /s_REDS $Source
   IfSlistGetValue /s_GREENS $Source $d SListDeleteName /s_GREENS $Source
   SListSave /s_REDS $FReds %r
   SListSave /s_GREENS $FGreens %r
   Gosub SetNames
   Concat $a $Source ", you are free to go"
   Whisper &Source $a
EndSub

Sub CheckRegisters
   Suspend
   Concat $Err $Red " team board(s) not found, please include in Action field: 'create " $RedNames "'. "
   SListGetNames /s_REDS $RedMembers
   FilterClear
   ResClear
   FilterAction $RedNames
   ResFromSurveyFilter
   ResCount %ScoreC
   %ScoreI = 1
   IfInt %ScoreI > %ScoreC Gosub AddError
   Label CheckRegisters_Red
      IfGetResObjectItem ~NWTSEB %ScoreI Gosub CheckNamesRed
      Inc %ScoreI
      IfInt %ScoreI <= %ScoreC Goto CheckRegisters_Red
   Concat $Err $Green " team board(s) not found, please include in Action field: 'create " $GreenNames "'. "
   SListGetNames /s_GREENS $GreenMembers
   FilterClear
   ResClear
   FilterAction $GreenNames
   ResFromSurveyFilter
   ResCount %ScoreC
   %ScoreI = 1
   IfInt %ScoreI > %ScoreC Gosub AddError
   Label CheckRegisters_Green
      IfGetResObjectItem ~NWTSEB %ScoreI Gosub CheckNamesGreen
      Inc %ScoreI
      IfInt %ScoreI <= %ScoreC Goto CheckRegisters_Green
   GetDateTime !t
   Do
EndSub

Sub CheckNamesRed
   ~n = ~NWTSEB
   GetDescription $n ~NWTSEB
   IfString $RedMembers = $n EndSub
   GetDescription ~n $RedMembers
   ObjectChange ~NWTSEB ~n
EndSub

Sub CheckNamesGreen
   ~n = ~NWTSEB
   GetDescription $n ~NWTSEB
   IfString $GreenMembers = $n EndSub
   GetDescription ~n $GreenMembers
   ObjectChange ~NWTSEB ~n
EndSub

Sub CheckPlayers
   SListGetCount /s_REDS %r
   SListGetCount /s_GREENS %g
   IfInt %r > 0 IfInt %g > 0 ResetTo InitPlay
   Else Say Not enough players to play: each team must have at least one player.
EndSub

Sub Reset
   SListSave /s_REDS $FReds %r
   SListSave /s_GREENS $FGreens %r
   Run
EndSub

Text MenuRegister
menu=Whisper &Source Say my name followed by: avatars, scorecard, clear teams, load teams, save teams, Reds, Greens, I withdraw, register, play, reset
avatars=Gosub LoadAvatar
clear teams=Gosub ClearTeams
load teams=Gosub LoadTeams
save teams=Gosub SaveTeams
register me Red=Gosub RegisterRed
put me in Reds=Gosub RegisterRed
and me in Reds=Gosub RegisterRed
me in Reds=Gosub RegisterRed
in Reds=Gosub RegisterRed
Reds=Gosub RegisterRed
register me Green=Gosub RegisterGreen
put me in Greens=Gosub RegisterGreen
and me in Greens=Gosub RegisterGreen
me in Greens=Gosub RegisterGreen
in Greens=Gosub RegisterGreen
Greens=Gosub RegisterGreen
I withdraw=Gosub RegisterOut
play=Gosub CheckPlayers
register=ResetTo InitRegister
scorecard=Gosub WhisperScoreCard
reset=Gosub Reset
EndText

Text MenuAllRegister
menu=Whisper &Source Say my name followed by: avatars, scorecard, Reds, Greens, I withdraw
avatars=Gosub LoadAvatar
put me in Reds=Gosub RegisterRed
and me in Reds=Gosub RegisterRed
me in Reds=Gosub RegisterRed
in Reds=Gosub RegisterRed
Reds=Gosub RegisterRed
put me in Greens=Gosub RegisterGreen
and me in Greens=Gosub RegisterGreen
me in Greens=Gosub RegisterGreen
in Greens=Gosub RegisterGreen
Greens=Gosub RegisterGreen
I withdraw=Gosub RegisterOut
scorecard=Gosub WhisperScoreCard
EndText

# ======================
#     PLAY
# ======================

Sub InitialisePlay
   %Stage = 2
   OnChatEvent
   OnObjectClickEvent
   OnAvatarClickEvent
   Gosub ClearJoin
   $LaserNoticeDes = "Playing"
   Gosub SetLaserNotice
   %LastMinuteWarn = 1
   SlistSetText /s_Menu MenuPlay
   SlistSetText /s_MenuAll MenuAllPlay
   OnChatEvent ChatPlay
   OnObjectClickEvent ObjectClickPlay
   OnAvatarClickEvent AvatarClickPLay
   SListLoad /s_REDS $FReds %r
   SListSave /s_REDS $FReds %r
   SListLoad /s_GREENS $FGreens %r
   SListSave /s_GREENS $FGreens %r
   TListClear /t_Recovering
   TListClear /t_BaseHit
   #Gosub CheckRegisters
   Concat $a "This game lasts " %GameLength " minutes. ****** GAME STARTS NOW ******" 
   Say $a
EndSub

Sub TerminatePlay
   OnChatEvent
   OnObjectClickEvent
   OnAvatarClickEvent
   Concat $a "****** GAME OVER ****** You have " %BreakLength " minutes to collect your score cards. "
   Concat $a $a "To do so, whisper to me: scorecard"
   Say $a
   SListSave /s_REDS $FReds %r
   SListSave /s_GREENS $FGreens %r
   ResetTo InitBreak
EndSub

Event ChatPlay
   %o = 0
   GetChatPerson &Source
   GetName $Source &Source
   GetChatline $Chatline
   Trim $Chatline $Chatline
   Split $a $b $Chatline " "
   IfString $a = $BotName %o = 1
   Else IfChatIsWhisper %o = 2
   IfInt %o = 0 EndEvent
   Else IfInt %o = 2 $b = $Chatline
   SplitFromEnd $d $Value $b " "
   Trim $d $d
   %Value = $Value
   IfPerson &Source IsNotBoss Goto ChatPlayAll

   IfSListGetValue /s_Menu $b $c Do $c
   Else IfSListGetValue /s_Menu $d $c Do $c
   Else Whisper &Source Unknown command
EndEvent
Label ChatPlayAll
   IfSListGetValue /s_MenuAll $b $c Do $c
   Else Whisper &Source Unknown player-command
EndEvent

Sub WarnLastMinute
   IfInt %LastMinuteWarn = 0 EndSub
   Say ****** LAST MINUTE ******
   %LastMinuteWarn = 0
   Gosub SetScores
EndSub

Sub CheckScores
   GetDifSecond %z !u
   IfInt %z < 20 EndSub
   GetDateTime !u
   Gosub SetScores
EndSub

Text MenuPlay
menu=Whisper &Source Say my name followed by: avatars, scorecard, pause, reset
avatars=Gosub LoadAvatar
scorecard=Gosub WhisperScoreCard
pause=Gosub TerminatePlay
reset=Gosub Reset
EndText

Text MenuAllPlay
menu=Whisper &Source Say my name followed by: avatars, scorecard
avatars=Gosub LoadAvatar
scorecard=Gosub WhisperScoreCard
EndText

Event AvatarClickPlay
   IfTargetDefined GetSourceTarget &Source &Target
   Else EndEvent
   IfLoc &Source IsInCube @NWTop @SEBottom
   Else EndEvent
   IfLoc &Target IsInCube @NWTop @SEBottom %TargetIsInField = 1
   Else %TargetIsInField = 0
   GetName $Source &Source
   GetAvatar %SourceAv &Source
   GetName $Target &Target   
   GetAvatar %TargetAv &Target
   IfSlistGetValue /s_REDS $Source $d Gosub AvatarSourceRed
   Else IfSlistGetValue /s_GREENS $Source $d Gosub AvatarSourceGreen 
EndEvent

Sub IsInField
   IfLoc @WhereIs IsInCube @NWTop @SEBottom %IsInField = 1
   Else %IsInField = 0
EndSub


# -------
# avatars
# -------

Sub AvatarSourceRed
   # check avatar of source
   IfInt %SourceAv <> %RedAv Goto AvatarSourceRedWrong
   IfSlistGetValue /s_REDS $Target $d Gosub RedShotRed
   Else IfSlistGetValue /s_GREENS $Target $d Gosub RedShotGreen
EndSub
Label AvatarSourceRedWrong
   Gosub SayWrongAvRed
   Gosub RedShotWasted
EndSub

Sub AvatarSourceGreen
   # check avatar of source
   IfInt %SourceAv <> %GreenAv Goto AvatarSourceGreenWrong
   IfSlistGetValue /s_GREENS $Target $d Gosub GreenShotGreen
   Else IfSlistGetValue /s_REDS $Target $d Gosub GreenShotRed
EndSub
Label AvatarSourceGreenWrong
   Gosub SayWrongAvGreen
   Gosub GreenShotWasted
EndSub

Sub SayWrongAvRed
   Concat $a "You are not wearing your " $Red " uniform, " $Source
   Concat $a $a ", your shots do not count but you may be shot down. "
   Concat $a $a "You must wear: " $RedAv
   Whisper &Source $a
EndSub

Sub SayWrongAvGreen
   Concat $a "You are not wearing your " $Green " uniform, " $Source
   Concat $a $a ", your shots do not count but you may be shot down. "
   Concat $a $a "You must wear: " $GreenAv
   Whisper &Source $a
EndSub

# -------
# objects
# -------
Event ObjectClickPlay
   IfTargetDefined GetSourceTarget &Source ~Target
   Else EndEvent
   IfLoc &Source IsInCube @NWTop @SEBottom
   Else EndEvent
   IfLoc ~Target IsInCube @NWTop @SEBottom %TargetIsInField = 1
   Else %TargetIsInField = 0
   GetName $Source &Source
   GetAvatar %SourceAv &Source
   GetAction $Target ~Target   
   IfSlistGetValue /s_REDS $Source $d Gosub ObjectSourceRed
   Else IfSlistGetValue /s_GREENS $Source $d Gosub ObjectSourceGreen 
EndEvent

Sub ObjectSourceRed
   # check avatar of source
   IfInt %SourceAv <> %RedAv Goto ObjectSourceRedWrong
   IfString $RedBase IsIn $Target Gosub RedShotRedBase
   Else IfString $GreenBase IsIn $Target Gosub RedShotGreenBase
   Else IfString $RedEnergizer IsIn $Target Gosub RedEnergize
   Else Gosub RedShotWasted
EndSub
Label ObjectSourceRedWrong
   Gosub SayWrongAvRed
   Gosub RedShotWasted
EndSub

Sub ObjectSourceGreen
   # check avatar of source
   IfInt %SourceAv <> %GreenAv Goto ObjectSourceGreenWrong
   IfString $RedBase IsIn $Target Gosub GreenShotRedBase
   Else IfString $GreenBase IsIn $Target Gosub GreenShotGreenBase
   Else IfString $GreenEnergizer IsIn $Target Gosub GreenEnergize
   Else Gosub GreenShotWasted
EndSub
Label ObjectSourceGreenWrong
   Gosub SayWrongAvGreen
   Gosub GreenShotWasted
EndSub

# ======================
#     BREAK
# ======================

Sub InitialiseBreak
   %Stage = 3
   OnChatEvent
   OnObjectClickEvent
   OnAvatarClickEvent
   SlistSetText /s_Menu MenuBreak
   SlistSetText /s_MenuAll MenuAllBreak
   OnChatEvent ChatBreak
   Gosub SetScores
EndSub

Event ChatBreak
   %o = 0
   GetChatPerson &Source
   GetName $Source &Source
   GetChatline $Chatline
   Trim $Chatline $Chatline
   Split $a $b $Chatline " "
   IfString $a = $BotName %o = 1
   Else IfChatIsWhisper %o = 2
   IfInt %o = 0 EndEvent
   Else IfInt %o = 2 $b = $Chatline
   SplitFromEnd $d $Value $b " "
   Trim $d $d
   %Value = $Value
   IfPerson &Source IsNotBoss Goto ChatBreakAll

   IfSListGetValue /s_Menu $b $c Do $c
   Else IfSListGetValue /s_Menu $d $c Do $c
   Else Whisper &Source Unknown command
EndEvent
Label ChatBreakAll
   IfSListGetValue /s_MenuAll $b $c Do $c
   Else Whisper &Source Unknown player-command
EndEvent

Event ObjectClickBreak2
   OnObjectClickEvent
   GetSourcePerson &Source
   GetAvatar %SourceAv &Source
   GetName $Source &Source
   IfPerson &Source IsBot Goto OCB2End
   GetTargetObject ~j
   GetAction $z ~j
   IfString $LaserNotice IsIn $z ResetTo InitRegister
Label OCB2End
   OnObjectClickEvent ObjectClickBreak2
EndEvent

Text MenuBreak
menu=Whisper &Source Say my name followed by: avatars, scorecard, register, play, reset, set gamelength <#minutes>, set maxshots <#shots>
avatars=Gosub LoadAvatar
register=ResetTo InitRegister
play=Gosub CheckPlayers
scorecard=Gosub WhisperScoreCard
set gamelength=Gosub SetGameLength
set maxshots=Gosub SetMaxShots
reset=Gosub Reset
EndText

Text MenuAllBreak
menu=Whisper &Source Say my name followed by: :), scorecard
:)=Whisper &Source :)~
scorecard=Gosub WhisperScoreCard
EndText


# ======================
#        SCORES
# ======================

Sub GetRedSource
   SListGetFields /s_REDS $Source 8 %SShotsLeft %SShots %SHitAv %SWasHit %SHitBase %SHitOwnAv %SHitOwnBase %SScore
EndSub

Sub GetGreenSource
   SListGetFields /s_GREENS $Source 8 %SShotsLeft %SShots %SHitAv %SWasHit %SHitBase %SHitOwnAv %SHitOwnBase %SScore
EndSub

Sub SetRedSource
   IntMul %x %SHitAv %HitAv
   %SScore = %x
   IntMul %x %SHitBase %HitBase
   IntAdd %SScore %SScore %x
   IntMul %x %SHitOwnAv %HitOwnAv
   IntAdd %SScore %SScore %x
   IntMul %x %SHitOwnBase %HitOwnBase
   IntAdd %SScore %SScore %x
   SListSetFields /s_REDS $Source 8 %SShotsLeft %SShots %SHitAv %SWasHit %SHitBase %SHitOwnAv %SHitOwnBase %SScore
   SListAddField /s_REDS 8 %ScoreRed
EndSub

Sub SetGreenSource
   IntMul %x %SHitAv %HitAv
   %SScore = %x
   IntMul %x %SHitBase %HitBase
   IntAdd %SScore %SScore %x
   IntMul %x %SHitOwnAv %HitOwnAv
   IntAdd %SScore %SScore %x
   IntMul %x %SHitOwnBase %HitOwnBase
   IntAdd %SScore %SScore %x
   SListSetFields /s_GREENS $Source 8 %SShotsLeft %SShots %SHitAv %SWasHit %SHitBase %SHitOwnAv %SHitOwnBase %SScore
   SListAddField /s_GREENS 8 %ScoreGreen
EndSub

Sub MakeSScoreCard
   %acc = 0
   IfInt %SShots = 0 Goto MakeSScoreCard1
   Add %acc %SHitAv %SHitBase
   Add %acc %acc %SHitOwnAv
   Add %acc %acc %SHitOwnBase
   Mul %acc %acc 100
   Div %acc %acc %SShots
Label MakeSScoreCard1
   StringFromReal $acc %acc 1
   Concat $SScoreCard $RedTitle ": " %ScoreRed ", " $GreenTitle ": " %ScoreGreen
   Concat $SScoreCard $SScoreCard ". Personal score: " %SSCore ", shots " %SShots ", hits " %SHitAv ", base-hits " %SHitBase
   Concat $SScoreCard $SScoreCard ", own-team-hits " %SHitOwnAv ", own-base-hits " %SHitOwnBase ", accuracy " $acc "%. Shots left: " %SShotsLeft
EndSub

#--

Sub GetRedTarget
   SListGetFields /s_REDS $Target 8 %TShotsLeft %TShots %THitAv %TWasHit %THitBase %THitOwnAv %THitOwnBase %TScore
EndSub

Sub GetGreenTarget
   SListGetFields /s_GREENS $Target 8 %TShotsLeft %TShots %THitAv %TWasHit %THitBase %THitOwnAv %THitOwnBase %TScore
EndSub

Sub SetRedTarget
   IntMul %x %THitAv %HitAv
   %TScore = %x
   IntMul %x %THitBase %HitBase
   IntAdd %TScore %TScore %x
   IntMul %x %THitOwnAv %HitOwnAv
   IntAdd %TScore %TScore %x
   IntMul %x %THitOwnBase %HitOwnBase
   IntAdd %TScore %TScore %x
   SListSetFields /s_REDS $Target 8 %TShotsLeft %TShots %THitAv %TWasHit %THitBase %THitOwnAv %THitOwnBase %TScore
   SListAddField /s_REDS 8 %ScoreRed
EndSub

Sub SetGreenTarget
   IntMul %x %THitAv %HitAv
   %TScore = %x
   IntMul %x %THitBase %HitBase
   IntAdd %TScore %TScore %x
   IntMul %x %THitOwnAv %HitOwnAv
   IntAdd %TScore %TScore %x
   IntMul %x %THitOwnBase %HitOwnBase
   IntAdd %TScore %TScore %x
   SListSetFields /s_GREENS $Target 8 %TShotsLeft %TShots %THitAv %TWasHit %THitBase %THitOwnAv %THitOwnBase %TScore
   SListAddField /s_GREENS 8 %ScoreGreen
EndSub

Sub MakeTScoreCard
   %acc = 0
   IfInt %TShots = 0 Goto MakeTScoreCard1
   Add %acc %THitAv %THitBase
   Add %acc %acc %THitOwnAv
   Add %acc %acc %THitOwnBase
   Mul %acc %acc 100
   Div %acc %acc %TShots
Label MakeTScoreCard1
   StringFromReal $acc %acc 1
   Concat $TScoreCard $RedTitle ": " %ScoreRed ", " $GreenTitle ": " %ScoreGreen
   Concat $TScoreCard $TScoreCard ". Personal score: " %TScore ", shots " %TShots ", hits " %THitAv ", base-hits " %THitBase
   Concat $TScoreCard $TScoreCard ", own-team-hits " %THitOwnAv ", own-base-hits " %THitOwnBase ", accuracy " $acc "%. Shots left: " %TShotsLeft
EndSub

#--

Sub FindScoreCard
   $SScoreCard = ""
   IfSlistGetValue /s_REDS $Source $d Goto FindScoreCardRed
   Else IfSlistGetValue /s_GREENS $Source $d Goto FindScoreCardGreen 
   Else Goto FindScoreCardNone
EndSub
Label FindScoreCardRed
   Concat $Team "You are in " $RedTitle " - "
   Gosub GetRedSource
   Gosub MakeSScoreCard
   Concat $Team $Team $SScoreCard
EndSub
Label FindScoreCardGreen
   Concat $Team "You are in " $GreenTitle " - "
   Gosub GetGreenSource
   Gosub MakeSScoreCard
   Concat $Team $Team $SScoreCard
EndSub
Label FindScoreCardNone
   Concat $Team "You are not registered - "
   SListAddField /s_REDS 8 %ScoreRed
   SListAddField /s_GREENS 8 %ScoreGreen
   Concat $Team $RedTitle " " %ScoreRed ", " $GreenTitle " " %ScoreGreen
EndSub

Sub WhisperScoreCard
   Gosub FindScoreCard
   Whisper &Source $Team
EndSub

#--

Sub RedShotGreen
   # first check if allowed to shoot 
   TItemGetTimeout /t_Recovering $Source %t
   IfInt %t <> 0 Goto RedShotGreenNot
   TItemGetTimeout /t_Recovering $Target %t
   IfInt %t <> 0 Goto RedShotGreenNot

   Gosub GetRedSource
   IfInt %SShotsLeft < 1 Goto RedShotGreenNoShots

   inc %SShots
   dec %SShotsLeft
   inc %SHitAv
   Gosub SetRedSource
   Gosub MakeSScoreCard
   Concat $a $Source ", you hit " $Green " " $Target " for " %HitAv " - " $SScoreCard
   Whisper &Source $a

   TItemSetTimeOut /t_Recovering $Target %RecoveryTime
   Gosub GetGreenTarget
   Inc %TWasHit
   Gosub SetGreenTarget
   Concat $a $Target ", you were hit by " $Red " " $Source ", " %RecoveryTime " seconds recovery. Total times hit: " %TWasHit
   Whisper &Target $a
EndSub
Label RedShotGreenNot
   Gosub RedShotWasted
EndSub
Label RedShotGreenNoShots
   Gosub RedShotNoShots
EndSub

Sub RedShotRed
   # first check if allowed to shoot 
   TItemGetTimeout /t_Recovering $Source %t
   IfInt %t <> 0 Goto RedShotRedNot
   TItemGetTimeout /t_Recovering $Target %t
   IfInt %t <> 0 Goto RedShotRedNot

   Gosub GetRedSource
   IfInt %SShotsLeft < 1 Goto RedShotRedNoShots

   inc %SShots
   dec %SShotsLeft
   inc %SHitOwnAv
   Gosub SetRedSource
   Gosub MakeSScoreCard
   Concat $a $Source ", you hit your own warrior " $Target " for " %HitOwnAv  " - " $SScoreCard
   Whisper &Source $a

   TItemSetTimeOut /t_Recovering $Target %RecoveryTime
   Gosub GetRedTarget
   Inc %TWasHit
   Gosub SetRedTarget
   Concat $a $Target ", you were hit by team-mate " $Source ", " %RecoveryTime " seconds recovery. Total times hit: " %TWasHit
   Whisper &Target $a
EndSub
Label RedShotRedNot
   Gosub RedShotWasted
EndSub
Label RedShotRedNoShots
   Gosub RedShotNoShots
EndSub

Sub RedShotGreenBase
   TItemGetTimeout /t_Recovering $Source %t
   IfInt %t <> 0 Goto RedShotGreenBaseNot
   TItemGetTimeout /t_BaseHit $GreenTitle %t
   IfInt %t <> 0 Goto RedShotGreenBaseNot

   Gosub GetRedSource
   IfInt %SShotsLeft < 1 Goto RedShotGreenBaseNoShots

   inc %SShots
   dec %SShotsLeft
   inc %SHitBase
   Gosub SetRedSource
   Gosub MakeSScoreCard
   TItemSetTimeOut /t_BaseHit $GreenTitle %BaseHitTime
   Concat $a $Red " " $Source " hit the " $Green " base! " $Green " base is disabled for " %BaseHitTime " seconds"
   Say $a
   Concat $a $Source ", you hit the " $Green " base for " %HitBase " - " $SScoreCard
   Whisper &Source $a
EndSub
Label RedShotGreenBaseNot
   Gosub RedShotWasted
EndSub
Label RedShotGreenBaseNoShots
   Gosub RedShotNoShots
EndSub

Sub RedShotRedBase
   TItemGetTimeout /t_Recovering $Source %t
   IfInt %t <> 0 Goto RedShotRedBaseNot
   TItemGetTimeout /t_BaseHit $RedTitle %t
   IfInt %t <> 0 Goto RedShotRedBaseNot
   IfInt %HitOwnBase = 0 Goto RedShotRedBaseNot

   Gosub GetRedSource
   IfInt %SShotsLeft < 1 Goto RedShotRedBaseNoShots

   inc %SShots
   dec %SShotsLeft
   inc %SHitOwnBase
   Gosub SetRedSource
   Gosub MakeSScoreCard
   TItemSetTimeOut /t_BaseHit $RedTitle %BaseHitTime
   Concat $a $Red " " $Source " hit the home base! " $Red " base is disabled for " %BaseHitTime " seconds"
   Say $a
   Concat $a $Source ", you hit your home base for " %HitOwnBase " - " $SScoreCard
   Whisper &Source $a
EndSub
Label RedShotRedBaseNot
   Gosub RedShotWasted
EndSub
Label RedShotRedBaseNoShots
   Gosub RedShotNoShots
EndSub

Sub RedShotWasted
   Gosub GetRedSource
   IfInt %SShotsLeft < 1 Goto RedShotWastedNoShots

   inc %SShots
   dec %SShotsLeft
   Gosub SetRedSource
   #Gosub MakeSScoreCard
   Concat $a "Wasted shot - Shots left: " %SShotsLeft
   Whisper &Source $a
EndSub
Label RedShotWastedNoShots
   Gosub RedShotNoShots
EndSub

Sub RedShotNoShots
   Gosub MakeSScoreCard
   Concat $a $Source ", you have no shots left, re-energize!"
   Whisper &Source $a
EndSub

Sub GreenShotRed
   # first check if allowed to shoot 
   TItemGetTimeout /t_Recovering $Source %t
   IfInt %t <> 0 Goto GreenShotRedNot
   TItemGetTimeout /t_Recovering $Target %t
   IfInt %t <> 0 Goto GreenShotRedNot

   Gosub GetGreenSource
   IfInt %SShotsLeft < 1 Goto GreenShotRedNoShots

   inc %SShots
   dec %SShotsLeft
   inc %SHitAv
   Gosub SetGreenSource
   Gosub MakeSScoreCard
   Concat $a $Source ", you hit " $Red " " $Target " for " %HitAv " - " $SScoreCard
   Whisper &Source $a

   TItemSetTimeOut /t_Recovering $Target %RecoveryTime
   Gosub GetRedTarget
   Inc %TWasHit
   Gosub SetRedTarget
   Concat $a $Target ", you were hit by " $Green " " $Source ", " %RecoveryTime " seconds recovery. Total times hit: " %TWasHit
   Whisper &Target $a
EndSub
Label GreenShotRedNot
   Gosub GreenShotWasted
EndSub
Label GreenShotRedNoShots
   Gosub GreenShotNoShots
EndSub

Sub GreenShotGreen
   # first check if allowed to shoot 
   TItemGetTimeout /t_Recovering $Source %t
   IfInt %t <> 0 Goto GreenShotGreenNot
   TItemGetTimeout /t_Recovering $Target %t
   IfInt %t <> 0 Goto GreenShotGreenNot

   Gosub GetGreenSource
   IfInt %SShotsLeft < 1 Goto GreenShotGreenNoShots

   inc %SShots
   dec %SShotsLeft
   inc %SHitOwnAv
   Gosub SetGreenSource
   Gosub MakeSScoreCard
   Concat $a $Source ", you hit your own warrior " $Target " for " %HitOwnAv " - " $SScoreCard
   Whisper &Source $a

   TItemSetTimeOut /t_Recovering $Target %RecoveryTime
   Gosub GetGreenTarget
   Inc %TWasHit
   Gosub SetGreenTarget
   Concat $a $Target ", you were hit by team-mate " $Source ", " %RecoveryTime " seconds recovery. Total times hit: " %TWasHit
   Whisper &Target $a
EndSub
Label GreenShotGreenNot
   Gosub GreenShotWasted
EndSub
Label GreenShotGreenNoShots
   Gosub GreenShotNoShots
EndSub

Sub GreenShotRedBase
   TItemGetTimeout /t_Recovering $Source %t
   IfInt %t <> 0 Goto GreenShotRedBaseNot
   TItemGetTimeout /t_BaseHit $RedTitle %t
   IfInt %t <> 0 Goto GreenShotRedBaseNot

   Gosub GetGreenSource
   IfInt %SShotsLeft < 1 Goto GreenShotRedBaseNoShots

   inc %SShots
   dec %SShotsLeft
   inc %SHitBase
   Gosub SetGreenSource
   Gosub MakeSScoreCard
   TItemSetTimeOut /t_BaseHit $RedTitle %BaseHitTime
   Concat $a $Green " " $Source " hit the " $Red " base! " $Red " base is disabled for " %BaseHitTime " seconds"
   Say $a
   Concat $a $Source ", you hit the " $Red " base for " %HitBase " - " $SScoreCard
   Whisper &Source $a
EndSub
Label GreenShotRedBaseNot
   Gosub GreenShotWasted
EndSub
Label GreenShotRedBaseNoShots
   Gosub GreenShotNoShots
EndSub

Sub GreenShotGreenBase
   TItemGetTimeout /t_Recovering $Source %t
   IfInt %t <> 0 Goto GreenShotGreenBaseNot
   TItemGetTimeout /t_BaseHit $GreenTitle %t
   IfInt %t <> 0 Goto GreenShotGreenBaseNot
   IfInt %HitOwnBase = 0 Goto GreenShotGreenBaseNot

   Gosub GetGreenSource
   IfInt %SShotsLeft < 1 Goto GreenShotGreenBaseNoShots

   inc %SShots
   dec %SShotsLeft
   inc %SHitOwnBase
   Gosub SetGreenSource
   Gosub MakeSScoreCard
   TItemSetTimeOut /t_BaseHit $GreenTitle %BaseHitTime
   Concat $a $Green " " $Source " hit the home base! " $Green " base is disabled for " %BaseHitTime " seconds"
   Say $a
   Concat $a $Source ", you hit your home base for " %HitOwnBase " - " $SScoreCard
   Whisper &Source $a
EndSub
Label GreenShotGreenBaseNot
   Gosub  GreenShotWasted
EndSub
Label GreenShotGreenBaseNoShots
   Gosub GreenShotNoShots
EndSub

Sub GreenShotWasted
   Gosub GetGreenSource
   IfInt %SShotsLeft < 1 Goto GreenShotWastedNoShots

   inc %SShots
   dec %SShotsLeft
   Gosub SetGreenSource
   #Gosub MakeSScoreCard
   Concat $a "Wasted shot - Shots left: " %SShotsLeft
   Whisper &Source $a
EndSub
Label GreenShotWastedNoShots
   Gosub GreenShotNoShots
EndSub

Sub GreenShotNoShots
   Gosub MakeSScoreCard
   Concat $a $Source ", you have no shots left, re-energize!"
   Whisper &Source $a
EndSub

#====================
#    Energizers
#====================

Sub RedEnergize
# &Source ~Target
   Gosub GetRedSource
   @a = ~Target
   LocMove3d @a 0.10 0 -90

   IfLoc &Source IsInVCylinder @a 1.5 1.5 #
   Else Goto RedEnergizeNot

   IfInt %SShotsLeft < %ShotsLeft %SShotsLeft = %ShotsLeft
   Else Goto RedEnergizeTooMuch
   Gosub SetRedSource
   Concat $a "Energized... - Shots left: " %SShotsLeft
   Whisper &Source $a
EndSub
Label RedEnergizeTooMuch
   Concat $a "No need to energize... - Shots left: " %SShotsLeft ", maximum refill: " %ShotsLeft
   Whisper &Source $a
EndSub
Label RedEnergizeNot
   Concat $a "Out of range to energize..."
   IfInt %SShotsLeft >= %ShotsLeft Concat $a $a " and no need to energize... - Shots left: " %SShotsLeft ", maximum refill: " %ShotsLeft
   Else Concat $a $a " - Shots left: " %SShotsLeft ", maximum refill: " %ShotsLeft
   Whisper &Source $a
EndSub

Sub GreenEnergize
# &Source ~Target
   Gosub GetGreenSource
   @a = ~Target
   LocMove3d @a 0.10 0 -90

   IfLoc &Source IsInVCylinder @a 1.5 1.5 #
   Else Goto GreenEnergizeNot

   IfInt %SShotsLeft < %ShotsLeft %SShotsLeft = %ShotsLeft
   Else Goto GreenEnergizeTooMuch
   Gosub SetGreenSource
   Concat $a "Energized... - Shots left: " %SShotsLeft
   Whisper &Source $a
EndSub
Label GreenEnergizeTooMuch
   Concat $a "No need to energize... - Shots left: " %SShotsLeft ", maximum refill: " %ShotsLeft 
   Whisper &Source $a
EndSub
Label GreenEnergizeNot
   Concat $a "Out of range to energize..."
   IfInt %SShotsLeft >= %ShotsLeft Concat $a $a " and no need to energize... - Shots left: " %SShotsLeft ", maximum refill: " %ShotsLeft
   Else Concat $a $a " - Shots left: " %SShotsLeft ", maximum refill: " %ShotsLeft
   Whisper &Source $a
EndSub

Sub ClearConfirmed
  ClearListAS
  ClearListAF
  ClearListDS
  ClearListDF
EndSub




backExamples