I am very new to Nim, and am trying to port the libtcod tutorial written in
Python - here: [Complete Roguelike Tutorial, using
python+libtcod](http://www.roguebasin.com/index.php?title=Complete_Roguelike_Tutorial,_using_python%2Blibtcod)
\- to Nim.
For the most part, it is smooth sailing, but now we are going to use
composition and inheritance, and this is what I've got:
type
Fighter = ref object of RootObj
max_hp, hp, defense, power : int
owner : ref RootObj
AI = ref object of RootObj
owner : ref RootObj
# Generic object represented by a character on the screen
# A Thing can be: player, monster, item, stairs, ...
Thing = ref object of RootObj
x, y : int
color : TColor
symbol : char
name : string
blocks : bool
fighter : Fighter
ai : AI
BasicMonster = ref object of AI
Then, the Thing constructor:
proc newThing(x : int, y : int, symbol : char, name : string, color :
TColor, blocks : bool, fighter : Fighter = nil, ai : AI = nil) : Thing =
result = new Thing
result.x = x
result.y = y
result.symbol = symbol
result.name = name
result.color = color
result.blocks = blocks
result.fighter = fighter
if fighter != nil:
fighter.owner = result
result.ai = ai
if ai != nil:
ai.owner = result
And an example of a method using it:
method take_turn(self : BasicMonster) =
var monster = Thing(self.owner)
if map_is_in_fov(fov_map, monster.x, monster.y):
if monster.distance_to(player) >= 2:
monster.move_towards(player.x, player.y)
elif player.fighter.hp > 0:
echo("The attack of the ", monster.name, " bounces off your shiny
metal armor!")
While it seems to work, it does look a bit _messy_ \- am I on the right track?
The whole idea behind the AI component is that it can be of different types -
_BasicMonster_ is just one of them, using a dead simple terminator chase
approach.