Skip to content

Commit

Permalink
four players
Browse files Browse the repository at this point in the history
  • Loading branch information
cflavio committed Oct 15, 2018
1 parent 54efaa8 commit 873f544
Show file tree
Hide file tree
Showing 10 changed files with 207 additions and 41 deletions.
26 changes: 19 additions & 7 deletions menu/carpage.py
Expand Up @@ -13,13 +13,14 @@

class CarPageGui(ThanksPageGui):

def __init__(self, mediator, carpage_props, track_path, yorg_client):
def __init__(self, mediator, carpage_props, track_path, yorg_client, players=1):
self.car = None
self.current_cars = None
self.track_path = track_path
self.props = carpage_props
self.yorg_client = yorg_client
ThanksPageGui.__init__(self, mediator, carpage_props.gameprops.menu_args, [0, 1])
players = range(players)
ThanksPageGui.__init__(self, mediator, carpage_props.gameprops.menu_args, players)

def build(self, exit_behav=False):
gprops = self.props.gameprops
Expand Down Expand Up @@ -110,9 +111,10 @@ def on_car(self, car):

class CarPageLocalMPGui(CarPageGui):

def __init__(self, mediator, carpage_props, track_path, yorg_client):
CarPageGui.__init__(self, mediator, carpage_props, track_path, yorg_client)
self.selected_cars = {0: None, 1: None}
def __init__(self, mediator, carpage_props, track_path, yorg_client, players):
CarPageGui.__init__(self, mediator, carpage_props, track_path, yorg_client, players)
self.selected_cars = {}
for i in range(players): self.selected_cars[i] = None

def on_car(self, car, player):
self._buttons(car)[0].disable()
Expand All @@ -123,8 +125,9 @@ def on_car(self, car, player):
self.evaluate_start()

def evaluate_start(self):
if len([btn for btn in self.buttons if btn['state'] == DISABLED]) < 2: return
cars = [self.selected_cars[i] for i in range(2)]
nplayers = len(self.selected_cars.keys())
if len([btn for btn in self.buttons if btn['state'] == DISABLED]) < nplayers: return
cars = [self.selected_cars[i] for i in range(nplayers)]
page_args = [self.track_path, cars, self.props]
self.notify('on_push_page', 'driver_page_mp', page_args)

Expand Down Expand Up @@ -304,3 +307,12 @@ class CarPageClient(CarPage):

class CarPageLocalMP(CarPage):
gui_cls = CarPageLocalMPGui


def __init__(self, carpage_props, track_path, yorg_client, players):
init_lst = [
[('event', self.event_cls, [self])],
[('gui', self.gui_cls, [self, carpage_props, track_path, yorg_client, players])]]
GameObject.__init__(self, init_lst)
PageFacade.__init__(self)
# invoke Page's __init__
29 changes: 16 additions & 13 deletions menu/driverpage.py
Expand Up @@ -33,12 +33,13 @@

class DriverPageGui(ThanksPageGui):

def __init__(self, mediator, driverpage_props, yorg_client):
def __init__(self, mediator, driverpage_props, yorg_client, players=1):
self.props = driverpage_props
self.sel_drv_img = None
self.driver = None
self.yorg_client = yorg_client
ThanksPageGui.__init__(self, mediator, driverpage_props.gameprops.menu_args, [0, 1])
players = range(players)
ThanksPageGui.__init__(self, mediator, driverpage_props.gameprops.menu_args, players)

def build(self, exit_behav):
self.drv_info = self.props.gameprops.drivers_info
Expand Down Expand Up @@ -191,14 +192,15 @@ def destroy(self):

class DriverPageMPGui(DriverPageGui):

def __init__(self, mediator, driverpage_props, yorg_client):
DriverPageGui.__init__(self, mediator, driverpage_props, yorg_client)
self.selected_drivers = {0: None, 1: None}
def __init__(self, mediator, driverpage_props, yorg_client, players):
DriverPageGui.__init__(self, mediator, driverpage_props, yorg_client, players)
self.selected_drivers = {}
for i in range(players): self.selected_drivers[i] = None

def build(self):
self.drv_info = self.props.gameprops.drivers_info
menu_args = self.menu_args
widgets = [Text(_('Select the drivers'), pos=(-.2, .9),
widgets = [Text(_('Select the drivers'), pos=(-.2, .91),
**menu_args.text_args)]
t_a = self.menu_args.text_args.copy()
del t_a['scale']
Expand Down Expand Up @@ -244,7 +246,7 @@ def ppcol(x):
for i, car in enumerate(self.mediator.cars):
self.sel_drv_img += [Img(
self.props.gameprops.cars_img % car,
parent=base.a2dBottomLeft, pos=(.3, 1, .4 + (1 - i) * .56), scale=.28)]
parent=base.a2dBottomLeft, pos=(.3, 1, 1.74 - i * .46), scale=.22)]
widgets += [self.sel_drv_img[-1]]
ffilterpath = self.eng.curr_path + 'yyagl/assets/shaders/filter.vert'
with open(ffilterpath) as ffilter:
Expand All @@ -262,10 +264,10 @@ def ppcol(x):
tex.load(empty_img)
self.sel_drv_img[-1].set_texture(self.tss[-1], tex)
self.ents = [Entry(
scale=.08, pos=(-.2, 1, .7 - .2 * i), entryFont=menu_args.font, width=12,
scale=.06, pos=(-.2, 1, .8 - .12 * i), entryFont=menu_args.font, width=12,
frameColor=menu_args.btn_color,
initialText=self.props.gameprops.player_name or _('your name'),
text_fg=menu_args.text_active) for i in range(2)]
text_fg=menu_args.text_active) for i in range(len(self.mediator.cars))]
self.add_widgets(self.ents)
self.add_widgets(widgets)
ThanksPageGui.build(self, exit_behav=False)
Expand Down Expand Up @@ -297,11 +299,12 @@ def on_click(self, drv, player):
self.evaluate_start()

def evaluate_start(self):
if len([btn for btn in self.buttons if btn['state'] == DISABLED]) < 2: return
nplayers = len(self.selected_drivers.keys())
if len([btn for btn in self.buttons if btn['state'] == DISABLED]) < nplayers: return
self.widgets[-1]['state'] = DISABLED
self.enable_buttons(False)
taskMgr.remove(self.update_tsk)
drivers = [self.selected_drivers[i] for i in range(2)]
drivers = [self.selected_drivers[i] for i in range(nplayers)]
self.notify('on_driver_selected_mp', [ent.get() for ent in self.ents], self.mediator.track,
self.mediator.cars)

Expand Down Expand Up @@ -524,12 +527,12 @@ class DriverPageSinglePlayer(DriverPage):
class DriverPageMP(DriverPage):
gui_cls = DriverPageMPGui

def __init__(self, track, cars, driverpage_props, yorg_client=None):
def __init__(self, track, cars, driverpage_props, players, yorg_client=None):
self.track = track
self.cars = cars
init_lst = [
[('event', self.event_cls, [self])],
[('gui', self.gui_cls, [self, driverpage_props, yorg_client])]]
[('gui', self.gui_cls, [self, driverpage_props, yorg_client, players])]]
GameObject.__init__(self, init_lst)
PageFacade.__init__(self)
# invoke Page's __init__
Expand Down
82 changes: 75 additions & 7 deletions menu/inputpage.py
Expand Up @@ -10,9 +10,9 @@
from .already_dlg import AlreadyUsedDlg


class InputPageGui2(ThanksPageGui):
class InputPageGui4(ThanksPageGui):

joyp_idx = 1
joyp_idx = 3

def __init__(self, mediator, menu_args, joysticks, keys):
self.joypad_cb = None
Expand Down Expand Up @@ -119,7 +119,7 @@ def already_used(self, val):
if self.eng.event.key2desc(self.keys[lab + '2']) == val: return '2', lab


class InputPageGui1(InputPageGui2):
class InputPageGui1(InputPageGui4):

joyp_idx = 0

Expand All @@ -131,7 +131,7 @@ def build(self):
self.add_widgets([p2_btn])
self.add_widgets([self._add_lab(_('Pause'), -.56)])
self.add_widgets([self._add_btn(self.eng.event.key2desc(self.keys['pause']), -.56)])
InputPageGui2.build(self)
InputPageGui4.build(self)

def on_player2(self):
self.notify('on_push_page', 'input2', [self.joysticks, self.keys])
Expand All @@ -152,8 +152,68 @@ def _on_back(self):
self.notify('on_back', 'input_page1', [dct])


class InputPage2(Page):
gui_cls = InputPageGui2
class InputPageGui2(InputPageGui4):

joyp_idx = 1

def build(self):
p_btn = Btn(
text='', pos=(-.2, 1, -.74), command=self.on_player3,
tra_src='Player 3', tra_tra=_('Player 3'),
**self.menu_args.btn_args)
self.add_widgets([p_btn])
InputPageGui4.build(self)

def on_player3(self):
self.notify('on_push_page', 'input3', [self.joysticks, self.keys])

def _on_back(self):
self.mediator.event.on_back()
suff = str(self.joyp_idx + 1)
dct = {}
dct['keys'] = {
'forward' + suff: self.eng.event.desc2key(self.mediator.gui.ibuttons[0]['text']),
'rear' + suff: self.eng.event.desc2key(self.mediator.gui.ibuttons[1]['text']),
'left' + suff: self.eng.event.desc2key(self.mediator.gui.ibuttons[2]['text']),
'right' + suff: self.eng.event.desc2key(self.mediator.gui.ibuttons[3]['text']),
'fire' + suff: self.eng.event.desc2key(self.mediator.gui.ibuttons[4]['text']),
'respawn' + suff: self.eng.event.desc2key(self.mediator.gui.ibuttons[5]['text'])}
dct['joystick' + suff] = self.mediator.gui.joypad_cb['indicatorValue']
self.notify('on_back', 'input_page2', [dct])


class InputPageGui3(InputPageGui4):

joyp_idx = 2

def build(self):
p_btn = Btn(
text='', pos=(-.2, 1, -.74), command=self.on_player3,
tra_src='Player 4', tra_tra=_('Player 4'),
**self.menu_args.btn_args)
self.add_widgets([p_btn])
InputPageGui4.build(self)

def on_player3(self):
self.notify('on_push_page', 'input4', [self.joysticks, self.keys])

def _on_back(self):
self.mediator.event.on_back()
suff = str(self.joyp_idx + 1)
dct = {}
dct['keys'] = {
'forward' + suff: self.eng.event.desc2key(self.mediator.gui.ibuttons[0]['text']),
'rear' + suff: self.eng.event.desc2key(self.mediator.gui.ibuttons[1]['text']),
'left' + suff: self.eng.event.desc2key(self.mediator.gui.ibuttons[2]['text']),
'right' + suff: self.eng.event.desc2key(self.mediator.gui.ibuttons[3]['text']),
'fire' + suff: self.eng.event.desc2key(self.mediator.gui.ibuttons[4]['text']),
'respawn' + suff: self.eng.event.desc2key(self.mediator.gui.ibuttons[5]['text'])}
dct['joystick' + suff] = self.mediator.gui.joypad_cb['indicatorValue']
self.notify('on_back', 'input_page3', [dct])


class InputPage4(Page):
gui_cls = InputPageGui4

def __init__(self, menu_args, joysticks, keys):
self.menu_args = menu_args
Expand All @@ -169,6 +229,14 @@ def destroy(self):
PageFacade.destroy(self)


class InputPage(InputPage2):
class InputPage2(InputPage4):
gui_cls = InputPageGui2


class InputPage3(InputPage4):
gui_cls = InputPageGui3


class InputPage(InputPage4):
gui_cls = InputPageGui1

4 changes: 2 additions & 2 deletions menu/mainpage.py
Expand Up @@ -104,7 +104,7 @@ def on_loginout(self):

def load_settings(self):
sett = self.props.opt_file['settings']
self.joysticks = sett['joystick1'], sett['joystick2']
self.joysticks = sett['joystick1'], sett['joystick2'], sett['joystick3'], sett['joystick4']
self.keys = sett['keys']
self.lang = sett['lang']
self.volume = sett['volume']
Expand All @@ -130,7 +130,7 @@ def get_label(self):
def build(self):
sp_cb = lambda: self.notify('on_push_page', 'singleplayer',
[self.props])
lmp_cb = lambda: self.notify('on_push_page', 'trackpagelocalmp',
lmp_cb = lambda: self.notify('on_push_page', 'localmp',
[self.props])
supp_cb = lambda: self.eng.open_browser(self.props.support_url)
cred_cb = lambda: self.notify('on_push_page', 'credits')
Expand Down
20 changes: 17 additions & 3 deletions menu/menu.py
Expand Up @@ -12,9 +12,10 @@
from .driverpage import DriverPageSinglePlayer, DriverPageServer, \
DriverPageClient, DriverPageMP
from .optionpage import OptionPage
from .inputpage import InputPage, InputPage2
from .inputpage import InputPage, InputPage2, InputPage3, InputPage4
from .creditpage import CreditPage
from .roompage import RoomPage
from .numplayerspage import NumPlayersPage
from .supporterspage import SupportersPage


Expand Down Expand Up @@ -56,6 +57,10 @@ def on_push_page(self, page_code, args=[]):
self.eng.log('single race')
page = TrackPage(args[0])
page.gui.attach(self.on_track_selected)
if page_code == 'localmp':
self.eng.log('local multiplayer')
page = NumPlayersPage(args[0])
page.gui.attach(self.on_nplayers)
if page_code == 'trackpageserver':
self.eng.log('track page server')
page = TrackPageServer(args[0], args[1])
Expand All @@ -79,7 +84,7 @@ def on_push_page(self, page_code, args=[]):
page.gui.attach(self.on_car_selected)
if page_code == 'carpagelocalmp':
self.eng.log('car page local multiplayer')
page = CarPageLocalMP(args[0], self.mediator.track, self.yorg_client)
page = CarPageLocalMP(args[0], self.mediator.track, self.yorg_client, self.mediator.nplayers)
page.gui.attach(self.on_car_selected)
if page_code == 'carpageclient':
self.eng.log('car page client')
Expand All @@ -91,7 +96,7 @@ def on_push_page(self, page_code, args=[]):
page.gui.attach(self.on_driver_selected)
if page_code == 'driver_page_mp':
self.eng.log('driver page multiplayer')
page = DriverPageMP(args[0], args[1], args[2])
page = DriverPageMP(args[0], args[1], args[2], self.mediator.nplayers)
page.gui.attach(self.on_driver_selected_mp)
if page_code == 'driverpageserver':
self.eng.log('driver page server')
Expand All @@ -112,6 +117,12 @@ def on_push_page(self, page_code, args=[]):
if page_code == 'input2':
self.eng.log('input2')
page = InputPage2(self.mediator.gui.menu_args, args[0], args[1])
if page_code == 'input3':
self.eng.log('input3')
page = InputPage3(self.mediator.gui.menu_args, args[0], args[1])
if page_code == 'input4':
self.eng.log('input4')
page = InputPage4(self.mediator.gui.menu_args, args[0], args[1])
if page_code == 'credits':
self.eng.log('credits')
page = CreditPage(self.mediator.gui.menu_args)
Expand Down Expand Up @@ -150,6 +161,9 @@ def on_track_selected(self, track):
def on_track_selected_lmp(self, track):
self.mediator.track = track

def on_nplayers(self, num):
self.mediator.nplayers = num

def on_car_selected(self, car):
self.mediator.gui.notify('on_car_selected', car)

Expand Down
50 changes: 50 additions & 0 deletions menu/numplayerspage.py
@@ -0,0 +1,50 @@
from yyagl.library.gui import Btn, Text
from yyagl.engine.gui.page import Page, PageFacade
from yyagl.gameobject import GameObject
from .thankspage import ThanksPageGui


class NumPlayersPageGui(ThanksPageGui):

def __init__(self, mediator, mp_props):
self.props = mp_props
ThanksPageGui.__init__(self, mediator, mp_props.gameprops.menu_args)

def build(self):
menu_args = self.menu_args
t_a = menu_args.text_args.copy()
players_lab = Text(_('How many players?'), pos=(-.2, .6),
align='center', **t_a)
p2_btn = Btn(
text='2', pos=(-.2, 1, .2), command=self.on_btn, extraArgs=[2],
**self.props.gameprops.menu_args.btn_args)
p3_btn = Btn(
text='3', pos=(-.2, 1, 0), command=self.on_btn, extraArgs=[3],
**self.props.gameprops.menu_args.btn_args)
p4_btn = Btn(
text='4', pos=(-.2, 1, -.2), command=self.on_btn, extraArgs=[4],
**self.props.gameprops.menu_args.btn_args)
t_a['scale'] = .06
widgets = [p2_btn, p3_btn, p4_btn, players_lab]
self.add_widgets(widgets)
ThanksPageGui.build(self)

def on_btn(self, num):
self.notify('on_nplayers', num)
self.notify('on_push_page', 'trackpagelocalmp', [self.props])


class NumPlayersPage(Page):
gui_cls = NumPlayersPageGui

def __init__(self, mp_props):
init_lst = [
[('event', self.event_cls, [self])],
[('gui', self.gui_cls, [self, mp_props])]]
GameObject.__init__(self, init_lst)
PageFacade.__init__(self)
# invoke Page's __init__

def destroy(self):
GameObject.destroy(self)
PageFacade.destroy(self)

0 comments on commit 873f544

Please sign in to comment.