From: <cd...@us...> - 2007-04-19 07:45:11
|
Revision: 179 http://eos-game.svn.sourceforge.net/eos-game/?rev=179&view=rev Author: cduncan Date: 2007-04-19 00:45:09 -0700 (Thu, 19 Apr 2007) Log Message: ----------- - Vessel status bars are shown when damage occurs and disappear after 5 seconds. - Status bars appear and disappear using a fade effect - r-shift now shows the status bars, not just shields (which the Rone don't have anyway) Modified Paths: -------------- vessel.py Modified: vessel.py =================================================================== --- vessel.py 2007-04-17 06:51:33 UTC (rev 178) +++ vessel.py 2007-04-19 07:45:09 UTC (rev 179) @@ -32,7 +32,7 @@ turn = 0 # -1 = left, 0 = stop, 1 = right - shield = False + show_status = False weapons = [False] * max_weapons target = None # body being targeted @@ -54,7 +54,7 @@ self.left_maneuver = keystate[K_a] self.right_maneuver = keystate[K_d] self.bw_maneuver = keystate[K_s] or keystate[K_DOWN] - self.shield = keystate[K_RSHIFT] + self.show_status = keystate[K_RSHIFT] self.weapons[0] = keystate[K_SPACE] self.weapons[1] = keystate[K_LSHIFT] @@ -99,6 +99,8 @@ max_energy = 0 energy_storage_mass = 0.02 # Mass per energy unit stored damage_smoke = None + status_fade_time = 300 # status fade out/in speed + status_timeout = 5000 # millis status remains visible control = Control() @@ -121,6 +123,9 @@ self.hull_mass = float(hull_mass) self.crew = int(crew) self.energy = self.max_energy = float(max_energy) + self.last_status = None + self.status_image = None + self.status_time = 0 self.max_speed = float(max_speed) self._sys = [] self._damage_sys = [] @@ -227,6 +232,8 @@ body.RoundBody.update(self) if self.enabled: self.control.update() + if self.control.show_status: + self.show_status() for weapon, ctrl_state in zip(self.weapons, self.control.weapons): weapon.firing = ctrl_state for system in self._sys: @@ -244,36 +251,64 @@ self.image = self.vessel_img.rotated(self.heading) self.rect = self.image.get_rect(center=self.rect.center) - def draw(self, surface): - rect = body.RoundBody.draw(self, surface) - if self.explosion is None: - energy_frac = float(self.energy) / self.max_energy - graph_rect = pygame.Rect(0, 0, 37, 3) - graph_rect.midtop = self.rect.centerx, self.rect.centery + self.radius * 1.5 - graph_bar = pygame.Rect(graph_rect) - health = self.health - graph_bar.width = int(health * graph_bar.width) - if self.health > 0.7: + def draw_status(self): + """Return an image for the vessel status""" + bar_width = 37 + bar_height = 3 + health = self.health + health_bar_width = int(health * bar_width) + energy_bar_width = int(self.energy * bar_width / self.max_energy) + if self.last_status != (health_bar_width, energy_bar_width): + image = pygame.Surface((bar_width, bar_height * 2 + 2), 0, 8) + image.fill((255, 255, 255)) + image.set_colorkey((255, 255, 255)) + # Health bar + if health > 0.7: color = (0, 255, 0) - elif self.health > 0.45: + elif health > 0.45: color = (255, 255, 0) - elif self.health > 0.2: + elif health > 0.2: color = (255, 127, 0) else: color = (255, 0, 0) - surface.fill((0, 0, 0), graph_rect) - surface.fill(color, graph_bar) - pygame.draw.rect(surface, (50, 50, 50), graph_rect, 1) + graph_rect = pygame.Rect(0, 0, bar_width, bar_height) + graph_bar = pygame.Rect(graph_rect) + graph_bar.width = health_bar_width + image.fill((0, 0, 0), graph_rect) + image.fill(color, graph_bar) + pygame.draw.rect(image, (50, 50, 50), graph_rect, 1) + # Energy Bar graph_rect.top = graph_rect.bottom + 1 graph_bar.top = graph_bar.bottom + 1 - graph_bar.width = int(energy_frac * graph_bar.width) - surface.fill((0, 0, 0), graph_rect) - surface.fill((50, 50, 255), graph_bar) - pygame.draw.rect(surface, (0, 0, 125), graph_rect, 1) - return rect.union(graph_rect) + graph_bar.width = energy_bar_width + image.fill((0, 0, 0), graph_rect) + image.fill((50, 50, 255), graph_bar) + pygame.draw.rect(image, (0, 0, 125), graph_rect, 1) + self.status_image = image + self.last_status = health_bar_width, energy_bar_width + return self.status_image + + def draw(self, surface): + rect = body.RoundBody.draw(self, surface) + if game.time <= self.status_time and self.explosion is None: + status_image = self.draw_status() + time = self.status_time - game.time + if time < self.status_fade_time: + # fading out + opacity = 255 * time / self.status_fade_time + elif time - self.status_timeout > self.status_fade_time: + # fading in + time -= self.status_timeout + self.status_fade_time + opacity = 255 * (self.status_fade_time - time) / self.status_fade_time + else: + opacity = 255 + status_image.set_alpha(opacity) + status_rect = status_image.get_rect( + centerx=self.rect.centerx, top=self.rect.centery + self.radius * 1.5) + surface.blit(status_image, status_rect) + return rect.union(status_rect) else: return rect - def add_system(self, system): """Add a vessel system @@ -370,6 +405,14 @@ for system in self: system.disable() + def show_status(self): + time = game.time + if game.time < self.status_time: + # already visible, no fade-in necessary + time -= self.status_fade_time + self.status_time = max( + self.status_time, time + self.status_timeout + self.status_fade_time * 2) + def damage(self, value): """Apply damage to the vessel @@ -391,6 +434,7 @@ 5 """ self.damage_time = game.time + self.show_status() for s in self._damage_sys: value = s.damage(value) if not value: @@ -599,7 +643,7 @@ >>> s.level 1.0 """ - if self.vessel.control.shield: + if self.vessel.control.show_status: self.show_shield() if self.level < self.max_level and self.regeneration and self.enabled: # Regenerate shields This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cd...@us...> - 2007-04-22 19:10:43
|
Revision: 185 http://eos-game.svn.sourceforge.net/eos-game/?rev=185&view=rev Author: cduncan Date: 2007-04-22 12:10:41 -0700 (Sun, 22 Apr 2007) Log Message: ----------- - Systems now repair themselves in the order they were disabled. Each system takes 15 seconds to repair. - Damage to engines no longer reduces top speed, just thrust and energy generation. - Disabling armor stop durability regeneration, though heat dissipation still works (which is a slight advantage over shields which cease all function when disabled) Modified Paths: -------------- vessel.py Modified: vessel.py =================================================================== --- vessel.py 2007-04-22 07:41:22 UTC (rev 184) +++ vessel.py 2007-04-22 19:10:41 UTC (rev 185) @@ -96,6 +96,7 @@ disable_factor = 5 # disabled if damage exceeds this factor * hull_mass system_damage = 0 # System damage accumulator system_damage_threshold = 10 # How much damage to disable a system + system_repair_time = 15000 # Time to repair systems max_speed = 0 max_energy = 0 energy_storage_mass = 0.02 # Mass per energy unit stored @@ -132,6 +133,8 @@ self._damage_sys = [] self.weapons = [] self.set_heading(netsync.random.random() * fullcircle) + self._systems_to_repair = [] + self._repair_time = None self.damage_time = 0 @classmethod @@ -239,6 +242,21 @@ weapon.firing = ctrl_state for system in self._sys: system.update_system() + if self._systems_to_repair: + if self._repair_time is None: + # begin repair of first system in repair list + self._repair_time = game.time + self.system_repair_time + print 'starting repair of', self._systems_to_repair[0] + elif game.time > self._repair_time: + # System repair completed, re-enable it + repaired_system = self._systems_to_repair.pop(0) + repaired_system.enable() + print repaired_system, ' repaired' + self._repair_time = None + elif self.damage_smoke is not None: + # Systems all repaired, no more somke + self.damage_smoke.kill() + self.damage_smoke = None if vector.length(self.velocity) > self.max_speed: # If we are overspeed, bleed off a little overspeed = vector.length(self.velocity) - self.max_speed @@ -452,6 +470,7 @@ while self.system_damage > self.system_damage_threshold: system = netsync.random.choice(self._sys) system.disable() + self._systems_to_repair.append(system) self.system_damage -= self.system_damage_threshold if self.damage_smoke is None and self.vessel_type != 'missile': self.damage_smoke = particle.SmokeTrail(self) @@ -752,26 +771,6 @@ else: return _empty_rect - @property - def enabled(self): - """Only disable if armor is fully depleted - - >>> game.init() - >>> a = Armor(Vessel(), 1, 1) - >>> a.enabled - True - >>> a.durability = 0 - >>> a.enabled - False - """ - return self.durability > 0 - - def disable(self): - pass - - def enable(self): - pass - def update_system(self): """Update heat level @@ -797,7 +796,7 @@ """ if self.heat > 0: self.heat = max(self.heat - self.dissipation / game.fps, 0.0) - if self.regeneration and self.dissipation < self.max_dissipate: + if self.regeneration and self.dissipation < self.max_dissipate and self.enabled: self.dissipation = min( self.dissipation + self.regeneration, self.max_dissipate) @@ -850,8 +849,8 @@ max_turn_rate is in radians per second """ self.vessel = vessel - self.thrust = float(thrust) * 1000 - self.max_turn_rate = float(max_turn_rate) + self.thrust = self.full_thrust = float(thrust) * 1000 + self.max_turn_rate = self.full_turn_rate = float(max_turn_rate) self.enabled = True def disable(self): @@ -860,6 +859,8 @@ self.enabled = False def enable(self): + self.thrust = self.full_thrust + self.max_turn_rate = self.full_turn_rate self.enabled = True def update_system(self): @@ -982,19 +983,20 @@ def __init__(self, vessel, thrust): self.vessel = vessel - self.thrust = float(thrust) * 100 - self.generation = float(thrust) * self.energy_factor + self.thrust = self.full_thrust = float(thrust) * 100 + self.generation = self.full_generation = float(thrust) * self.energy_factor self.mass = self.base_mass + float(thrust) * self.mass_factor self.max_speed = self.vessel.max_speed self.enabled = True def disable(self): - self.max_speed *= 0.75 self.thrust /= 2 self.generation /= 2 self.enabled = False def enable(self): + self.thrust = self.full_thrust + self.generation = self.full_generation self.enabled = True def update_system(self): @@ -1033,7 +1035,7 @@ elif self.vessel.max_speed > self.max_speed: # overspeed, bleed off a little # this avoids a sudden decceleration when we let off boost - self.vessel.max_speed = max(self.vessel.max_speed * 0.98, self.max_speed) + self.vessel.max_speed = max(self.vessel.max_speed * 0.99, self.max_speed) if not boost: self.vessel.energy = min( self.vessel.energy + self.generation / game.fps, self.vessel.max_energy) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cd...@us...> - 2007-05-06 03:27:46
|
Revision: 218 http://eos-game.svn.sourceforge.net/eos-game/?rev=218&view=rev Author: cduncan Date: 2007-05-05 20:27:44 -0700 (Sat, 05 May 2007) Log Message: ----------- Scale armor glow slightly smaller to avoid color "bleed" Modified Paths: -------------- vessel.py Modified: vessel.py =================================================================== --- vessel.py 2007-05-05 17:32:03 UTC (rev 217) +++ vessel.py 2007-05-06 03:27:44 UTC (rev 218) @@ -765,7 +765,7 @@ if self.heat > 0 and self.vessel.explosion is None: image = self.armor_img.rotated(self.vessel.heading) apparent_size, pos = vector.to_screen(self.vessel.position) - image = media.scale_image(image, apparent_size, colorkey=True) + image = media.scale_image(image, apparent_size * 0.99, colorkey=True) rect = image.get_rect(center=self.vessel.rect.center) if self.durability: level = min(self.heat / self.durability, 1.0) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ob...@us...> - 2007-09-24 16:54:11
|
Revision: 263 http://eos-game.svn.sourceforge.net/eos-game/?rev=263&view=rev Author: oberon7 Date: 2007-09-24 09:54:03 -0700 (Mon, 24 Sep 2007) Log Message: ----------- Remote players still need self.control Modified Paths: -------------- vessel.py Modified: vessel.py =================================================================== --- vessel.py 2007-09-24 15:42:34 UTC (rev 262) +++ vessel.py 2007-09-24 16:54:03 UTC (rev 263) @@ -83,7 +83,6 @@ def new_remote_player(cls, *args, **kw): player = cls.new_player(*args, **kw) player.setup_collision(body.foe, body.nothing) - player.control = None return player This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ob...@us...> - 2007-10-02 03:39:08
|
Revision: 275 http://eos-game.svn.sourceforge.net/eos-game/?rev=275&view=rev Author: oberon7 Date: 2007-10-01 20:39:06 -0700 (Mon, 01 Oct 2007) Log Message: ----------- Refactor vessel.Control to use instance variables. Modified Paths: -------------- vessel.py Modified: vessel.py =================================================================== --- vessel.py 2007-10-02 03:29:34 UTC (rev 274) +++ vessel.py 2007-10-02 03:39:06 UTC (rev 275) @@ -27,21 +27,16 @@ class Control: """Static vessel control state""" - thrust = False - fw_maneuver = False - left_maneuver = False - right_maneuver = False - bw_maneuver = False - - turn = 0 # -1 = left, 0 = stop, 1 = right - - show_status = False - weapons = [False] * max_weapons - - target = None # body being targeted - def __init__(self): - weapons = Control.weapons[:] # shallow copy + self.thrust = False + self.fw_maneuver = False + self.left_maneuver = False + self.right_maneuver = False + self.bw_maneuver = False + self.turn = 0 # -1 = left, 0 = stop, 1 = right + self.show_status = False + self.weapons = [False] * max_weapons + self.target = None # body being targeted def update(self): """Update control state""" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cd...@us...> - 2007-10-18 04:57:03
|
Revision: 295 http://eos-game.svn.sourceforge.net/eos-game/?rev=295&view=rev Author: cduncan Date: 2007-10-17 21:57:01 -0700 (Wed, 17 Oct 2007) Log Message: ----------- Remove reference to nonexistent select.png Modified Paths: -------------- vessel.py Modified: vessel.py =================================================================== --- vessel.py 2007-10-18 04:53:54 UTC (rev 294) +++ vessel.py 2007-10-18 04:57:01 UTC (rev 295) @@ -161,7 +161,6 @@ self.radius = self.hull_length self.standoff_distance = float(standoff_distance) body.RoundBody.__init__(self) - self.select_img = media.load_image('select.png') self.vessel_name = vessel_name self.vessel_class = vessel_class self.vessel_type = vessel_type This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cd...@us...> - 2007-11-08 22:47:16
|
Revision: 324 http://eos-game.svn.sourceforge.net/eos-game/?rev=324&view=rev Author: cduncan Date: 2007-11-08 14:47:14 -0800 (Thu, 08 Nov 2007) Log Message: ----------- - Build base level 2 on planets with >5 resource gen - Fix bug in explode() signature in Vessel Modified Paths: -------------- vessel.py Modified: vessel.py =================================================================== --- vessel.py 2007-11-07 08:22:34 UTC (rev 323) +++ vessel.py 2007-11-08 22:47:14 UTC (rev 324) @@ -568,12 +568,12 @@ else: return 0 - def explode(self): + def explode(self, sound='explode.wav'): if self is game.local_player.vessel: game.local_player.vessel = EscapePod(self) game.camera.follow(game.local_player.vessel) media.play_sound('launch.wav') - body.RoundBody.explode(self) + body.RoundBody.explode(self, sound) def kill(self): for system in self._sys: @@ -1249,7 +1249,9 @@ else: import base # Avoid circular imports # Landing cycle complete, build a base - self.planet.base = base.PlanetaryBase(self.planet, game.local_player) + + self.planet.base = base.PlanetaryBase(self.planet, game.local_player, + level=1 + (self.planet.resources >= 5)) message.send_status(self.planet, game.local_player, 'Base esablished on %s' % self.planet.name) self.vessel.kill() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |