maps/python/CFTowerDefense.py

162 lines
4.4 KiB
Python

import Crossfire
bulletwall = [
'lbulletwall_1',
'lbulletwall_2',
'lbulletwall_3',
'lbulletwall_4',
'lbulletwall_5',
'lbulletwall_6',
'lbulletwall_7',
'lbulletwall_8',
]
lightningwall = [
'lightningwall_1',
'lightningwall_2',
'lightningwall_3',
'lightningwall_4',
'lightningwall_5',
'lightningwall_6',
'lightningwall_7',
'lightningwall_8',
]
firewall = [
'firewall_1',
'firewall_2',
'firewall_3',
'firewall_4',
'firewall_5',
'firewall_6',
'firewall_7',
'firewall_8',
]
def create_tower(player, current_map, tile, builder):
"""
If a builder is dropped on a tower placement tile, a tower is built
player: the player object
current_map: the map object the player is in
tile: all objects on a tile (a list of Crossfire objects)
builder: the tower builder (a Crossfire object)
Returns: True if a tower was built, False otherwise.
"""
for ob in tile:
if ob.Name == 'tower placement':
# key/value: builder name/(arch name, spell level)
builders = {
'build large bullet tower': ('lbulletwall_1', 1),
'build lightning tower': ('lightningwall_1', 1),
'build fire tower': ('firewall_1', 40)
}
for name in builders:
if name in builder.Name:
wall = Crossfire.CreateObjectByName(builders[name][0])
wall.Level = builders[name][1]
wall.Teleport(current_map, player.X, player.Y)
player.Teleport(current_map, player.X, player.Y+1)
builder.Quantity -= 1
return True
return False
def destroy_tower(tile, towerlist):
"""
If an object in tile exists in towerlist, the object is removed
tile: all objects on a tile (a list of Crossfire objects)
towerlist: bulletwall, firewall, or lightningwall
Returns: True if a tower was destroyed, False otherwise.
"""
for ob in tile:
if ob.ArchName in towerlist:
ob.Remove()
return True
return False
def replace_tower(current_map, tile, towerlist, level=0):
"""
If an object in tile exists in towerlist, the object is replaced with the
next direction in towerlist
current_map: the map object the player is in
tile: all objects on a tile (a list of Crossfire objects)
towerlist: bulletwall, firewall, or lightningwall
level: the spell level of the tower
Returns: True if a tower was replaced, False otherwise.
"""
for ob in tile:
if ob.ArchName in towerlist:
position = towerlist.index(ob.ArchName)
x, y = ob.X, ob.Y
if position == len(towerlist)-1:
new_position = 0
else:
new_position = position+1
ob.Remove()
wall = Crossfire.CreateObjectByName(towerlist[new_position])
wall.Teleport(current_map, x, y)
# Add original rebalanced spell level for tower
if level:
wall.Level = level
return True
return False
def player_objects(player, current_map) -> list:
"""
Returns all objects in the direction the player faces
player: the player object
current_map: the map object the player is in
"""
# key/value: crossfire direction number/corresponding (x, y) coordinate
directions = {
Crossfire.Direction.NORTH: (player.X, player.Y-1),
Crossfire.Direction.SOUTH: (player.X, player.Y+1),
Crossfire.Direction.EAST: (player.X+1, player.Y),
Crossfire.Direction.WEST: (player.X-1, player.Y),
Crossfire.Direction.NORTHWEST: (player.X-1, player.Y-1),
Crossfire.Direction.NORTHEAST: (player.X+1, player.Y-1),
Crossfire.Direction.SOUTHWEST: (player.X-1, player.Y+1),
Crossfire.Direction.SOUTHEAST: (player.X+1, player.Y+1)
}
x, y = directions[player.Facing]
tile_ob = []
ob = current_map.ObjectAt(x, y)
while ob:
tile_ob.append(ob)
ob = ob.Above
return tile_ob
def player_tile_objects(player, current_map) -> list:
"""
Returns all objects in the tile the player is standing on
player: the player object
current_map: the map object the player is in
"""
tile_ob = []
ob = current_map.ObjectAt(player.X, player.Y)
while ob:
tile_ob.append(ob)
ob = ob.Above
return tile_ob