def rect_platform_3d(ciao): e = Entity() outline = ciao['poly'] height = ciao.get('height', 1.0) y = ciao.get('y', 0.0) top_tex = ciao.get('top') side_tex = ciao.get('side') collision_tag = ciao.get('collision_tag', 0) shape = sh3d.Prism(shape=sh.Poly(outline=outline), height=height, walls=ciao.get('walls', [])) if top_tex and side_tex: e.model = { 'type': 'model.prism', 'repeat': ciao['repeat'], 'poly': outline, 'top': top_tex, 'side': side_tex, 'height': height, 'offset': [0, height, 0] } # e.add_component(comp.ShapeGfxColor(shape=shape, color=color)) e.add_component( Collider(shape=shape, flag=2, mask=0, tag=collision_tag, debug=True)) return e
def hotspot(key, desc): pos = desc.get('pos') size = desc.get('size') on_enter = desc.get('on_enter') on_leave = desc.get('on_leave') on_click = desc.get('on_click') on_enter_f = None on_click_f = None on_leave_f = None if on_enter: on_enter_args = desc.get('on_enter_args', []) on_enter_f = on_enter_hotspot(on_enter, on_enter_args) if on_click: on_click_args = desc.get('on_click_args', []) on_click_args.insert(0, key) on_click_f = on_click_hotspot(on_click, on_click_args) if on_leave: on_leave_args = desc.get('on_leave_args', []) on_leave_f = on_enter_hotspot(on_leave, on_leave_args) #on_enter_f = getattr(mopy.monkey.engine.data.scripts, on_enter) if on_enter else None #on_leave_f = getattr(mopy.monkey.engine.data.scripts, on_leave) if on_leave else None #on_click_f = getattr(mopy.monkey.engine.data.scripts, on_click) if on_click else None s = Entity(pos=pos) s.add_component( HotSpot(shape=Rect(width=size[0], height=size[1]), onclick=on_click_f, onenter=on_enter_f, onleave=on_leave_f)) return s
def map_room(desc: dict): room = ScummRoom(desc) room.add_runner(Scheduler()) # read world size width = desc['width'] height = desc['height'] device_size = mopy.monkey.engine.device_size cam_width = device_size[0] cam_height = device_size[1] # # add the main node room.default_item = 'main' main = Entity(tag='main') main.camera = OrthoCamera(width, height, cam_width, cam_height, [0, 0, cam_width, cam_height], tag='maincam') main.add_component(HotSpotManager(lmbclick=walk_to)) room.add(main) # add static items room.add_items(desc) # add dynamic items room.load_dynamic_items() return room
def box(args): color = args['color'] size = args['size'] pos = args['pos'] mass = args['mass'] color = utils.hex_to_rgb(color) half_size = [size[0] * 0.5, size[1] * 0.5, size[2] * 0.5] e = Entity() e.auto_pos = True e.model = { 'type': 'model.box3D_color', 'color': [color[0], color[1], color[2], 1], 'size': size, 'offset': [-half_size[0], -half_size[1], -half_size[2]] } e.components = [{ 'type': 'bullet.rigid_body', 'pos': pos, 'mass': mass, 'shape': { 'type': 'bullet.box', 'size': half_size } }] return e
def dir_light(ciao): e = Entity() e.add_component({ 'type': 'light.directional', 'ambient': ciao.get('ambient'), 'diffuse': ciao.get('diffuse'), 'direction': ciao.get('direction') }) return e
def foe(args): gl = mopy.monkey.engine.data.globals e = Entity() e.model = args['model'] size = args['size'] max_speed = args['max_speed'] gravity, jump_speed = utils.compute_gravity( monkey.engine.data.globals.jump_height, monkey.engine.data.globals.time_to_jump_apex) flip_on_edge = args.get('flip_on_edge', False) e.add_component({ 'type': 'components.smart_collider', 'tag': gl.CollisionTags.foe, 'flag': gl.CollisionFlags.foe, 'mask': gl.CollisionFlags.player, 'debug': True }) e.components.append({ 'type': 'components.controller2D', 'size': [size[0], size[1], 0], 'offset': [0, size[1] * 0.5, 0], 'mask_up': 2, 'mask_down': 2 | 32, 'debug': True }) e.components.append({'type': 'components.dynamics'}) e.components.append({ 'type': 'components.state_machine', 'initial_state': 'walk', 'states': [{ 'id': 'walk', 'type': 'state.npc_walk', 'max_speed': max_speed, 'jump_speed': jump_speed, 'gravity': gravity, 'jump_up_anim': 'walk', 'jump_down_anim': 'walk', 'direction': args.get('direction', -1), 'flip_on_edge': flip_on_edge }, { 'id': 'dead', 'type': 'state.npc_walk', 'max_speed': 0, 'jump_speed': jump_speed, 'gravity': gravity, 'walk': 'dead', 'walk_anim': 'dead', 'jump_up_anim': 'dead', 'jump_down_anim': 'dead' }] }) return e
def moving_platform(args): e = Entity() gl = mopy.monkey.engine.data.globals width = args.get('width') points = args.get('points') points = [x * 16 for x in points] speed = args.get('speed') e.model = { 'type': 'model.tiled', 'tex': 'gfx/wbml.png', 'img_tile_size': [16, 16], 'tile_size': [16, 16], 'size': [width, 1], 'data': [0, 9] * width } e.add_component(Platform()) e.add_component( Collider(debug=True, flag=gl.CollisionFlags.platform_passthrough, mask=gl.CollisionFlags.player, tag=0, shape=sh.Line(a=[0, 16, 0], b=[width * 16, 16, 0]))) e.add_component(PolygonalMover(points=points, speed=speed, mode=1)) #e.add_component(comp.PolygonalMover(origin=(pos[0],pos[1]), loop=args[6], pct=args[4], moves=[ # {'delta': [0, args[5]*vars.tile_size], 'speed': args[7], 'hold': 0}])) return e
def coin(args): e = Entity() e.model = args.get('model', 'sprites.pickupcoin') e.add_component({ 'type': 'components.smart_collider', 'tag': data.CollisionTags.pickup_coin, 'flag': data.CollisionFlags.foe, 'mask': data.CollisionFlags.player, 'debug': True }) return e
def trap(key, desc): pos = desc.get('pos') s = Entity(pos=pos) s.tag = key size = desc.get('size') s.add_component( Collider(flag=2, mask=1, tag=2, shape=Rect(size[0], size[1]), debug=True)) return s
def bg(data): e = Entity() if 'image' in data: e.model = { 'type': 'model.rect', 'tex': data['image'], 'scale': data.get('scale', (1, 1)), 'repeat': data.get('repeat', (1, 1)), } else: e.model = data['model'] e.layer = data.get('layer', 0) return e
def f(): aa = mopy.monkey.engine.read(msg_id) id = example.get('main').add( Text(font='sprites.mario_font', size=8, text=aa, color=[0, 0, 0, 0], maxwidth=160, align=TextAlignment.center, pos=[96, 132, 1.01])) text_size = example.getById(id).getTextSize() tw = (text_size[2] - text_size[0]) th = (text_size[3] - text_size[1]) width = math.ceil(tw / 8.0) height = math.ceil(th / 8.0) data = [22, 8] data.extend([23, 8] * width) data.extend([24, 8]) md = [22, 7] md.extend([23, 7] * width) md.extend([24, 7]) data.extend(md * height) data.extend([22, 6]) data.extend([23, 6] * width) data.extend([24, 6]) e = Entity(tag='msg_wrap') e.model = { 'type': 'model.tiled', 'tex': 'gfx/wbml.png', 'img_tile_size': [8, 8], 'tile_size': [8, 8], 'size': [width + 2, height + 2], 'data': data } e.pos = [96 - 0.5 * tw - 8, 132 - 0.5 * th - 8, 1] example.get('main').add(e) #s = Script() #acts=[] #print('positioned ' + str(text_size)) id1 = example.get('main').add( Text(tag='ciaone', font='sprites.mario_font', size=8, text='', mode=1, color=[255, 255, 255, 255], shade_color=(255, 0, 0, 255), maxwidth=160, align=TextAlignment.top_left, pos=[96 - 0.5 * tw, 132 + 0.5 * th, 1.02]))
def setup_bar(): ra = mopy.monkey.engine.room_args gl = mopy.monkey.engine.data.globals bonus_left = Entity() bonus_left.model = gl.bonus_list[ra[0]]['gfx'] bonus_left.pos = (2.5*16, 10.2*16, 0.11) example.get('main').add(bonus_left) bonus_right = Entity() bonus_right.model = gl.bonus_list[ra[2]]['gfx'] bonus_right.pos = (9.5*16, 10.2*16, 0.11) example.get('main').add(bonus_right) from wbml.data.actions import WBM # check if player has enough gold to buy items min_cost = min(int(ra[1]), int(ra[3])) if gl.gold < min_cost: s = Script() s.seq([WBM('$msg/8'), act.ChangeRoom('citywl')]) example.play(s) else: mopy.monkey.engine.data.globals.pos = [(2, 7.625, 0.1), (5.25, 7.625, 0.1), (9.5, 7.625, 0.1)] mopy.monkey.engine.data.globals.cpos = 1 s = Script() s.seq([WBM('$msg/5')]) example.play(s)
def sitem(key, desc): eng = mopy.monkey.engine data = eng.data cio = desc.get('create_if_owned', False) if (not cio) and key in data.globals.inventory: # item is in inventory. don't create it return None pos = desc.get('pos') model = desc.get('model', None) s = None if model: anim = desc.get('anim', None) s = Sprite(model=model, pos=pos, anim=anim) else: s = Entity(pos=pos) s.tag = key # if a size is provided, add a hotspot size = desc.get('size', None) if size: print('size is ' + str(size)) s.add_component( HotSpot(shape=Rect(width=size[0], height=size[1]), onclick=run_action_sci())) cbox = desc.get('collision', None) if cbox: add_collision_box(s, cbox) return s
def line_platform(ciao): e = Entity() tile_size = getattr(monkey.engine.data.globals, 'tile_size', [1, 1]) pass_thru = ciao.get('pass_thru', False) moving = ciao.get('moving', False) pos = tiles_to_world(ciao.get('size'), tile_size) e.components.append({ 'type': 'components.collider', 'shape': { 'type': 'line', 'A': (0, 0), 'B': pos }, 'tag': 0, 'flag': 32 if pass_thru else 2, 'mask': 0, 'debug': True }) mp = ciao.get('move', None) if mp: e.components.append({'type': 'components.platform'}) path = mp['path'] e.components.append({ 'type': 'components.polymover', 'points': [path[i] * tile_size[i % 2] for i in range(0, len(path))], 'speed': mp['speed'], 'mode': mp['mode'] }) return e
def trunk(args): door = args.get('door') model = args.get('model', 'model.trunk') width = args.get('width', 6) xs = (width - 4) / 2 tag = 'door_' + str(door) e = Entity() e.model = model door_info = mopy.monkey.engine.data.globals.doors[door] if door_info['open'] == 1: anim = door_info['anim'] else: anim = 'barred' e.children.append( build_entity({ 'type': '_line', 'size': [4, 0], 'pass_thru': True }, [xs, 4])) e.children.append( build_entity( { 'type': 'bg', 'model': 'sprites.door', 'anim': anim, 'tag': tag }, [xs + 1, 0, 0])) # check if door is available if door_info['open'] == 1: coll = Entity() coll.add_component( Collider( shape={ 'type': 'shape3d.aabb', 'size': [16, 32, 0] }, flag=12, mask=mopy.monkey.engine.data.globals.CollisionFlags.player, tag=mopy.monkey.engine.data.globals.CollisionTags.door, debug=True)) coll.pos = [(xs + 1.5) * 16, 0, 0] coll.add_component(Info(door_id=door)) e.children.append(coll) return e
def dialogue_room(desc: dict): gl = mopy.monkey.engine.data.globals room = ScummRoom(desc) room.add_runner(Scheduler()) room.init.append([refresh_inventory]) # read world size width = desc['width'] height = desc['height'] device_size = mopy.monkey.engine.device_size cam_width = device_size[0] cam_height = device_size[1] - gl.ui_height # add the main node room.default_item = 'main' main = Entity(tag='main') main.camera = OrthoCamera(width, height, cam_width, cam_height, [0, gl.ui_height, cam_width, cam_height], tag='maincam') room.add(main) # add the ui node ui = Entity(tag='ui') ui.camera = OrthoCamera(cam_width, gl.ui_height, cam_width, gl.ui_height, [0, 0, cam_width, gl.ui_height], tag='uicam') room.add(ui) # dialogue node dialogue_node = TextView(factory=make_dialogue_button, pos=(0, 0), size=(320, 56), font_size=8, lines=7, delta_x=26, tag='dialogue') dialogue_node.add_component(HotSpotManager()) room.add(dialogue_node) inventory_node = Entity(tag='inventory') ui.add(inventory_node) # add static items room.add_items(desc) room.load_dynamic_items() return room
def bonus(model, speed, tag): e = Entity() e.model = model size = data.globals.tile_size max_speed = speed gravity, jump_speed = utils.compute_gravity( monkey.engine.data.globals.jump_height, monkey.engine.data.globals.time_to_jump_apex) e.add_component({ 'type': 'components.smart_collider', 'tag': tag, 'flag': data.CollisionFlags.foe, 'mask': data.CollisionFlags.player, 'debug': True }) e.components.append({ 'type': 'components.controller2D', 'size': [size[0], size[1], 0], 'offset': [0, size[1] * 0.5, 0], 'mask_up': 2, 'mask_down': 2 | 32, 'debug': True }) e.components.append({'type': 'components.dynamics'}) e.components.append({ 'type': 'components.state_machine', 'initial_state': 'idle', 'states': [{ 'id': 'walk', 'type': 'state.npc_walk', 'flip_hor': False, 'max_speed': max_speed, 'jump_speed': jump_speed, 'gravity': gravity, 'jump_up_anim': 'walk', 'jump_down_anim': 'walk', 'flip_on_edge': False }, { 'id': 'idle', 'type': 'state.null', }] }) return e
def map_room(desc: dict): gl = mopy.monkey.engine.data.globals room = ScummRoom(desc) room.add_runner(Scheduler()) width = desc['width'] height = desc['height'] device_size = mopy.monkey.engine.device_size cam_width = device_size[0] cam_height = device_size[1] # add the main node room.default_item = 'main' main = Entity(tag='main') main.camera = OrthoCamera(width, height, cam_width, cam_height, [0, 0, cam_width, cam_height], tag='maincam') main.add_component(HotSpotManager(lmbclick=walk_to)) room.add(main) cursor = Text(font=gl.default_font, size=8, text='#', color=(255, 255, 255, 255), tag='_cursor') cursor.add_component(Cursor()) main.add(cursor) # add static items room.add_items(desc) # add dynamic items room.load_dynamic_items() return room
def rect_platform(ciao): e = Entity() tile_size = getattr(monkey.engine.data.globals, 'tile_size', [1, 1]) size = tiles_to_world(ciao.get('size'), tile_size) e.components.append({ 'type': 'components.collider', 'shape': { 'type': 'rect', 'width': size[0], 'height': size[1], }, 'tag': 0, 'flag': 2, 'mask': 0, 'debug': True }) e.model = ciao.get('model') return e
def brick(ciao): e = Entity() e.model = ciao.get('model', None) hits_left = ciao.get('hits_left', 1) bonus_item = ciao.get('item', None) collision_tag = data.CollisionTags.bonus_brick_sensor if bonus_item else data.CollisionTags.basic_brick_sensor tile_size = getattr(monkey.engine.data.globals, 'tile_size', [1, 1]) hidden = ciao.get('hidden', False) if hidden: collision_tag = data.CollisionTags.hidden_brick_sensor e.components.append({ 'type': 'components.collider', 'shape': { 'type': 'rect', 'width': tile_size[0], 'height': tile_size[1], }, 'tag': 0, 'flag': 0 if hidden else 2, 'mask': 0, 'debug': True }) e.components.append({ 'type': 'components.info', 'stuff': { 'hits_left': hits_left, 'item': bonus_item } }) e.components.append({'type': 'components.dynamics'}) e.components.append({'type': 'components.platform'}) e.components.append({ 'type': 'components.line_dynamic_mover', 'direction': (0, 1), 'acceleration': (0, -data.globals.gravity), 'min': 0 }) # add brick sensor sensor = Entity() sensor.pos = [0.1 * tile_size[0], -0.1 * tile_size[1], 0] sensor.components.append({ 'type': 'components.collider', 'shape': { 'type': 'shape3d.aabb', 'size': [0.8 * tile_size[0], 0.2 * tile_size[1], 0] }, 'tag': collision_tag, 'mask': data.CollisionFlags.player, 'flag': data.CollisionFlags.foe, 'debug': True }) e.add(sensor) return e
def box_platform_3d(ciao): e = Entity() size = ciao['size'] top_tex = ciao['top'] side_tex = ciao['side'] collision_tag = ciao.get('collision_tag', 0) shape = sh3d.AABB(size=size, offset=(0, 0, -size[2])) e.model = { 'type': 'model.prism', 'repeat': ciao['repeat'], 'poly': [0, 0, size[0], 0, size[0], size[2], 0, size[2]], 'top': top_tex, 'side': side_tex, 'height': size[1], 'offset': [0, size[1], 0] } e.add_component( Collider(shape=shape, flag=2, mask=0, tag=collision_tag, debug=True)) return e
def entity(ciao): e = Entity() e.model = ciao.get('model', None) e.scale = ciao.get('scale') e.components = ciao.get('components', []) e.tag = ciao.get('tag', None) children = ciao.get('children') if children: tile_size = getattr( monkey.engine.data.globals, 'tile_size', [1, 1]) # monkey.engine.room_vars.get('tile_size', [1, 1]) for c in children: entity_desc = c positions = c.get('pos', [0, 0, 0]) if 'ref' in c: entity_desc = monkey.engine.get_asset(entity_desc, c['ref']) factory = monkey.engine.get_item_factory(entity_desc['type']) if not factory: print('Don' 't have factory for item: ' + entity_desc['type']) exit(1) for ip in range(0, len(positions), 3): pos = positions[ip:ip + 3] child = factory(entity_desc) child.pos = tiles_to_world(pos, tile_size) e.children.append(child) return e
def ramp(args): e = Entity() pos = args['pos'] e.model = { 'type': 'model.ramp3D_wireframe', 'width': args['width'], 'length': args['length'], 'height': args['height'] } e.components = [{ 'type': 'bullet.rigid_body', 'pos': pos, 'mass': 0, 'shape': { 'type': 'bullet.ramp', 'width': args['width'], 'length': args['length'], 'height': args['height'] } }] return e
def bg(args): e = Entity() asset = copy.deepcopy(monkey.engine.get_asset(args.get('model', None))) e.anim = args.get('anim', None) e.tag = args.get('tag') if 'tile_size' not in asset: asset['tile_size'] = [16, 16] e.model = asset print('THE TAG IS ' + str(e.tag)) e.read_children(args) return e
def __init__(self, desc): super().__init__(desc) #, 384, 224) #width = #height = 240 #device_width = monkey.engine.device_size[0] #device_height = monkey.engine.device_size[1] device_size = mopy.monkey.engine.device_size device_width = device_size[0] device_height = device_size[1] width = desc['width'] height = desc['height'] keyl = KeyListener() keyl.add_key(key=299, func=restart) self.add_runner(keyl) main = Entity(tag='main') cam = Camera25(width, height, device_width, device_height, [0, 0, device_width, device_height]) #cam = camera.PerspectiveCamera(viewport=[0, 0, 320, 240]) cam.tag = 'maincam' cam.pos = (5, 0, 1) #cam.bounds = world_bounds #cam.boundsz = [-100, 22] main.camera = cam self.main = main self.add(main) ce = CollisionEngine3D(80, 80, 80) # this will be a 3d engine #ce.add_response(vars.tags.player, vars.tags.ladder, runners.CollisionResponse(on_enter=func.on_enter_ladder_area, on_leave=func.on_leave_ladder_area)) #ce.add_response(vars.tags.player, vars.tags.spawn, runners.CollisionResponse(on_enter=func.spawn)) #ce.add_response(vars.tags.player_attack, vars.tags.foe, runners.CollisionResponse(on_enter=func.player_hits_foe)) #ce.add_response(vars.tags.foe_attack, vars.tags.player, runners.CollisionResponse(on_enter=func.foe_hits_player)) self.add_runner(ce) self.add_runner(Scheduler())
def walkarea(data): e = Entity() e.tag = 'walkarea_' + str(data.get('id', 0)) walkarea = { 'type': 'components.walkarea', 'depth': data.get('depth', None), 'scale': data.get('scale', None), 'walls': data.get('walls', None) } if 'poly' in data: walkarea['shape'] = { 'type': 'shape.polygon', 'outline': data['poly'], 'holes': data.get('holes') } else: walkarea['shape'] = { 'type': 'shape.polyline', 'nodes': data['nodes'], 'edges': data['edges'] } e.add_component(walkarea) return e
def character(key, desc): gl = mopy.monkey.engine.data.globals is_player = key == gl.current_player model = desc.get('model', None) text_color = desc.get('text_color', [255, 255, 255, 255]) text_offset = desc.get('text_offset', gl.default_text_offset) pos = desc.get('pos') tag = desc.get('tag', key) speed = desc.get('speed', gl.default_speed) s = None dir = desc.get('dir', 's') if model: s = Sprite(model=model, pos=pos, tag='player' if is_player else tag) # s.add_component(Collider(debug=True, flag=data.Collision.Flags.player, mask=data.Collision.Flags.other, # tag=data.Collision.Tags.player, # shape=shapes.Rect(width=8, height=2, offset=[-4, 0]))) if is_player: s.add_component(Follow()) else: s = Entity(pos=pos, tag='player' if is_player else tag) s.add_component({ 'type': 'components.character_controller', 'dir': dir, 'speed': speed, 'text_offset': text_offset, 'text_color': text_color, 'use_keyboard': gl.use_keyboard if is_player else False }) if is_player and gl.use_keyboard: s.add_component({'type': 'components.keyinput'}) #cumm.components.CharacterController(dir=dir, speed=speed, text_color=text_color, text_offset=text_offset)) # if a size is provided, add a hotspot size = desc.get('size', None) if size: s.add_component( HotSpot(shape=Rect(width=size[0], height=size[1], offset=[-0.5 * size[0], 0]), onenter=hover_on(key), onleave=hover_off(key), onclick=run_action())) cbox = desc.get('collision', None) if cbox: add_collision_box(s, cbox) return s
def poly_platform(ciao): e = Entity() tile_size = getattr(monkey.engine.data.globals, 'tile_size', [1, 1]) px = ciao.get('points') points = [px[i] * tile_size[i % 2] for i in range(0, len(px))] e.components.append({ 'type': 'components.collider', 'shape': { 'type': 'convex_polygon', 'points': points, }, 'tag': 0, 'flag': 2, 'mask': 0, 'debug': True }) return e
def collider(ciao): e = Entity() dt = monkey.engine.data.globals size = ciao['size'] e.add_component( Collider(shape=sh3d.AABB(size), flag=dt.CollisionFlags.foe, mask=dt.CollisionFlags.player, tag=dt.CollisionTags.player_callback, debug=dt.show_boxes)) e.add_component(Info(func=ciao['func'])) return e
def hotspot(args): glo = mopy.monkey.engine.data.globals hotspot = Entity() size = args['size'] hotspot.add_component( Collider(debug=True, flag=glo.CollisionFlags.foe, mask=glo.CollisionFlags.player, tag=glo.CollisionTags.hotspot, shape=mopy.shapes3d.AABB([size[0], size[1], 1]))) hotspot.add_component( Info(callback=args['callback'], args=args.get('args', []))) return hotspot