Пример #1
0
class Projectile:
    def __init__(self):
        self.sprite = SpriteSheet(res.laser_light1)
        self.sprite.init(4, 4)
        self.sprite.origin = self.sprite.frame_dim/2
        self.explosion_sprite = SpriteSheet(res.explosion_missile1)
        self.explosion_sprite.init(9, 9, 0.05)
        self.explosion_sprite.origin = self.explosion_sprite.frame_dim/2
        self.damage = 1
        self.phase = 0 # 0 = Weapon to offscreen, 1 = offscreen to target, 2 = detonation
        self.target_room = None
        self.start_position = sf.Vector2(0, 0)
        self.to_offscreen_position = sf.Vector2(0, 0)
        self.from_offscreen_position = sf.Vector2(0, 0)
        self.target_position = sf.Vector2(0, 0)
        self.fire_time = 0
        self.hit_time = 0
        self.hit = True # Hit or miss?
        self.hit_shields = False # Hit shields or ship?
        self.active = False
        self.is_mine = False # Does this projectile belong to me? (Client only, used for lock_window stuff)

    def apply_simulation_time(self, time):
        if self.phase == 0:
            start_position = self.start_position
            end_position = self.to_offscreen_position
            interp = (time - self.fire_time)/(1.0) # Half a second to offscreen
            if time > self.fire_time+1.0:
                self.phase = 1
        elif self.phase == 1:
            start_position = self.from_offscreen_position
            end_position = self.target_position
            interp = (time - (self.hit_time-0.7))/(0.7) # Third of a second from offscreen to target
            #if time > self.hit_time:
            #    self.phase = 2
            
        self.sprite.rotation = math.degrees(math.atan2(end_position.y-start_position.y, end_position.x-start_position.x))
        self.sprite.position = start_position + (end_position-start_position)*interp

    def detonate(self):
        if self.hit_shields:
            self.target_room.ship.shield_system.shields -= self.damage
        else:
            self.target_room.ship.hull_points -= self.damage
            if self.target_room.system:
                self.target_room.system.deal_damage(self.damage)
        self.active = False
        self.phase = 2
        self.explosion_sprite.set_frame_loop(0, 8, False)
        self.explosion_sprite.position = self.sprite.position
Пример #2
0
class Weapon:
    def __init__(self, id):
        self.id = id
        self.sprite = SpriteSheet(res.weapon)
        self.sprite.init(12, 12, 0.06)
        self.sprite.set_frame_loop(5, 5, False)

        self.slot = None  # WeaponSlot this weapon is in
        self.position = sf.Vector2(0, 0)

        self.firing = False  # Whether or not it's firing this turn
        self.powered = False  # Is the weapon powered or unpowered
        self.was_powered = False  # Was the weapon powered last turn? (Used for weapon slide out/in animation)
        self.target = None  # Target room

        self.charge = 0

        self.required_charge = 1
        self.required_power = 1  # Power consumption
        self.projectile_type = None
        self.num_shots = 2

        self.projectiles = [Projectile(), Projectile()]

    def apply_simulation_time(self, time):
        if time <= 0.3:  # weapon slide in/out animation
            if self.powered and not self.was_powered:
                self.position = self.slot.position + self.slot.powered_offset * (
                    time / 0.3)
            if not self.powered and self.was_powered:
                self.position = self.slot.position + self.slot.powered_offset - self.slot.powered_offset * (
                    time / 0.3)

        if self.firing:
            for projectile in self.projectiles:
                if time >= projectile.fire_time:
                    if time <= projectile.hit_time:
                        if not projectile.active:
                            self.sprite.set_frame_loop(5, 11, False)
                        projectile.active = True
                    else:
                        if projectile.hit and projectile.active:
                            projectile.detonate()

    def tuplify(self):
        return (self.id, )