def update(self, data, common_data, dt): speed = 0.3 # if doing something that can't be interrupted then countdown to end of it if self.coolDown(data, dt): pass else: if data.health <= 0: self.setState(data, common_data, eStates.dead) return self.setState(data, common_data, eStates.stationary) if rand_num(10) == 0: # self.setState(data, common_data, eStates.stationary) data.vel = Vec3(0, 0, 0) data.cooldown = rand_num(5) / 10.0 + 0.1 else: # chase hero target = common_data.game.requestTarget(common_data.pos) if (target.x < common_data.pos.x): # self.setState(data, common_data, eStates.runLeft) data.vel = Vec3(-speed, 0, 0) data.facing = eDirections.left else: # self.setState(data, common_data, eStates.runRight) data.vel = Vec3(speed, 0, 0) data.facing = eDirections.right if (target.y < common_data.pos.y): data.vel.y = -speed else: data.vel.y = speed if common_data.pos.distSq( Vec3(target.x, target.y, common_data.pos.z)) < 800: data.vel.z = 0 # drop on target elif (common_data.pos.z < 80) and (data.vel.z < 3): data.vel.z += 2 # otherwise flap common_data.entity.graphics.startAnim( data=common_data.entity.graphics_data) data.cooldown = 0.2 if common_data.pos.z > 0: friction(data.vel, 0.01) else: friction(data.vel, 0.1) basic_gravity(data.vel) basic_physics(common_data.pos, data.vel) restrictToArena(common_data.pos, data.vel)
def initEntity(self, entity, data=False): if entity.data: entity.game_pad = entity.data['game_pad'] else: entity.game_pad = False entity.cooldown = -1 entity.vel = Vec3(0.0, 0.0, 0.0) entity.queued_vel = Vec3(0.0, 0.0, 0.0) entity.facing = None entity.queued_facing = 4 entity.state = PacBun.eStates.idle entity.queued_state = entity.state entity.score = 0 entity.invulnerable = False
def update(self, data, common_data, dt): speed = 0.3 # if doing something that can't be interrupted then countdown to end of it if self.coolDown(data, dt): pass else: if data.health <= 0: self.setState(data, common_data, px_entity.eStates.dead) return self.setState(data, common_data, px_entity.eStates.stationary) if rand_num(10)==0: # self.setState(data, common_data, eStates.stationary) data.vel = Vec3(0,0,0) data.cooldown = rand_num(10)/8.0+0.3 else: # chase hero target = common_data.game.requestTarget(common_data.pos) if(target.x<common_data.pos.x): # self.setState(data, common_data, eStates.runLeft) data.vel = Vec3(-speed, 0, 0) data.facing = px_entity.eDirections.left else: # self.setState(data, common_data, eStates.runRight) data.vel = Vec3(speed, 0, 0) data.facing = px_entity.eDirections.right if(target.z<common_data.pos.z): data.vel.z = -speed else: data.vel.z = speed if common_data.pos.distSq(Vec3(target.x,target.y,common_data.pos.y))<800: data.vel.y = 0 # drop on target elif (common_data.pos.z<80) and (data.vel.z<3): data.vel.y += 2 # otherwise flap # common_data.entity.graphics.startAnim(data = common_data.entity.graphics_data) self.setState(data, common_data, px_entity.eStates.stationary, force_new_state=True) common_data.entity.sounds.playEvent(data, common_data, eEvents.flap) data.cooldown = 0.2 if common_data.pos.y>0: px_controller.friction(data.vel, 0.01) else: px_controller.friction(data.vel, 0.1) px_controller.basic_gravity(data.vel) px_controller.basic_physics(common_data.pos, data.vel) background.restrictToArena(common_data.pos, data.vel)
def restrictToArena(pos, vel): # stop running through walls at either side # if pos on left side of line then force to right side while pos.whichSidePlane(px_vector.Plane(1, 0, -1, 0)): px_controller.basic_physics(pos, Vec3(0.1, 0, -0.1)) # normal vector to plane # stop running through walls at either side # if pos on left side of line then force to right side while not pos.whichSidePlane(px_vector.Plane(1, 0, 1, -320)): px_controller.basic_physics(pos, Vec3(-0.1, 0, -0.1)) # normal vector to plane # stop running off screen bottom, top and sides pos.clamp(Vec3(0, 0, 0), Vec3(320, 200, 60))
def initEntity(self, entity, data=False): # values for each instance entity.cooldown = -1 entity.pause = 7 entity.vel = Vec3(0.0,0.0,0.0) entity.queued_vel = Vec3(0.0,0.0,0.0) entity.facing = False entity.queued_facing = 4 entity.health = 3 entity.state = PacBun.eStates.idle entity.queued_state = entity.state entity.AI_cooldown = 1 + px_vector.rand_num(15) / 5. entity.type = data['type'] entity.fox_speed = 1
def __init__(self, name, game, graphics=False, sounds=False, controller=False, collider=False, init=False, parent=False, data=False): self.data = data # note this is done first so things like init can use the data self.game = game self.name = name self.pos = Vec3(0, 0, 0) self.state = eStates.idle self.new_state = True self.blink = False self.parent = parent self.components = {} for type in [ ['graphics', graphics], ['sounds', sounds], ['controller', controller], ['collider', collider], ]: if type[1]: self.components[type[0]] = type[1] type[1].initEntity(self, data) if init: # px_log.log(f"Init entity: {name} code: {init}") # execute init exec(init, globals(), locals())
def shoot( self, data, common_data, flippedX=False, ): arrow = self.game.requestNewEntity(entity_template=self.arrow_t, pos=common_data.pos + Vec3(-5 if flippedX else 5, 20, 0), parent=common_data.entity, name="Goblin archer arrow") arrow.collider_data.force = 0 #Vec3(-1 if flippedX else 1,0,0) arrow.collider_data.hero_damage = 1 arrow.common_data.state = (px_entity.eStates.runLeft if flippedX else px_entity.eStates.runRight) arrow.controller_data.vel = Vec3(-7 if flippedX else 7, 1, 0)
def requestNewEnemy(self, entity_template, pos=Vec3(0, 0, 0), parent=False, name=False): self.num_monsters += 1 self.requestNewEntity(entity_template, pos, parent, name)
def director_drake_blue(game): return [ Message("Drake Blue Games presents...", Vec3(240, 180, 0), Color(0.8, 0.75, 1.0, 1.0), -1, px_graphics.eAlign.centre), Delay(2), MakeDirector('fade_to_mode', 'title'), ]
def __init__(self, source, damage=0, damage_hero=0, force=Vec3(0,0,0), absorb=0, impassable=False): self.source = source self.damage = damage self.absorb = absorb self.damage_hero = damage_hero self.force = force self.absorb = absorb self.impassable = impassable
def getCollisionMessage(self, data, common_data): if common_data.entity.controller_data.health > 0: return (px_collision.Message(source=common_data.entity, damage=0, damage_hero=1, force=Vec3(0, 0, 0))) else: return (px_collision.Message(source=common_data.entity))
def director_bunny_select(game): return [ SetRenderLayerColor('game', Color(0, 0, 0, 0)), SetRenderLayerColor('overlay', Color(0, 0, 0, 0)), FadeToClearColor(Color.fromInts(0, 0, 0), 1), Message("Choose your bunny:", Vec3(240, 220, 0), Color(1, 1, 1, 1), -1, px_graphics.eAlign.centre), MakeEntity('pacbun choose', data={ 'pos': Vec3(210, 160, 0), 'parent': 'bunny choice', 'bun num': 0, 'bun name': 'Pac-Bun', 'message color': px_graphics.Color(1, 1, 0, 1), }), MakeEntity('pinkie choose', data={ 'pos': Vec3(230, 160, 0), 'parent': 'bunny choice', 'bun num': 1, 'bun name': 'Pinkie', 'message color': px_graphics.Color(1, 0.8, 0.8, 1), }), MakeEntity('blue choose', data={ 'pos': Vec3(250, 160, 0), 'parent': 'bunny choice', 'bun num': 2, 'bun name': 'Blue', 'message color': px_graphics.Color(0.5, 0.5, 1.0, 1), }), MakeEntity('bowie choose', data={ 'pos': Vec3(270, 160, 0), 'parent': 'bunny choice', 'bun num': 3, 'bun name': 'Bowie', 'message color': px_graphics.Color(1, 1, 1.0, 1), }), FadeRenderLayer('overlay', Color(1, 1, 1, 1), 1), FadeRenderLayer('game', Color(1, 1, 1, 1), 1), WaitForFlag('next_scene'), MakeDirector('fade_to_mode', 'play') ]
def __init__(self, game, data): super(HeroController, self).__init__(game) # values global to all heroes self.invincible_states = (eStates.dead, eStates.fallLeft, eStates.fallRight, eStates.dead) hit_controller = self.game.controller_manager.makeTemplate({"Template": HitController}) hit_collider = self.game.collision_manager.makeTemplate({"Template": HitCollider}) hit_t = self.game.entity_manager.makeEntityTemplate(graphics=False, controller=hit_controller, collider=hit_collider) # cool downs in seconds self.strikes = [ # cool del range force damage Strike(0.8, 0.2, Vec3(24, 0, 0), 3, 2, template=hit_t), # big Strike(0.8, 0.4, Vec3(8, 0, 30), 2, 2, template=hit_t), # big_up Strike(0.3, 0.1, Vec3(12, 0, 0), 1, 1, template=hit_t), # small Strike(0.3, 0.2, Vec3(18, 0, 0), 2, 0, template=hit_t), # block ]
def __init__(self, common_data, init=False): if init: self.game_pad = init.game_pad else: self.game_pad = False self.vel = Vec3(0.0,-3.0,0.0) self.cooldown = -1 common_data.state = eRainStates.state_fall common_data.new_state = False
def __init__(self, common_data, init=False): if init: pass else: pass self.cooldown = 0 self.health = 5 self.vel = Vec3(0,0,0) self.mass = 4 self.facing = px_entity.eDirections.left
def strike(self, data, common_data, strike, flippedX=False, name="unknown strike" ): strike_ent = self.game.requestNewEntity(entity_template=strike.template, pos=common_data.pos +(strike.range.flippedX() if flippedX else strike.range), parent=common_data.entity, name=name) strike_ent.collider_data.force = Vec3(-strike.force if flippedX else strike.force,0,0) strike_ent.collider_data.damage = strike.damage
def __init__(self, common_data, init=False): if init: pass else: pass self.cooldown = 0 self.health = 5 self.vel = Vec3(0, 0, 0) self.mass = 4 self.facingleft = True self.fired = False
def __init__(self, common_data, init=False): if init: self.game_pad = init.game_pad else: self.game_pad = False self.vel = Vec3(0.0,0.0,0.0) self.feed = False self.cooldown = 0 self.faceleft = False common_data.state = DuckStates.stationary
def receiveCollision(self, this_entity, message): data = this_entity.controller_data common_data = this_entity.common_data if message: if not (common_data.state == eStates.fallRight or common_data.state == eStates.fallLeft): # if message.source.common_data.name !="Reaper": # log("Reaper hit by " + message.source.common_data.name) if message.absorb > 2: data.vel = Vec3(0, 0, 0) + message.force / data.mass else: data.vel = data.vel + message.force / data.mass
def director_quit(game): bunnies = game.game_data['bunnies'] return [ FadeToClearColor(Color(0, 0, 0), 1), SetRenderLayerColor('game', Color(0, 0, 0, 0)), SetRenderLayerColor('overlay', Color(0, 0, 0, 0)), FadeRenderLayer('game', Color(1, 1, 1, 1), 0.5), FadeRenderLayer('overlay', Color(1, 1, 1, 1), 0.5), Message("Goodbye and thank you for playing", Vec3(240, 165, 0), bunnies['pacbun'].color, 3, px_graphics.eAlign.centre), Message("with me and my friends.", Vec3(240, 150, 0), bunnies['pacbun'].color, 3, px_graphics.eAlign.centre), MakeEntity(template='pacbun bye', name='pacbun', pos=Vec3(240, 115, 1), parent=game), MakeEntity(template='pinkie bye', name='pinkie', pos=Vec3(221, 89, 1), parent=game), MakeEntity(template='blue bye', name='blue', pos=Vec3(236, 85, 1), parent=game), MakeEntity(template='bowie bye', name='bowie', pos=Vec3(252, 86, 1), parent=game), Delay(2), FadeRenderLayer('game', Color(0, 0, 0, 0), 1), FadeRenderLayer('overlay', Color(0, 0, 0, 0), 1), Delay(2), Quit() ]
def __init__(self, ren): self.ren = ren self.images = [] self.drawables = [] self.origin = Vec3(0, 0, 0) self.font_manager = px_text.FontManager(self.ren) self.default_font = 0 # Color cast used for fading and other effects self.color_cast = Color(1, 1, 1, 1)
def __init__(self, common_data, init=False): if init: pass else: pass self.cooldown = -1 self.health = 10 self.vel = Vec3(0, 0, 0) self.mass = 3 self.facing = px_entity.eDirections.right common_data.state = px_entity.eStates.stationary common_data.new_state = False
def update(self, data, common_data, dt): speed = 0.3 # if doing something that can't be interrupted then countdown to end of it if self.coolDown(data, dt): pass else: if data.health <= 0: self.setState(data, common_data, eStates.dead) return if rand_num(10) == 0: self.setState(data, common_data, eStates.stationary) data.vel = Vec3(0, 0, 0) data.cooldown = rand_num(1) + 2 else: # chase hero target = common_data.game.requestTarget(common_data.pos) if (target.x < common_data.pos.x): self.setState(data, common_data, eStates.runLeft) data.vel = Vec3(-speed, 0, 0) data.facing = eDirections.left else: self.setState(data, common_data, eStates.runRight) data.vel = Vec3(speed, 0, 0) data.facing = eDirections.right if (target.y < common_data.pos.y): data.vel.y = -speed else: data.vel.y = speed data.cooldown = 0.5 basic_physics(common_data.pos, data.vel) restrictToArena(common_data.pos, data.vel) friction(data.vel)
def director_high_scores(game): return [ FadeToClearColor(Color(0, 0, 0), 2), FadeRenderLayer('overlay', Color(1, 1, 1, 1), 1), Delay(1), Message("Best", Vec3(207, 260, 0), Color(1, 1, 0, 1), -1, px_graphics.eAlign.left), MakeEntity(template='high_scores', name='high scores', pos=Vec3(240, 250, 50), parent=game, init="import high_score\n" "high_score.init(self)"), Delay(0.8), Message("est", Vec3(230, 260, 0), Color(0, 1, 1, 1), -1, px_graphics.eAlign.left), Delay(0.8), Message("Buns", Vec3(250, 260, 0), Color(1, 0, 1, 1), -1, px_graphics.eAlign.left), Delay(3), # FadeRenderLayer('overlay', Color(0,0,0,0),1), # Delay(1), MakeDirector('fade_to_next_scene') ]
def update(self, data, common_data, dt): # deal with things that can interrupt actions e.g. landing if common_data.pos.y <= 0: # on the ground self.setState(data, common_data, self.state_pool, self.pool_cooldown) data.vel = Vec3(0, 0, 0) else: # falling pass # deal with things that can't interrupt actions that are already happening if not self.coolDown(data, dt): if common_data.state == Controller.state_pool: self.setState(data, common_data, eStates.dead) px_controller.basic_physics(common_data.pos, data.vel)
def __init__(self, common_data, init=False): if init: self.game_pad = init.game_pad else: self.game_pad = False self.cooldown = -1 self.vel = Vec3(0.0,0.0,0.0) self.mass = 1 self.jump = False self.attack = False self.facing = eDirections.down self.health = 3 common_data.state = eStates.standDown self.invincible_cooldown = 2 self.invincible = self.invincible_cooldown self.hero_struck=[] for s in range(0,eStrikes.num_strikes): self.hero_struck.append(False)
def strike( self, data, common_data, strike, flippedX=False, ): strike_ent = self.game.requestNewEntity( entity_template=strike.template, pos=common_data.pos + (strike.range.flippedX() if flippedX else strike.range), parent=common_data.entity, name="Hero strike") strike_ent.collider_data.force = Vec3( -strike.force if flippedX else strike.force, 0, 0) strike_ent.collider_data.absorb = strike.absorb strike_ent.collider_data.damage = strike.damage strike_ent.collider_data.dim = strike.dim strike_ent.collider_data.orig = strike.orig strike_ent.controller_data.cooldown = strike.duration
def update(self, entity, dt): # check if currently chosen bunny # bunny_choice = entity.game.getEntityByName('bunny choice') # if bunny_choice.controller_data.current_bun[0]==0: # print("Pacbun!") if entity.game.current_bun[0] == entity.bun_num: if entity.state != PacBun.eStates.runDown: self.setState(entity, PacBun.eStates.runDown) entity.message = entity.game.message( text=entity.bun_name, pos=entity.pos + Vec3(0, 40, 0), color=entity.message_color, duration=-1, align=px_graphics.eAlign.centre, fade_speed=0.5) else: self.setState(entity, PacBun.eStates.idle) if entity.message: entity.message.process('fade out', [0.5])
def director_title(game): bunnies = game.game_data['bunnies'] return [ SetRenderLayerColor('overlay', Color(0, 0, 0, 0)), SetRenderLayerColor('game', Color(0, 0, 0, 0)), FadeToClearColor(Color(0, 0, 0), 1), Delay(1), MakeEntity(template='title', name='title', pos=Vec3(240, 185, 0), parent=game), MakeEntity(template='pacbun bye', name='pacbun', pos=Vec3(230, 138, 1), parent=game), MakeEntity(template='pinkie bye', name='pinkie', pos=Vec3(210, 138, 1), parent=game), MakeEntity(template='blue bye', name='blue', pos=Vec3(250, 138, 1), parent=game), MakeEntity(template='bowie bye', name='bowie', pos=Vec3(270, 138, 1), parent=game), FadeRenderLayer('overlay', Color(1, 1, 1, 1), 1), FadeRenderLayer('game', Color(1, 1, 1, 1), 1), Delay(2), Message("Press Space to play", Vec3(240, 110, 0), bunnies['pacbun'].color, -1, px_graphics.eAlign.centre), Delay(1), Message("(Esc to exit)", Vec3(240, 90, 0), bunnies['pacbun'].color, -1, px_graphics.eAlign.centre), Delay(5), # FadeRenderLayer('overlay', Color(0,0,0,0),1), # Delay(1), MakeDirector('fade_to_next_scene') ]
def __init__(self): # do bare minimum to set up # most set up is in first update # this way I can restart the game super(BiscuitBattle, self).__init__("Biscuit Battle", res_x=1920, res_y=1080, zoom=1, fullscreen=False) ############################### # set up background and title # ############################### backgraphics = self.graphics_manager.makeTemplate( backgroundGraphics(self.renlayer)) backcontroller = self.controller_manager.makeTemplate({ "Template": BackgroundController, "Lines": [ Line(Vec3(0, 0, 0), Vec3(1920, 0, 0)), Line(Vec3(0, 1080, 0), Vec3(1920, 1080, 0)), Line(Vec3(0, 0, 0), Vec3(0, 1080, 0)), Line(Vec3(1920, 0, 0), Vec3(1920, 1080, 0)), ], }) back_t = self.entity_manager.makeEntityTemplate( graphics=backgraphics, controller=backcontroller) back = self.entity_manager.makeEntity(back_t) back.setPos(Vec3(0.0, 64.0, 0.0)) self.drawables.append(back) title_graphics = self.graphics_manager.makeTemplate( titleGraphics(self.renlayer)) title_controller = self.controller_manager.makeTemplate( {"Template": TitleController}) self.title_t = self.entity_manager.makeEntityTemplate( graphics=title_graphics, controller=title_controller) self.title = self.requestNewEntity(entity_template=self.title_t, pos=Vec3(48, 50, 145), parent=self, name="Title") self.title.setGamePad(self.input.getGamePad(0)) self.raining = False self.setGameMode(eGameModes.title) self.collision_manager = CollisionManager( game=self ) # TODO: should this be a ComponentManager() like the others? ################### # make components # ################### # Graphics Templates bat_graphics = self.graphics_manager.makeTemplate( batGraphics(self.renlayer)) reaper_graphics = self.graphics_manager.makeTemplate( reaperGraphics(self.renlayer)) raingraphics = self.graphics_manager.makeTemplate( rainGraphics(self.renlayer)) herographics = self.graphics_manager.makeTemplate( heroGraphics(self.renlayer)) heartgraphics = self.graphics_manager.makeTemplate( heartGraphics(self.renlayer)) # Controller Templates raincontroller = self.controller_manager.makeTemplate( {"Template": RainController}) herocontroller = self.controller_manager.makeTemplate( {"Template": HeroController}) bat_controller = self.controller_manager.makeTemplate( {"Template": BatController}) reaper_controller = self.controller_manager.makeTemplate( {"Template": ReaperController}) heart_controller = self.controller_manager.makeTemplate( {"Template": HeartIndicatorController}) # Collider Templates hero_collider = self.collision_manager.makeTemplate( {"Template": HeroCollider}) bat_collider = self.collision_manager.makeTemplate( {"Template": BatCollider}) reaper_collider = self.collision_manager.makeTemplate( {"Template": ReaperCollider}) ######################################### # Make entity templates from components # ######################################### self.bat_t = self.entity_manager.makeEntityTemplate( graphics=bat_graphics, controller=bat_controller, collider=bat_collider) self.reaper_t = self.entity_manager.makeEntityTemplate( graphics=reaper_graphics, controller=reaper_controller, collider=reaper_collider) self.rain_t = self.entity_manager.makeEntityTemplate( graphics=raingraphics, controller=raincontroller) self.hero_t = self.entity_manager.makeEntityTemplate( graphics=herographics, controller=herocontroller, collider=hero_collider) # info bar self.heart_t = self.entity_manager.makeEntityTemplate( graphics=heartgraphics, controller=heart_controller) # director director_controller = self.controller_manager.makeTemplate( {"Template": DirectorController}) self.director_t = self.entity_manager.makeEntityTemplate( controller=director_controller)