well i've worked further on this tutorial - seems like two steps forward one step backwards
i've added the monster move and AI to the monsters (enemies ?? monsters?? ) now i have this runtime error:
Code: Select all
#INCLUDE ONCE "player.bi"
#INCLUDE ONCE "enemy.bi"
TYPE Level
PUBLIC:
DECLARE CONSTRUCTOR()
DECLARE DESTRUCTOR()
DECLARE SUB sappend(arr() AS STRING, temp AS STRING)
DECLARE SUB eappend(arr() AS enemy, temp AS enemy)
DECLARE SUB load(fileName AS STRING, BYREF player AS player)
DECLARE SUB printLevel()
DECLARE SUB Moveplayer(k AS STRING,BYREF player AS player)
DECLARE FUNCTION getTile(x AS INTEGER, y AS INTEGER) AS STRING
DECLARE SUB setTile(x AS INTEGER, y AS INTEGER, char AS STRING)
DECLARE SUB updateEnemies(BYREF player AS player)
PRIVATE:
REDIM _levelData(0) AS STRING
REDIM _enemies(0) AS Enemy
DECLARE SUB processPlayerMove(BYREF player AS player, targetY AS INTEGER, tragetY AS INTEGER)
DECLARE function battleMonster(BYREF player AS player, targetX AS INTEGER, tragetY AS INTEGER) AS INTEGER
DECLARE SUB processMonsterMove(BYREF player AS player, monsterIndex AS INTEGER,targetY AS INTEGER, tragetY AS INTEGER)
END TYPE
CONSTRUCTOR Level()
END CONSTRUCTOR
DESTRUCTOR Level()
END DESTRUCTOR
sUB Level.sappend(arr() AS STRING, temp AS STRING)
REDIM PRESERVE arr((LBOUND(arr)) TO (UBOUND(arr)+ 1))
arr(UBOUND(arr)) = temp
END SUB
sUB Level.eappend(arr() AS enemy, temp AS enemy)
REDIM PRESERVE arr((LBOUND(arr)) TO (UBOUND(arr)+ 1))
arr(UBOUND(arr)) = temp
END SUB
SUB Level.load(fileName AS STRING, byref player AS player)
DIM AS STRING r
DIM h AS LONG = FREEFILE
OPEN fileName FOR INPUT AS h
WHILE NOT EOF(h)
LINE INPUT #h, r
sappend(this._levelData(), r)
WEND
CLOSE h
DIM tile AS string
FOR i AS INTEGER = 0 TO UBOUND(this._levelData)
FOR j AS INTEGER = 0 TO LEN(this._levelData(i))
tile = MID(this._levelData(i), j, 1)
SELECT CASE tile
CASE "@"
player.setPosition(j, i)
CASE "S"
DIM s AS Enemy
s.CONSTRUCTOR("sanke", tile, 1,1,1,1,1)
eappend(this._enemies(),s)
this._enemies(UBOUND(this._enemies)).setPosition(j,i)
CASE "g"
DIM g AS Enemy
g.CONSTRUCTOR("goblin", tile, 2,10,5,35,50)
eappend(this._enemies(), g)
this._enemies(UBOUND(this._enemies)).setPosition(j,i)
CASE "O"
DIM o AS Enemy
o.CONSTRUCTOR("ogre", tile, 4,20,20,200,500)
eappend(this._enemies(), o)
this._enemies(UBOUND(this._enemies)).setPosition(j,i)
CASE "B"
DIM b AS Enemy
b.CONSTRUCTOR("bandit", tile, 3,15,10,100,250)
eappend(this._enemies(), b)
this._enemies(UBOUND(this._enemies)).setPosition(j,i)
CASE "D"
DIM d AS Enemy
d.CONSTRUCTOR("dragon", tile, 100,2000,2000,2000,500000)
eappend(this._enemies(), d)
this._enemies(UBOUND(this._enemies)).setPosition(j,i)
END SELECT
NEXT
NEXT
END SUB
SUB Level.printLevel()
CLS
FOR i AS INTEGER = 0 TO UBOUND(this._levelData)
PRINT this._levelData(i)
NEXT
SLEEP(1000)
END SUB
SUB Level.Moveplayer(k AS STRING,BYREF player AS player)
DIM AS INTEGER PlayerX, PlayerY
player.getPosition(PlayerX, PlayerY)
SELECT CASE k
CASE "w"
this.processPlayerMove(player,PlayerX, PlayerY - 1)
CASE "s"
this.processPlayerMove(player,PlayerX, PlayerY + 1)
CASE "a"
this.processPlayerMove(player,PlayerX - 1, PlayerY)
CASE "d"
this.processPlayerMove(player,PlayerX + 1, PlayerY)
END SELECT
END SUB
FUNCTION Level.getTile(x AS INTEGER, y AS INTEGER) AS STRING
RETURN MID(this._levelData(y), x, 1)'<---- this is where the runtime error happens :(
END FUNCTION
SUB Level.setTile(x AS INTEGER, y AS INTEGER, char AS STRING)
MID(this._levelData(y), x, 1) = char
END SUB
SUB Level.processPlayerMove(BYREF player AS player, targetX AS INTEGER, targetY AS INTEGER)
DIM AS INTEGER playerX, playerY
player.getPosition(playerX,playerY)
DIM AS STRING moveTile = getTile(targetX, targetY)
SELECT CASE moveTile
CASE "#"
PRINT "you ran into a wall!"
SLEEP
CASE "."
player.setPosition(targetX,targetY)
setTile(playerX, playerY, ".")
setTile(targetX,targetY, "@")
CASE ELSE
battleMonster(player, targetX, targetY)
END SELECT
END SUB
function Level.battleMonster(BYREF player AS player, targetX AS INTEGER, targetY AS INTEGER) AS INTEGER
DIM AS INTEGER enemyX, enemyY, playerX, playerY
DIM AS INTEGER attackRoll, attackResult
PLAYER.GETPOSITION(playerX,playerY)
FOR i AS INTEGER = 0 TO UBOUND(this._enemies)
this._enemies(i).getPosition(enemyX, enemyY)
IF (targetX = enemyX AND targetY = enemyY) THEN
attackRoll = PLAYER.ATTACK()
PRINT "player attacked monster with roll of " & STR(attackroll)
attackResult = this._enemies(i).takeDamage(attackRoll)
IF (attackResult <> 0) THEN
setTile(targetX,targetY, ".")
printlevel()
PRINT "monster died!"
this._enemies(i).deadMonster()
'i -= 1
sleep
Player.addExperience(attackResult)
RETURN 0
ENDIF
attackRoll = this._enemies(i).attack()
PRINT "monster attacked player with the roll of " & STR(attackroll)
attackResult = Player.takeDamage(attackRoll)
IF (attackResult <> 0) THEN
setTile(playerX,playerY, "X")
printlevel()
PRINT "you died!"
sleep
END
RETURN 0
ENDIF
SLEEP
RETURN 0
ENDIF
NEXT
END FUNCTION
SUB Level.updateEnemies(BYREF player AS player)
DIM aiMove AS STRING
DIM AS INTEGER playerX, playerY, enemyX, enemyY
PLAYER.GETPOSITION(playerX, playerY)
FOR i AS INTEGER = 0 TO UBOUND(this._enemies)
aiMove = this._enemies(i).getMove(playerX, playerY)
this._enemies(i).getPosition(enemyX,enemyY)
SELECT CASE aiMove
CASE "w"
this.processMonsterMove(player,i,enemyX, enemyY - 1)
CASE "s"
this.processMonsterMove(player,i,enemyX, enemyY + 1)
CASE "a"
this.processMonsterMove(player,i,enemyX - 1, enemyY)
CASE "d"
this.processMonsterMove(player,i,enemyX + 1, enemyY)
END SELECT
NEXT
END SUB
SUB Level.processMonsterMove(BYREF player AS player, monsterIndex AS INTEGER, targetX AS INTEGER, targetY AS INTEGER)
DIM AS INTEGER playerX, playerY, enemyX, enemyY
player.getPosition(playerX,playerY)
this._enemies(monsterIndex).getPosition(enemyX,enemyY)
DIM AS STRING moveTile = getTile(targetX, targetY)
SELECT CASE moveTile
CASE "#"
CASE "."
this._enemies(monsterIndex).setPosition(targetX,targetY)
setTile(enemyX, enemyY, ".")
setTile(targetX,targetY, this._enemies(monsterIndex).getTile())
CASE ELSE
END SELECT
END SUB
i've upload the project to github to a public repository in the hope that some one will take the time and trouble and help me finish this dam game...