TGC Codebase Backup



Kombat! by Baywolfe

25th Nov 2006 22:40
Summary

A short 2 fighter combat example for use in RPG's, etc.



Description

A 2 Fighter combat program. This is a stand-alone program but is intended to be used as an example for larger programs.



Code
                                    ` This code was downloaded from The Game Creators
                                    ` It is reproduced here with full permission
                                    ` http://www.thegamecreators.com
                                    
                                    `Kombat! - Simple Combat Program
`by Michael Talley
`Freely available as OpenSource
`NOTE - THERE IS NO ERROR CHECKING IN THIS CODE!!!!!!!!!!!!!!!!!!!

`Standard Setup Code
SET DISPLAY MODE 640, 480, 32
COLOR BACKDROP RGB(0, 0, 128) : HIDE MOUSE
SET TEXT FONT "Microsoft Sans Serif" : SET TEXT SIZE 14

TYPE KOMBATANT
  Name AS STRING
  HP AS INTEGER
  MaxHP AS INTEGER
  Armor AS INTEGER
  PrimaryWeapon AS INTEGER
  Shield AS INTEGER
ENDTYPE

DIM Fighters(2) AS KOMBATANT
DIM Armor(3) AS STRING
DIM Weapon(3) AS STRING
DIM Shield(3) AS STRING

Initiative = 0

GOSUB GameLoop

END

FUNCTION Header
  CLS
  PRINT "Kombat!"
  PRINT "------------"
  PRINT " "
ENDFUNCTION

FUNCTION Setup
  FighterName AS STRING

  Armor(0) = "Robes"
  Armor(1) = "Leather"
  Armor(2) = "Mail"

  Weapon(0) = "Fist"
  Weapon(1) = "Rusty Knife"
  Weapon(2) = "Sword"

  Shield(0) = "Nothing"
  Shield(1) = "Wooden"
  Shield(2) = "Iron"

  PRINT "Time to set up your fighters."
  PRINT "Press Any Key to Continue..."
  WAIT KEY

  FOR Counter = 0 TO 1
    Header( )
    PRINT "To accept defaults, you may press the Enter key without entering any values."
    PRINT " "
    INPUT "What is the name of fighter #", Counter + 1, "?  ", Fighters(Counter).Name
    IF LEN(Fighters(Counter).Name) = 0
      Fighters(Counter).Name = "Fighter #" + STR$(Counter + 1)
    ENDIF
    PRINT " "
    FOR X = 0 TO 2
      PRINT X, " - ", Armor(X)
    NEXT X
    INPUT "Select Armor for ", Fighters(Counter).Name, ": ", Fighters(Counter).Armor
    PRINT " "
    FOR X = 0 TO 2
      PRINT X, " - ", Weapon(X)
    NEXT X
    INPUT "Select Weapon for ", Fighters(Counter).Name, ": ", Fighters(Counter).PrimaryWeapon
    PRINT " "
    FOR X = 0 TO 2
      PRINT X, " - ", Shield(X)
    NEXT X
    INPUT "Select Shield for ", Fighters(Counter).Name, ": ", Fighters(Counter).Shield
    Fighters(Counter).MaxHP = 20
    Fighters(Counter).HP = 20
  NEXT Counter

ENDFUNCTION

FUNCTION ShowStats
  Header( )
  FOR X = 0 TO 1
    PRINT "Stats for ", Fighters(X).Name
    PRINT "Armor: ", Armor(Fighters(X).Armor)
    PRINT "Weapon: ", Weapon(Fighters(X).PrimaryWeapon)
    PRINT "Shield: ", Shield(Fighters(X).Shield)
    PRINT "Max Hit Points: ", Fighters(X).MaxHP
    PRINT "Current Hit Points: ", Fighters(X).HP
    PRINT " "
  NEXT X
ENDFUNCTION

FUNCTION Kombat(Counter)
  IF Counter = 1
    Header( )
    ShowStats( )
    PRINT "First we roll for initiative"
    PRINT "Press any key to roll..."
    WAIT KEY
    a = RND(20)
    PRINT Fighters(0).Name, " rolls - ", a
    b = RND(20)
    PRINT Fighters(1).Name, " rolls - ", b
    IF a > b
      Initiative = 0
      PRINT Fighters(0).Name, " has initiative throughout the Kombat!"
    ELSE
      IF b > a
        Initiative = 1
        PRINT Fighters(1).Name, " has initiative throughout the Kombat!"
      ELSE
        Initiative = -1
        PRINT "Simultaneous attacks throughout the Kombat!"
      ENDIF
    ENDIF
    PRINT "  "
    PRINT "Press any key to begin The Kombat!"
    WAIT KEY
    Header( )
    ShowStats( )
  ENDIF

  SELECT Initiative
    CASE 0
      roll = RND(20)
      IF roll >= 10 + Fighters(1).Armor + Fighters(1).Shield
        hit = RND(4) + 1 + (Fighters(0).PrimaryWeapon * 2)
        Fighters(1).HP = Fighters(1).HP - hit
        PRINT Fighters(0).Name, " hits for ", hit
      ELSE
        PRINT Fighters(0).Name, " misses"
      ENDIF
      IF Fighters(1).HP > 0
        roll = RND(20)
        IF roll >= 10 + Fighters(0).Armor + Fighters(1).Shield
          hit = RND(4) + 1 + (Fighters(1).PrimaryWeapon * 2)
          Fighters(0).HP = Fighters(0).HP - hit
          PRINT Fighters(1).Name, " hits for ", hit
        ELSE
          PRINT Fighters(1).Name, " misses"
        ENDIF
      ENDIF
    ENDCASE
    CASE 1
      roll = RND(20)
      IF roll >= 10 + Fighters(0).Armor + Fighters(1).Shield
        hit = RND(4) + Fighters(1).PrimaryWeapon * 2
        Fighters(0).HP = Fighters(0).HP - hit
        PRINT Fighters(1).Name, " hits for ", hit
      ELSE
        PRINT Fighters(1).Name, " misses"
      ENDIF
      IF Fighters(0).HP > 0
        roll = RND(20)
        IF roll >= 10 + Fighters(1).Armor + Fighters(1).Shield
          hit = RND(4) + Fighters(0).PrimaryWeapon * 2
          Fighters(1).HP = Fighters(1).HP - hit
          PRINT Fighters(0).Name, " hits for ", hit
        ELSE
          PRINT Fighters(0).Name, " misses"
        ENDIF
      ENDIF
    ENDCASE
    CASE DEFAULT
      roll = RND(20)
      IF roll >= 10 + Fighters(1).Armor + Fighters(1).Shield
        hit = RND(4) + Fighters(0).PrimaryWeapon * 2
        Fighters(1).HP = Fighters(1).HP - hit
        PRINT Fighters(0).Name, " hits for ", hit
      ELSE
        PRINT Fighters(0).Name, " misses"
      ENDIF
      roll = RND(20)
      IF roll >= 10 + Fighters(0).Armor + Fighters(1).Shield
        hit = RND(4) + Fighters(1).PrimaryWeapon * 2
        Fighters(0).HP = Fighters(0).HP - hit
        PRINT Fighters(1).Name, " hits for ", hit
      ELSE
        PRINT Fighters(1).Name, " misses"
      ENDIF
    ENDCASE
  ENDSELECT

ENDFUNCTION

FUNCTION GameLoop
  LoopCounter = 0

  Header( )
  Setup( )
  Header( )
  ShowStats( )

  REPEAT
    LoopCounter = LoopCounter + 1
    PRINT "Press any key to begin Kombat! Round #", LoopCounter
    WAIT KEY
    Header( )
    ShowStats( )
    Kombat(LoopCounter)
  UNTIL Fighters(0).HP <= 0 OR Fighters(1).HP <= 0

  PRINT "A deadly blow has been struck.  Press any key for the conclusion."
  WAIT KEY

  IF Fighters(0).HP <= 0
    Header( )
    ShowStats( )
    PRINT Fighters(0).Name, " is dead."
  ENDIF

  IF Fighters(1).HP <= 0
    Header( )
    ShowStats( )
    PRINT Fighters(1).Name, " is dead."
  ENDIF

  PRINT "  "
  PRINT "Press any key to end program."
  WAIT KEY

ENDFUNCTION