[GAME MODE] Bury the Base
Posted: Wed Apr 30, 2014 1:52 pm
I've been tinkering and experiment with scripting lately, so I made this at the suggestion of a friend. It's a game mode in which both bases spawn on two towers (either specified or random, with specifiable characteristics) and attempt to destroy the other team's tower. The game is when one teams base is lowered to the lowest ground on the map. Currently it's a bit odd and I haven't tested it with multiple people yet. I'm just placing it here so I don't have to make a topic later. I'm open to ideas and feedback if you'd be so kind.
Code: Select all
"""
Bury the Base v0.7
by Shrub
References: babel_script.py, babel.py, tow.py,
onectf.py
"""
# Imports constants pyspades to make lines shorter, but harder to understand?
from pyspades.constants import *
from pyspades.types import MultikeyDict
# Define static variables
BLUE_BASE = (32, 32)
GREEN_BASE = (64, 64)
BLUE_TOWER_COLOUR = (0, 0, 255)
GREEN_TOWER_COLOUR = (0, 255, 0)
TOWER_RADIUS = 4
TOWER_HEIGHT = 30
# Unused as of now
SPAWN_RADIUS = (0, 0)
# TOW had this so I figured I should add it
HELP = [
"In Bury the Base, you dig under the enemy base until it hits the ground"
]
# Dat apply_script method
def apply_script(protocol, connection, config):
"""Allows script to be run"""
class BtbProtocol(protocol):
"""Hooks into the protocol class to run protocol functions"""
# Specify CTF game-mode as a base to work on
game_mode = CTF_MODE
def on_map_change(self, map):
"""Initializses the map"""
# Set the variables up
self.blue_base = BLUE_BASE
self.green_base = GREEN_BASE
# Assign first values to both bases, if not already
if self.blue_base == None:
self.blue_base = self.get_random_location(False, (16, 16, 192, 496))
# Finds a new base position until the base is above the ground
while self.blue_base[2] >= 62:
self.blue_base = self.get_random_location(False, (16, 16, 192, 496))
else:
self.blue_base = (BLUE_BASE[0], BLUE_BASE[1], 62 - TOWER_HEIGHT)
if self.green_base == None:
self.green_base = self.get_random_location(False, (320, 16, 496, 496))
while self.green_base[2] >= 62:
self.green_base = self.get_random_location(False, (320, 16, 496, 496))
else:
self.green_base = (GREEN_BASE[0], GREEN_BASE[1], 62 - TOWER_HEIGHT)
# Run the tower building module
self.build_tower(self.blue_base, map, BLUE_TOWER_COLOUR)
self.build_tower(self.green_base, map, GREEN_TOWER_COLOUR)
# Prevent the asphyxiation of the hook
return protocol.on_map_change(self, map)
def build_tower(self, base, map, colour):
# Assign some neat variables, lower is the variable where the range starts
upper_z = 62 - TOWER_HEIGHT
# Tower X and Y limits are TOWER_RADIUS away from base
lower_x = base[0] - TOWER_RADIUS
upper_x = base[0] + TOWER_RADIUS
lower_y = base[1] - TOWER_RADIUS
upper_y = base[1] + TOWER_RADIUS
# Count along the z-axis, x-axis and y-axis, respectively, placing blocks
for z in range(upper_z, 62):
for x in range(lower_x, upper_x):
for y in range(lower_y, upper_y):
map.set_point(x, y, z, colour)
def on_base_spawn(self, x, y, z, base, entity_id):
"""Assigns bases to their predefined positions"""
# Checks which side of the map the base is on to discern the base
if x < 256:
pos = self.blue_base
else:
pos = self.green_base
# The hook is not for dinner
protocol.on_base_spawn(self, pos[0], pos[1], (62 - TOWER_HEIGHT), base, entity_id)
return pos
def on_update_entity(self, entity):
"""
Checks if either base hits the lowest
block whenever an entity updates
"""
if self.green_team.base.z >= 62:
protocol.reset_game(self, self.getBlue())
# I'll leave these until I fix that reset bug
#self.build_tower(self.blue_base, self.map, BLUE_TOWER_COLOUR)
#self.build_tower(self.green_base, self.map, GREEN_TOWER_COLOUR)
if self.blue_team.base.z >= 62:
protocol.reset_game(self, self.getGreen())
#self.build_tower(self.blue_base, self.map, BLUE_TOWER_COLOUR)
#self.build_tower(self.green_base, self.map, GREEN_TOWER_COLOUR)
# Dun swallah da hewk!
return protocol.on_update_entity(self, entity)
def getBlue(self):
"""Creates a fake Blue player to spoof the team because lazy"""
player = MultikeyDict()
player.name = "Deuce"
player.player_id = 99
player.tool = 0
player.weapon = 0
player.kills = 0
player.team = self.blue_team
player.color = (0, 0, 0)
return player
def getGreen(self):
"""Creates a fake Green player to spoof the team because lazy"""
player = MultikeyDict()
player.name = "Deuce"
player.player_id = 99
player.tool = 0
player.weapon = 0
player.kills = 0
player.team = self.green_team
player.color = (0, 0, 0)
return player
def on_flag_spawn(self, x, y, z, flag, entity_id):
"""Sends the flags to the corner of the map"""
# I nicked this snipped from onectf.py
pos = (0, 0, 63)
# Hooks are inedible
protocol.on_flag_spawn(self, pos[0], pos[1], pos[2], flag, entity_id)
return pos
class BtbConnection(connection):
"""Hooks into the connection class"""
def on_flag_take(self):
"""Prevents the flag from being taken"""
return False
# Do I even need this line
return connection.on_flag_take(self)
# Returns the protocol and connection to server.py
return BtbProtocol, BtbConnection
# Volans minimum, volans caecum
# -------------------------------------------------------------------------------------
# To-do
# - Fix game win attribution
# - Fix game reset tower creation
# - Add radial spawning
# - Fix " has captured the Green Intel"
# -------------------------------------------------------------------------------------