from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import random doc = """ This bargaining game involves 2 players. Each demands for a portion of some available amount. If the sum of demands is no larger than the available amount, both players get demanded portions. Otherwise, both get nothing. """ class Constants(BaseConstants): name_in_url = 'bargaining_subgroups' players_per_group = 4 num_rounds = 10 instructions_template = 'bargaining_subgroups/Instructions.html' amount_shared = c(100) class Subsession(BaseSubsession): def creating_session(self): self.group_randomly() class Group(BaseGroup): subgroup_A_total_requested_amount = models.CurrencyField() subgroup_B_total_requested_amount = models.CurrencyField() def set_payoffs(self): p1 = self.get_player_by_id(1) p2 = self.get_player_by_id(2) p3 = self.get_player_by_id(3) p4 = self.get_player_by_id(4) p1.subgroup = p2.subgroup = "A" p3.subgroup = p4.subgroup = "B" subgroup_A_total_requested_amount = p1.request_amount + p2.request_amount subgroup_B_total_requested_amount = p3.request_amount + p4.request_amount if subgroup_A_total_requested_amount <= Constants.amount_shared: p1.payoff = p1.request_amount p2.payoff = p2.request_amount else: p1.payoff = p2.payoff = c(0) if subgroup_B_total_requested_amount <= Constants.amount_shared: p3.payoff = p3.request_amount p4.payoff = p4.request_amount else: p3.payoff = p3.payoff = c(0) class Player(BasePlayer): request_amount = models.CurrencyField( doc=""" Amount requested by this player. """, min=0, max=Constants.amount_shared ) subgroup = models.StringField() def other_player(self): """Returns the opponent of the current player""" return self.get_others_in_group()[0]