[GAME MODE] Bury the Base

Incomplete code that isn't ready for use.
4 posts Page 1 of 1
shrub74
Deuce
Posts: 20
Joined: Fri Nov 22, 2013 1:36 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"
# -------------------------------------------------------------------------------------
Attachments
btb.py
Bury the Base (btb.py)
(5.22 KiB) Downloaded 89 times
Dr.Morphman
Scripter
Scripter
Posts: 73
Joined: Sun Feb 24, 2013 9:55 am


sounds like a mode which favours people loving to go fully offensive and players who like staying in the back/defending alike
i like the idea in generall so it would be interesting to see it on a populated serv
some suggestions from my side:
- work with map_extensions , this will make it easier to use on regular public servers for server admins, it will also solve your spawn radius thingy
- disable destryoing blocks of your own tower to prevent griefers
- (maybe) disable building at the tower at all so you canot repair it
izzy
Head Admin / Co-founder
Head Admin / Co-founder
Posts: 473
Joined: Tue Oct 09, 2012 8:16 pm


Dr.Morphman wrote:
- disable destryoing blocks of your own tower to prevent griefers
Yes, very important. Without anti grief the game mode will be impossible to play/test on a public server.
shrub74
Deuce
Posts: 20
Joined: Fri Nov 22, 2013 1:36 pm


Thanks a lot for the feedback guys. Those are all good ideas, and I'll certainly implement them.
4 posts Page 1 of 1
Return to “Work In Progress”

Who is online

Users browsing this forum: No registered users and 7 guests