self.halfMapWidth = halfMapWidth self.mapHeight = mapHeight self.blockRatio = blockRatio self.duration = None def setupMap(self): super(StandardRandomLevel, self).setupMap() layoutHelper = RandomLayoutHelper(self.world, self.halfMapWidth, self.mapHeight, self.blockRatio, self.duration) layoutHelper.apply() self.duration = layoutHelper.duration def getDuration(self): return self.duration class StandardLoadedLevel(StandardLevel): def __init__(self, mapLayout): super(StandardLoadedLevel, self).__init__() self.mapLayout = mapLayout def setupMap(self): super(StandardLoadedLevel, self).setupMap() self.world.setLayout(self.mapLayout) if __name__ == '__main__': playLevel(StandardRandomLevel(), aiCount=1)
class DemoLevel(Level): ''' Demonstrates a resync at game start, which shouldn't occur. ''' world = None def setupMap(self): zones = ZoneLayout() self.world.setLayout(zones.createMapLayout(self.world.layoutDatabase)) @defer.inlineCallbacks def start(self): from twisted.internet import reactor # NOTE: without this yield line it syncs just fine. d = defer.Deferred() reactor.callLater(0, d.callback, None) # yield d humans = yield self.waitForHumans(1) self.world.magicallyMovePlayer(humans[0], self.world.getZone(0).defn.pos, alive=True) if __name__ == '__main__': playLevel(DemoLevel())
pos = zones.connectZone(zones.firstLocation, ZoneStep.NORTHEAST) pos = zones.connectZone(pos, ZoneStep.SOUTHEAST) pos = zones.connectZone(pos, ZoneStep.SOUTH) pos = zones.connectZone(pos, ZoneStep.SOUTHWEST) pos2 = zones.connectZone(pos, ZoneStep.NORTHWEST) zones.connectZone(pos2, ZoneStep.NORTH) pos = zones.connectZone(pos, ZoneStep.SOUTH) pos = zones.connectZone(pos, ZoneStep.SOUTHEAST) pos = zones.connectZone(pos, ZoneStep.NORTHEAST) pos = zones.connectZone(pos, ZoneStep.NORTH) zones.connectZone(pos, ZoneStep.NORTHWEST) pos = zones.connectZone(pos, ZoneStep.NORTHEAST) pos = zones.connectZone(pos, ZoneStep.NORTH) pos = zones.connectZone(pos, ZoneStep.NORTHWEST) zones.connectZone(pos, ZoneStep.SOUTHWEST) pos = zones.connectZone(pos, ZoneStep.NORTH) pos = zones.connectZone(pos, ZoneStep.NORTHWEST) pos = zones.connectZone(pos, ZoneStep.SOUTHWEST) zones.connectZone(pos, ZoneStep.SOUTH) layout = zones.createMapLayout(self.world.layoutDatabase) self.world.setLayout(layout) if __name__ == '__main__': playLevel(DemoLevel(), aiCount=9)
self.playSound('custom-capture-orb.ogg') self.sendPrivateChat( self.helperBot.player, human, 'Now capture that orb!') yield self.world.sleep(2) self.helperBot.moveToOrb(self.world.getZone(2)) yield self.helperBot.onOrderFinished.wait() self.playSound('custom-i-win.ogg') self.sendPrivateChat(self.helperBot.player, human, 'Game over. I win.') yield self.world.sleep(2) self.playSound('game-over-whistle.ogg') self.world.abilities.set(zoneCaps=False) self.world.uiOptions.set(showGameOver=True, winningTeam=self.blueTeam) def findReasonPlayerCannotJoin(self, game, teamId, user, bot): # Only allow one human player to join if any(not p.bot for p in self.world.players): return GAME_FULL_REASON if bot: return UNAUTHORISED_REASON return None def getTeamToJoin(self, preferredTeam, user, bot): return self.blueTeam if __name__ == '__main__': playLevel(TriggerDemoLevel())
location = zones.firstLocation addColumn(location, 5, 0) location += ZoneStep.SOUTHEAST addColumn(location, 4, 5) location += ZoneStep.NORTHEAST addColumn(location, 5, 4) location += ZoneStep.SOUTHEAST addColumn(location, 4, 5) location += ZoneStep.SOUTHEAST addColumn(location, 3, 4) location += ZoneStep.SOUTHEAST addColumn(location, 2, 3) location += ZoneStep.SOUTHEAST addColumn(location, 1, 2) zones.makeEverywhereReachable() layout = zones.createMapLayout(self.world.layoutDatabase) self.world.setLayout(layout) leftmost = min(self.world.zones, key=lambda z: z.defn.pos[0]) rightmost = max(self.world.zones, key=lambda z: z.defn.pos[0]) for zone in self.world.zones: if zone not in (leftmost, rightmost): if zone.owner: zone.owner.zoneLost() zone.owner = None if __name__ == '__main__': playLevel(DeploymentLevel(), aiCount=9)
# Install the asyncio reactor as early as possible import asyncio from twisted.internet import asyncioreactor asyncioreactor.install(asyncio.get_event_loop()) from trosnoth.const import BOT_GOAL_CAPTURE_MAP from trosnoth.levels.base import playLevel from trosnoth.levels.standard import StandardRandomLevel class PositioningDrillLevel(StandardRandomLevel): async def mainGamePhase(self): self.world.teams[0].abilities.set(aggression=False) self.world.teams[1].abilities.set(aggression=False) try: await super(PositioningDrillLevel, self).mainGamePhase() finally: self.world.teams[0].abilities.set(aggression=True) self.world.teams[1].abilities.set(aggression=True) def setMainGameUserInfo(self): self.setUserInfo('Positioning Drill', ( '* Shooting is deactivated', '* Pay attention to which zone you are standing in', ), BOT_GOAL_CAPTURE_MAP) if __name__ == '__main__': playLevel(PositioningDrillLevel(), aiCount=1)
if score == maxScore and p.team == self.blueTeam ] self.playSound('game-over-whistle.ogg') for winner in winners: self.notifyAll('{} wins'.format(winner.nick)) self.world.sendServerCommand( AwardPlayerCoinMsg(winner.id, BONUS_COINS_FOR_WINNER)) await self.world.sleep_future(3) class RespawnOnJoinTrigger(Trigger): def doActivate(self): self.world.onPlayerAdded.addListener(self.gotPlayerAdded) for player in self.world.players: self.gotPlayerAdded(player) def doDeactivate(self): self.world.onPlayerAdded.removeListener(self.gotPlayerAdded) def gotPlayerAdded(self, player, *args, **kwargs): if player.team == self.level.blueTeam: mapLayout = self.world.map.layout self.world.magicallyMovePlayer( player, (mapLayout.centreX, mapLayout.centreY), alive=True) if __name__ == '__main__': playLevel(CatPigeonLevel(duration=180), aiCount=1)
while not region.check(self.human): details = yield region.onEnter.wait() self.world.removeRegion(region) @defer.inlineCallbacks def startMarching(self, bot, start, end): while not bot.player.dead: bot.moveToPoint(end) yield bot.onOrderFinished.wait() yield self.world.sleep(random.random()) if bot.player.dead: break bot.moveToPoint(start) yield bot.onOrderFinished.wait() yield self.world.sleep(random.random()) def findReasonPlayerCannotJoin(self, game, teamId, user, bot): # Only allow one human player to join if any(not p.bot for p in self.world.players): return GAME_FULL_REASON if bot: return UNAUTHORISED_REASON return None def getTeamToJoin(self, preferredTeam, user, bot): return self.blueTeam if __name__ == '__main__': playLevel(TutorialLevel())
else: self.world.clock.stop() self.world.clock.propagateToClients() await self.world.clock.onZero.wait_future() # Game over! self.world.finaliseStats() scoreTrigger.deactivate() botTrigger.deactivate() playerScores = self.world.scoreboard.playerScores maxScore = max(playerScores.values()) winners = [ p for p, score in list(playerScores.items()) if score == maxScore and p.team == self.redTeam ] self.playSound('game-over-whistle.ogg') for winner in winners: self.notifyAll('{} wins'.format(winner.nick)) self.world.sendServerCommand( AwardPlayerCoinMsg(winner.id, BONUS_COINS_FOR_WINNER)) await self.world.sleep_future(3) finally: self.redTeam.abilities.set(aggression=True) if __name__ == '__main__': playLevel(HuntedLevel(duration=180), aiCount=1)
sys.path.insert(0, os.path.join( os.path.abspath(os.path.dirname(__file__)), '..', '..')) # Install the asyncio reactor as early as possible import asyncio from twisted.internet import asyncioreactor asyncioreactor.install(asyncio.get_event_loop()) from trosnoth.const import BOT_GOAL_CAPTURE_MAP from trosnoth.levels.base import playLevel from trosnoth.levels.standard import StandardRandomLevel class DefenceDrillLevel(StandardRandomLevel): async def mainGamePhase(self): self.world.teams[1].abilities.set(zoneCaps=False) try: await super(DefenceDrillLevel, self).mainGamePhase() finally: self.world.teams[1].abilities.set(zoneCaps=True) def setMainGameUserInfo(self): self.setUserInfo('Defence Drill', ( '* Red players cannot capture zones', '* Try not to lose your zones', ), BOT_GOAL_CAPTURE_MAP) if __name__ == '__main__': playLevel(DefenceDrillLevel(), aiCount=1)
import logging from trosnoth.levels.base import playLevel from trosnoth.levels.standard import StandardRandomLevel from trosnoth.triggers.coins import AwardStartingCoinsTrigger log = logging.getLogger(__name__) class TestingLevel(StandardRandomLevel): def initPregameCountdown(self, delay=10): AwardStartingCoinsTrigger(self, coins=10000).activate() self.world.clock.startCountDown(0.1, flashBelow=0) self.world.clock.propagateToClients() if __name__ == '__main__': playLevel(TestingLevel(halfMapWidth=5, mapHeight=4), aiCount=0)
''' def __init__( self, halfMapWidth=None, mapHeight=None, blockRatio=None, duration=None): super(RandomTrosballLevel, self).__init__(duration) self.halfMapWidth = halfMapWidth self.mapHeight = mapHeight self.blockRatio = blockRatio def makeNewMap(self, first): RandomLayoutHelper( self.world, self.halfMapWidth, self.mapHeight, self.blockRatio).apply() class LoadedTrosballLevel(TrosballMatchBase): def __init__(self, mapLayout, duration=None): super(LoadedTrosballLevel, self).__init__(duration) self.mapLayout = mapLayout def makeNewMap(self, first): if first: self.world.setLayout(self.mapLayout) if __name__ == '__main__': playLevel(RandomTrosballLevel(duration=150), aiCount=7)
'* Kill as many other players as you can', '* You gain 1 point per kill', '* You lose ½ point if you are killed', ), BOT_GOAL_KILL_THINGS) self.world.abilities.set(zoneCaps=False, balanceTeams=False) self.world.uiOptions.set(teamIdsHumansCanJoin=[NEUTRAL_TEAM_ID]) if self.duration: self.world.clock.startCountDown(self.duration) else: self.world.clock.stop() self.world.clock.propagateToClients() await self.world.clock.onZero.wait_future() # Game over! playerScores = self.world.scoreboard.playerScores maxScore = max(playerScores.values()) winners = [ p for p, score in list(playerScores.items()) if score == maxScore ] self.playSound('game-over-whistle.ogg') for winner in winners: self.notifyAll('{} wins'.format(winner.nick)) self.world.sendServerCommand( AwardPlayerCoinMsg(winner.id, BONUS_COINS_FOR_WINNER)) if __name__ == '__main__': playLevel(FreeForAllLevel(duration=180), aiCount=0)
break self.playSound('short-whistle.ogg') self.world.scoreboard.playerScored(args['player'], 1) finally: self.world.removeRegion(region) def selectZone(self): if self.targetZone: self.world.sendServerCommand( ZoneStateMsg(self.targetZone.id, NEUTRAL_TEAM_ID, True)) allZones = [z for z in self.world.zones if z.owner is None] options = [z for z in allZones if not z.players] if options: zone = random.choice(options) else: zone = min( allZones, key=lambda z: min( distance(z.defn.pos, p.pos) for p in z.players)) self.world.sendServerCommand( ZoneStateMsg(zone.id, self.targetTeamId, True)) self.targetZone = zone return zone if __name__ == '__main__': playLevel(OrbChaseLevel(duration=180))
), BOT_GOAL_KILL_THINGS) self.world.abilities.set(zoneCaps=False, balanceTeams=False) self.world.uiOptions.set( teamIdsHumansCanJoin=[NEUTRAL_TEAM_ID], highlightElephant=True, ) if self.duration: self.world.clock.startCountDown(self.duration) else: self.world.clock.stop() self.world.clock.propagateToClients() await self.world.clock.onZero.wait_future() # Game over! playerScores = self.world.scoreboard.playerScores maxScore = max(playerScores.values()) winners = [ p for p, score in playerScores.items() if score == maxScore] self.playSound('game-over-whistle.ogg') for winner in winners: self.notifyAll('{} wins'.format(winner.nick)) self.world.sendServerCommand( AwardPlayerCoinMsg(winner.id, BONUS_COINS_FOR_WINNER)) if __name__ == '__main__': playLevel(ElephantKingLevel(duration=120), aiCount=1)