def MorphState(self): self.Animate( ('blank',), loop=False) self.morph_trail = [] X = math.pi*2 #I know this value is way too big, but it seems to fit for some reason... self.boosting = False self.boostticks = 0 #self.CheckBallObstructions() #self.CheckObstructions() self.checkslopes = True while True: self.ticks += 1 #self.morph_base.Update() #self.morph_overlay.Update() if self.boosting: max_morph_vx = 8.0 #boost speed! max_morph_vy = 8.0 morph_friction = self.morph_friction morph_accel = 0.0 air_accel = 0.0 morph_airfriction = self.morph_airfriction * 6 if abs(self.vx) <= 2.0: #need to f*****g find a better way around this for falling vertically... vector perhaps? self.boosting = False #self.boostticks -= 1 #if self.boostticks == 0: # self.boosting = False else: max_morph_vx = self.max_morph_vx #standard max speed max_morph_vy = self.max_morph_vy morph_friction = self.morph_friction morph_accel = self.morph_accel air_accel = self.air_accel morph_airfriction = self.morph_airfriction #just bomb jumped, and falling again, so check for slopes again. if self.bombjumping == True and self.vy >=0: self.checkslopes = True self.bombjumping = False if self.ticks % 2 == 0: #cheap hack to make the trail longer without so many samples self.morph_trail.append( (self.x+9, self.y+25) ) #center of morphball if len(self.morph_trail) > self.max_trail_len: self.morph_trail = self.morph_trail[1:] #keep list at most len items long if "up" in self.pressed and not self.ceiling and not self.boosting: #gonna need to edit this mad style, to check for a cieling within 16 pixels. #also check for floor and set to fall state if appropriate self.state = self.CrouchState self.morph_trail = [] #self.y-=16 if self.floor: self.vy = 0 if "left" in self.pos and not self.left_wall: if abs(self.vx) < max_morph_vx: self.vx-=morph_accel if self.vx < -max_morph_vx: self.vx = -max_morph_vx self.direction = Dir.LEFT if self.vx > 0 or abs(self.vx) > self.max_morph_vx: self.vx = vecmath.decrease_magnitude(self.vx, morph_friction) elif "right" in self.pos and not self.right_wall: if abs(self.vx) < max_morph_vx: self.vx+=morph_accel if self.vx > max_morph_vx: self.vx = max_morph_vx self.direction = Dir.RIGHT if self.vx < 0 or abs(self.vx) > self.max_morph_vx: self.vx = vecmath.decrease_magnitude(self.vx, morph_friction) else: self.vx = vecmath.decrease_magnitude(self.vx, morph_friction) else: self.vy += self.gravity if self.vy > max_morph_vy: self.vy = max_morph_vy if "left" in self.pos and not self.left_wall: self.vx -= air_accel if self.vx < -max_morph_vx: self.vx = -max_morph_vx self.direction = Dir.LEFT elif "right" in self.pos and not self.right_wall: self.vx += air_accel if self.vx > max_morph_vx: self.vx = max_morph_vx self.direction = Dir.RIGHT else: self.vx = vecmath.decrease_magnitude(self.vx, morph_airfriction) if "boost" in self.pos: if self.morph_boost < 100: self.morph_boost += 2 elif self.morph_boost > 32: #boost! terribly hacky self.boosting = True self.vx = self.vx * (2.5*self.morph_boost/100.0) self.vy = self.vy * (1.5*self.morph_boost/100.0) self.morph_boost = 0 #self.boostticks = 20 max_morph_vx = max_morph_vy = 8.0 self.vx = vecmath.clamp(self.vx, -max_morph_vx, max_morph_vx) self.vy = vecmath.clamp(self.vy, -max_morph_vy, max_morph_vy) self.morph_angle = (self.morph_angle + self.vx * X) yield None
def Input(self, position, pressed): #essentially Update() now. self.pos = position self.pressed = pressed if self.fire_delay > 0: self.fire_delay -= 1 #Missile HOLD button. if "missile_hold" in position: self.missile_held = True if self.sec_armed == False: if self.cur_state in self.morph_states and self.equipment["Power Bombs"].cur > 0: self.sec_armed = True elif self.cur_state not in self.morph_states and self.equipment[("Missiles", "Super Missiles")[self.cur_missile]].cur > 0: self.sec_armed = True elif self.sec_armed and self.missile_held: self.sec_armed = False self.missile_held = False #Item stuff depending on missile_style. if controls.missile_style == 0: #Dual style. if "beam_select" in pressed: self.ChangeBeam() elif "weapon_select" in pressed: self.ChangeMissile() if "fire" in pressed: print "Fire main weapon" self.FireMain() elif "fire_missile" in pressed: self.sec_armed = True self.FireSecondary() else: #Swap style. if "beam_select" in pressed: if self.cur_type == 0: #Change beam. self.ChangeBeam() else: self.ChangeMissile() elif "weapon_select" in pressed: #Change between beam and missile. self.cur_type = (self.cur_type + 1) % 2 if "fire" in pressed: if self.cur_type == 0: self.FireMain() else: self.sec_armed = True self.FireSecondary() elif "fire_missile" in pressed: if self.cur_type == 0: self.sec_armed = True self.FireSecondary() else: self.FireMain() if self.checkslopes: if not self.CheckSlopes(): self.CheckObstructions() else: self.CheckObstructions() if self.cur_state not in self.morph_states: self.vx = vecmath.clamp(self.vx, -self.max_vx, self.max_vx) self.vy = vecmath.clamp(self.vy, -100, self.max_vy) #-100 so WIP can sleep. #HACK for getting into morph ball tunnels. surprisingly, it works! #optimisation: #should only check for whether it'll pass through a tile position... tunnelled = False temp = -1 if self.cur_state in self.morph_states: if self.right_wall and "right" in position: temp = self.y self.y = int(self.y) for y in range(3): self.y += 1 if not self.CheckWall(Dir.RIGHT): self.y+=1 if self.CheckWall(Dir.RIGHT): #ensure the passage is *just* big enough self.x+=2 tunnelled = True self.y -= 1 break elif self.left_wall and "left" in position: temp = self.y self.y = int(self.y) for i in range(3): self.y += 1 if not self.CheckWall(Dir.LEFT): self.y+=1 if self.CheckWall(Dir.LEFT): #ensure the passage is *just* big enough self.x-=2 tunnelled = True self.y-=1 break if not tunnelled: if temp != -1: self.y = temp self.x += self.vx self.y += self.vy if self.platform is not None: if self.platform in self.detect_collision(): self.x += self.platform.vx self.y += self.platform.vy else: self.platform = None self.sprite.x = int(self.x) self.sprite.y = int(self.y) self.state__() self.animation()