-
Notifications
You must be signed in to change notification settings - Fork 0
/
unit.py
131 lines (122 loc) · 5 KB
/
unit.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
from heapq import heappush,heappop
import numpy as N
import city
class Unit(object):
"""
Summary:
Unit is a non-city entiy on the game map. They are able to move around
the map and preform actions such as attacking other units or cities. In
addition some units can settle cities.
"""
def __init__(self,name="none",atype="nothing",prod_cost=0,strength=0,\
speed=0,range_strength=0,rangeSize=0,civ=None,grid=None,y=0,x=0,airdrop=0):
"""
Summary:
The constructor for this class. It initiallizes the units general
stats that will then be used to controle the unit.
name* : The name of the unit, such as
atype*:
prod_cost*:
strength* :
speed* :
range_strength* :
rangeSize* :
civ* :
grid* :
y* :
x* :
airdrop* :
"""
self.name = name
self.atype = atype
self.prod_cost = prod_cost
self.strength = strength
self.range_strength = range_strength
self.rangeSize = rangeSize
self.speed = speed
self.civ = civ
self.grid = grid
self.y = y
self.x = x
self.health = 100
self.airdrop = airdrop
self.type = "unit"
self.can_found_city = False
if self.name == "settler":
self.target_city_tile = None
def choose_city_location(self):
#find a city location to move to
distance = self.civ.settler_base_distance
while self.target_city_tile == None and distance < self.grid.x * 2:
# if distance <= self.grid.x:
distance += self.civ.settler_distance_increase
tiles_to_consider = self.grid.tiles[self.y,self.x].get_neighbors(distance=distance)
N.random.shuffle(tiles_to_consider)
for i in range(5):
if tiles_to_consider[i].close_to_city:
pass
else:
self.can_found_city = True
self.target_city_tile = tiles_to_consider[i]
neighbors = self.target_city_tile.get_neighbors(distance=3)
neighbors.append(self.target_city_tile)
for tile in neighbors:
tile.close_to_city = True
if distance > self.grid.x*2:
#make sure the sim doesn't get stuck trying to find a city spot in the end game
self.grid.tiles[self.y,self.x].unit = None
self.can_found_city = False
self.civ.unit_list.remove(self)
#just in case this unit is accessed again somehow
self.y = -1
self.x = -1
def move_once(self):
moved = False
if self.target_city_tile.y > self.y:
self.move_unit(self.y+1,self.x)
moved = True
elif self.target_city_tile.y < self.y:
self.move_unit(self.y-1,self.x)
moved = True
elif self.target_city_tile.x > self.x:
self.move_unit(self.y,self.x+1)
moved = True
elif self.target_city_tile.x < self.x:
self.move_unit(self.y,self.x-1)
moved = True
return moved
def process_turn(self):
if self.name== "settler":#TODO move to found city
if self.target_city_tile == None:
self.choose_city_location()
if self.can_found_city:
#move to city location
moved = self.move_once()
if moved:
if self.grid.tiles[self.y,self.x].terrain == "hills" or \
self.grid.tiles[self.y,self.x].terrain == "forest" or \
self.grid.tiles[self.y,self.x].terrain == "jungle":
pass #don't move more
else:
self.move_once()
if (self.target_city_tile.y == self.y) and (self.target_city_tile.x == self.x):
#found city
self.grid.tiles[self.y,self.x].city = city.City(self.grid,self.y,self.x,self.civ)
self.civ.city_list.append(self.grid.tiles[self.y,self.x].city)
self.grid.tiles[self.y,self.x].city.process_turn()
self.grid.tiles[self.y,self.x].unit = None
self.can_found_city = False
self.civ.unit_list.remove(self)
#just in case this unit is accessed again somehow
self.y = -1
self.x = -1
def move_unit(self, y, x):
if self.grid.tiles[y,x].unit == None:
self.grid.tiles[self.y,self.x].unit = None
self.grid.tiles[y,x].unit = self
self.y = self.grid.tiles[y,x].y
self.x = self.grid.tiles[y,x].x
def value(self):
return 1000 - self.strength * self.civ.strength_value_coef - self.speed * self.civ.speed_value_coef
def __lt__(self,other):
return self.value() < other.value()