View difference between Paste ID: rDt8WG1W and m6EdcFsw
SHOW: | | - or go back to the newest paste.
1
"""
2
Tug of War game mode, where you must progressively capture the enemy CPs in a 
3
straight line to win.
4
5
Maintainer: mat^2
6
"""
7
8
from pyspades.constants import *
9
from pyspades.server import Territory
10
import random
11
import math
12
from math import pi
13
14
HELP = [
15
    "In Tug of War, you capture your opponents' front CP to advance."
16
]
17
18
class TugTerritory(Territory):
19
    disabled = True
20
    
21
    def add_player(self, player):
22
        if self.disabled:
23
            return
24
        Territory.add_player(self, player)
25
    
26
    def enable(self):
27
        self.disabled = False
28
    
29
    def disable(self):
30
        for player in self.players.copy():
31
            self.remove_player(player)
32
        self.disabled = True
33
        self.progress = float(self.team.id)
34
35
def get_index(value):
36
    if value < 0:
37
        raise IndexError()
38
    return value
39
40
def apply_script(protocol, connection, config):
41
    class TugConnection(connection):
42
        def get_spawn_location(self):
43
            if self.team.spawn_cp is None:
44
                base = self.team.last_spawn
45
            else:
46
                base = self.team.spawn_cp
47
            return base.get_spawn_location()
48
            
49
        def on_spawn(self, pos):
50
            for line in HELP:
51
                self.send_chat(line)
52
            return connection.on_spawn(self, pos)
53
            
54
    class TugProtocol(protocol):
55
        game_mode = TC_MODE
56
        
57
        def get_cp_entities(self):
58
            # generate positions
59
            
60
            map = self.map
61
            blue_cp = []
62
            green_cp = []
63
64-
            points = self.protocol.map_info.tow_locations
64+
            points = self.map_info.extensions
65
            
66-
            for i, point in enumerate(points):
66+
            for i, point in enumerate(points['tow_locations']):
67-
                if i < len(points) / 2:
67+
                if i < len(points['tow_locations']) / 2:
68
                    blue_cp.append(point)
69
                else:
70
                    green_cp.append(point)
71
            
72
            # make entities
73
            
74
            index = 0
75
            entities = []
76
            
77
            for i, (x, y) in enumerate(blue_cp):
78
                entity = TugTerritory(index, self, *(x, y, map.get_z(x, y)))
79
                entity.team = self.blue_team
80
                if i == 0:
81
                    self.blue_team.last_spawn = entity
82
                    entity.id = -1
83
                else:
84
                    entities.append(entity)
85
                    index += 1
86
            
87
            self.blue_team.cp = entities[-1]
88
            self.blue_team.cp.disabled = False
89
            self.blue_team.spawn_cp = entities[-2]
90
                
91
            for i, (x, y) in enumerate(green_cp):
92
                entity = TugTerritory(index, self, *(x, y, map.get_z(x, y)))
93
                entity.team = self.green_team
94
                if i == len(green_cp) - 1:
95
                    self.green_team.last_spawn = entity
96
                    entity.id = index
97
                else:
98
                    entities.append(entity)
99
                    index += 1
100
101
            self.green_team.cp = entities[-(len(points)-2)/2]
102
            self.green_team.cp.disabled = False
103
            self.green_team.spawn_cp = entities[-(len(points)-2)/2 + 1]
104
            
105
            return entities
106
    
107
        def on_cp_capture(self, territory):
108
            team = territory.team
109
            if team.id:
110
                move = -1
111
            else:
112
                move = 1
113
            for team in [self.blue_team, self.green_team]:
114
                try:
115
                    team.cp = self.entities[get_index(team.cp.id + move)]
116
                    team.cp.enable()
117
                except IndexError:
118
                    pass
119
                try:
120
                    team.spawn_cp = self.entities[get_index(
121
                        team.spawn_cp.id + move)]
122
                except IndexError:
123
                    team.spawn_cp = team.last_spawn
124
            cp = (self.blue_team.cp, self.green_team.cp)
125
            for entity in self.entities:
126
                if not entity.disabled and entity not in cp:
127
                    entity.disable()
128
129
    return TugProtocol, TugConnection