-
Notifications
You must be signed in to change notification settings - Fork 0
/
controls.py
83 lines (70 loc) · 3.09 KB
/
controls.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
## Controls and User Interfaces for FTLite ##
import tkinter as tk
import constants
from decorators import returnFunc
from task import Task
class ShipControl(object):
"""Represents the actions that can be done with a Ship
attributes:
battle (Battle): A reference to the Battle the ShipControl belongs to
instance methods:
ShipControl(Battle battle)
addWeapon(Ship ship, Weapon weapon) {@returnFunc}
changeHull(Ship ship, int delta) {@returnFunc}
"""
def __init__( self, battle ):
self.battle = battle
@returnFunc
def addWeapon( self, ship, weapon ):
ship.weapons.append( weapon )
@returnFunc
def changeHull( self, ship, delta ):
ship.hull += delta
class WeaponControl(object):
"""Represents the actions that can be done with a Weapon or Shot
attributes:
battle (Battle): A reference to the Battle the WeaponControl belongs to
instance methods:
WeaponControl(Battle battle)
fireWeapon(Weapon weapon, Ship target)
"""
def __init__( self, battle ):
self.battle = battle
def fireWeapon( self, weapon, target ):
"""Fires a weapon at a target.
Creates a shot on the canvas and adds tasks to the main battle
task list to move the shot, hide the shot when it impacts,
and damage the target ship.
"""
def printFireMessage():
print('Firing weapon')
distanceToTarget = int( weapon.location.distanceTo( target.location ) )
timeToTarget = 60 * int( distanceToTarget / weapon.shotVelocity )
shot = self.battle.interface.canvas.create_image( *weapon.location.coords(),
image=weapon.shotImage )
dxPerFrame = (target.location.x - weapon.location.x)//timeToTarget
dyPerFrame = (target.location.y - weapon.location.y)//timeToTarget
fire = Task( function=printFireMessage,
framesLeft=1,
framesUntil=0,
state='active',
description=None )
travel = Task( function=self.battle.interface.moveShot( shot, dxPerFrame, dyPerFrame ),
framesLeft=timeToTarget,
framesUntil=0,
state='active',
description=None )
impact = Task( function=self.battle.shipControl.changeHull( target, -weapon.damage ),
framesLeft=1,
framesUntil=timeToTarget,
state='upcoming',
description='Shot impacting target' )
shotEnd = Task( function=self.battle.interface.itemConfigure( shot, state=tk.HIDDEN ),
framesLeft=1,
framesUntil=timeToTarget,
state='upcoming',
description=None )
self.battle.addTask( fire )
self.battle.addTask( travel )
self.battle.addTask( impact )
self.battle.addTask( shotEnd )