Exemplo n.º 1
0
def show_line(request, line_id, template="lines/show_line.html"):
    gtu = None
    if not request.user.is_superuser:
        gtu = get_object_or_404(Character, user=request.user)
        name = gtu.name
    else:
        name = "The GMs"
    line = get_object_or_404(Line, id=line_id)
    line_controls = []
    try:
        line_controls += ['The mailbox %s (code %s)' % (line.mailbox.name, line.mailbox.code)]
    except:
        pass
    try:
        line_controls += ['The territory control faction %s' % Faction.objects.get(controller=line).name]
    except Faction.DoesNotExist:
        pass
    for s in SecureLocation.objects.filter(controller=line):
        line_controls += ['The secure location %s' % s]
    promote = request.GET.get('promote', None)
    if promote:
        promoted_user = get_object_or_404(User, id=int(promote))
        from_membership = get_object_or_404(LineOrder, line=line, character__user=promoted_user)
        print from_membership.character, from_membership.order
        to_membership = get_object_or_404(LineOrder, line=line, order=from_membership.order - 1)
        print to_membership.character, to_membership.order
        # get around db column uniqueness enforcement
        neworder = to_membership.order
        from_membership.order = 999
        from_membership.save()
        to_membership.order += 1
        to_membership.save()
        from_membership.order = neworder
        from_membership.save()
        while not LineOrder.objects.filter(line=line, order=1).exists():
            for o in LineOrder.objects.filter(line=line).order_by('-order'):
                o.order -= 1
                o.save()
        Message.mail_to(from_membership.character, "Promotion Alert",
                        "%s promoted you in the %s line! Your new rank is %s. %s" % (name, line.name, from_membership.order, "You are now in charge." if from_membership.order == 1 else ""),
                        sender="Group Command")
        Message.mail_to(to_membership.character, "Demotion Alert",
                        "%s demoted you in the %s line. Your new rank is %s." % (name, line.name, to_membership.order),
                        sender="Group Command")
        return redirect('show_line', line_id)
    if not request.user.is_superuser:
        membership = get_object_or_404(LineOrder, character=gtu, line=line)
    else:
        membership = None
    context = {
        "line": line,
        "is_leader": line.current_leader().character == gtu,
        "line_controls": line_controls,
        "line_members": line.members.all().order_by('lineorder'),
        "membership": membership,
    }
    return render(request, template, context)
Exemplo n.º 2
0
 def check_and_notify(self):
     if self.notified == True: return False
     for s in self.overlaps():
         if s.creator.alive:
             Message.mail_to(s.creator, "Security Alarm: %s" % self.location,
             "Security alert! Entry window detected; possible breach attempt in progress at %s, start time: %s" % (
             self.location, localtime(self.start_time)), sender="Security", urgent=True)
     self.notified = True
     self.save()
     return True
Exemplo n.º 3
0
def check_collisions_and_notify(new_window):
    query_set = new_window.overlaps()
    if isinstance(new_window, EntryWindow):
        for s in query_set:
            Message.mail_to(s.creator, "Security Window Triggered",
                            "Security alert! Possible breach attempt at %s, time: %s" % (new_window.location, new_window.start_time), sender="Security")
    elif isinstance(new_window, SecurityWindow):
        for e in query_set:
            Message.mail_to(new_window.creator, "Security Window Triggered",
                            "Security alert! Possible breach attempt at %s, time: %s" % (new_window.location, e.start_time), sender="Security")
    return query_set
Exemplo n.º 4
0
def bid(request, hex, item):
    try:
        char = gtc(request)
        item = get_object_or_404(Item, id=item)
        node_hex = get_object_or_404(Node, hex=hex)
        amount = int(request.POST.get("amount", 0))
        bid_x = char.bid_on(node_hex, item, amount)
        messages.success(request, "Bid confirmed!")
        Message.mail_to(char, "Market Bid Confirmed", "Your bid of %s on %s has been confirmed. %s" % (amount, item, "You were disguised when you bid." if bid_x.disguised else ""), sender="Bakaara Market")
        char.revert_disguise(request)
    except Exception, e:
        messages.error(request, "Something went wrong and your bid was not processed: %s" % e.message)
Exemplo n.º 5
0
 def check_and_notify(self):
     if self.notified == True: return False
     for s in self.overlaps():
         if s.creator.alive:
             Message.mail_to(
                 s.creator,
                 "Security Alarm: %s" % self.location,
                 "Security alert! Entry window detected; possible breach attempt in progress at %s, start time: %s"
                 % (self.location, localtime(self.start_time)),
                 sender="Security",
                 urgent=True)
     self.notified = True
     self.save()
     return True
Exemplo n.º 6
0
def check_collisions_and_notify(new_window):
    query_set = new_window.overlaps()
    if isinstance(new_window, EntryWindow):
        for s in query_set:
            Message.mail_to(
                s.creator,
                "Security Window Triggered",
                "Security alert! Possible breach attempt at %s, time: %s" %
                (new_window.location, new_window.start_time),
                sender="Security")
    elif isinstance(new_window, SecurityWindow):
        for e in query_set:
            Message.mail_to(
                new_window.creator,
                "Security Window Triggered",
                "Security alert! Possible breach attempt at %s, time: %s" %
                (new_window.location, e.start_time),
                sender="Security")
    return query_set
Exemplo n.º 7
0
def kill_character(request, template="lines/kill_character.html"):
    if not request.user.is_superuser: raise Http404
    if request.method == 'POST':
        char_id = request.POST.get('char', None)
        char = get_object_or_404(Character, id=char_id)
        really_dead = request.POST.get('really-dead', False)
        print really_dead
        if really_dead:
            char.alive = False
            char.save()
        for line in Line.objects.filter(members=char):
            lo = LineOrder.objects.get(line=line, character=char)
            los = LineOrder.objects.filter(line=line, order__gt=lo.order).order_by('order')
            orig_order = lo.order
            lo.order = 1000 + lo.id
            lo.save()
            for lox in los:
                lox.order -= 1
                lox.save()
            if really_dead:
                lo.delete()
                Message.mail_to(char, "You have been declared dead. Thanks for playing!", "You have been officially declared dead. Thanks for playing our game.", urgent=True)
            else:
                lo.order = LineOrder.objects.exclude(id=lo.id).filter(line=line, order__lt=lo.order).aggregate(Max('order'))['order__max'] + 1
                lo.save()
                Message.mail_to(char, "You have been declared missing.", "You have been officially declared missing, and demoted to the bottom of any groups you are in.", urgent=True)
            for c in line.members.exclude(id=char.id):
                message = "Notice to all members of %s:\n %s has been declared %s. \n" % (line.name, char.gto.name, "dead" if really_dead else "missing")
                message += "The cause: %s.\n" % request.POST.get('cause', 'Unknown')
                if orig_order == 1:
                    message += "%s is the new controller of %s." % (line.current_leader().character.gto.name, line.name)
                print c
                print Mailbox.objects.get(character=c, type=1)
                Message.mail_to(c, "%s Alert: %s" % ("Death" if really_dead else "Missing", char.gto.name),
                                message, sender="Mogadishu Office of Civil Security", urgent=True)
        messages.success(request, "%s was declared %s.  Mail sent." % (char.name, "dead" if really_dead else "missing"))

    return render(request, template, {'chars': Character.objects.filter(alive=True)})
Exemplo n.º 8
0
    def tick(cls):
        """
        Tick the game state forward one day.
        """
        from messaging.models import Message

        # Resolve auctions.

        auctioned_items = Item.objects.filter(id__in=ItemBid.objects.filter(
            day=GameDay.get_day()).values('item'))

        for item in auctioned_items:
            bids = ItemBid.objects.filter(
                day=GameDay.get_day(), item=item,
                character__alive=True).order_by('-amount')
            winning = bids[0]
            winner = winning.character
            winning.won = True
            winning.resolved = True
            winning.save()
            NodeEvent.objects.create(where=winning.node,
                                     who=winner,
                                     day=GameDay.get_day(),
                                     type=EVENT_AUCTION,
                                     who_disguised=bids[0].disguised)

            Message.mail_to(
                winner,
                "Congratulations! You won %s!" % item.name,
                "You've won %s at a cost of %s.<br />Here's what you've won:<br/><br/>%s"
                % (item.name, winning.amount, item.post_buy),
                sender="Bakaara Market")
            losers = bids[1:]
            for loser in losers:
                loser.won = False
                loser.resolved = True
                loser.save()
                Message.mail_to(
                    loser.character,
                    "Sorry, you didn't win %s." % item.name,
                    "You didn't win %s.  Add %s back to your budget. Better luck next time!"
                    % (item.name, loser.amount),
                    sender="Bakaara Market")
            item.valid = False
            item.save()

        for char in Character.objects.all():
            char.points = char.market_stat()
            char.save()

        for w in CharNodeWatch.objects.filter():
            messages = []
            events = {0: set(), 1: set(), 2: set()}
            for e in NodeEvent.objects.filter(where=w.node,
                                              day=GameDay.get_day()):
                events[0].update([e])
            nodes = set()
            for n in w.node.get_all_neighbors():
                for e in NodeEvent.objects.filter(where=n,
                                                  day=GameDay.get_day()):
                    if not e in events[0]:
                        events[1].update([e])
                nodes.update(n.get_all_neighbors())
            for n in nodes:
                for e in NodeEvent.objects.filter(where=n,
                                                  day=GameDay.get_day()):
                    if not e in events[0] or e in events[1]:
                        events[2].update([e])
            for ed in events:
                for e in events[ed]:
                    messages.append(e.display_for(ed, w.char))
            random.shuffle(messages)
            Message.mail_to(w.char,
                            "Agent report from %s" % w.node.name,
                            "I saw the following things: <ul>" + "".join(
                                ("<li>%s</li>" % a)
                                for a in messages) + "</ul>",
                            sender="Bakaara Market")

        for item in Item.objects.filter(valid=True):
            if item.rarity_class == RARITY_SCARCE:
                num_purchase_events = NodeEvent.objects.filter(
                    day__gte=(GameDay.get_day() - 1), item=item).count()
                if num_purchase_events > 0:
                    if reduce(
                            lambda a, b: a or b, [
                                random.random() < item.rarity_prob
                                for _foo in range(num_purchase_events)
                            ], False
                    ):  # Roll num_purchase_events random()s. If any come up True, item vanishes. So sad.
                        item.valid = False
                        item.save()

        gameday = GameDay.objects.get()
        gameday.day += 1
        gameday.save()

        debug("TICK.  Day is now %d." % gameday.day)
Exemplo n.º 9
0
def show_line(request, line_id, template="lines/show_line.html"):
    gtu = None
    if not request.user.is_superuser:
        gtu = get_object_or_404(Character, user=request.user)
        name = gtu.name
    else:
        name = "The GMs"
    line = get_object_or_404(Line, id=line_id)
    line_controls = []
    try:
        line_controls += [
            'The mailbox %s (code %s)' % (line.mailbox.name, line.mailbox.code)
        ]
    except:
        pass
    try:
        line_controls += [
            'The territory control faction %s' %
            Faction.objects.get(controller=line).name
        ]
    except Faction.DoesNotExist:
        pass
    for s in SecureLocation.objects.filter(controller=line):
        line_controls += ['The secure location %s' % s]
    promote = request.GET.get('promote', None)
    if promote:
        promoted_user = get_object_or_404(User, id=int(promote))
        from_membership = get_object_or_404(LineOrder,
                                            line=line,
                                            character__user=promoted_user)
        print from_membership.character, from_membership.order
        to_membership = get_object_or_404(LineOrder,
                                          line=line,
                                          order=from_membership.order - 1)
        print to_membership.character, to_membership.order
        # get around db column uniqueness enforcement
        neworder = to_membership.order
        from_membership.order = 999
        from_membership.save()
        to_membership.order += 1
        to_membership.save()
        from_membership.order = neworder
        from_membership.save()
        while not LineOrder.objects.filter(line=line, order=1).exists():
            for o in LineOrder.objects.filter(line=line).order_by('-order'):
                o.order -= 1
                o.save()
        Message.mail_to(
            from_membership.character,
            "Promotion Alert",
            "%s promoted you in the %s line! Your new rank is %s. %s" %
            (name, line.name, from_membership.order,
             "You are now in charge." if from_membership.order == 1 else ""),
            sender="Group Command")
        Message.mail_to(to_membership.character,
                        "Demotion Alert",
                        "%s demoted you in the %s line. Your new rank is %s." %
                        (name, line.name, to_membership.order),
                        sender="Group Command")
        return redirect('show_line', line_id)
    if not request.user.is_superuser:
        membership = get_object_or_404(LineOrder, character=gtu, line=line)
    else:
        membership = None
    context = {
        "line": line,
        "is_leader": line.current_leader().character == gtu,
        "line_controls": line_controls,
        "line_members": line.members.all().order_by('lineorder'),
        "membership": membership,
    }
    return render(request, template, context)
Exemplo n.º 10
0
def kill_character(request, template="lines/kill_character.html"):
    if not request.user.is_superuser: raise Http404
    if request.method == 'POST':
        char_id = request.POST.get('char', None)
        char = get_object_or_404(Character, id=char_id)
        really_dead = request.POST.get('really-dead', False)
        print really_dead
        if really_dead:
            char.alive = False
            char.save()
        for line in Line.objects.filter(members=char):
            lo = LineOrder.objects.get(line=line, character=char)
            los = LineOrder.objects.filter(
                line=line, order__gt=lo.order).order_by('order')
            orig_order = lo.order
            lo.order = 1000 + lo.id
            lo.save()
            for lox in los:
                lox.order -= 1
                lox.save()
            if really_dead:
                lo.delete()
                Message.mail_to(
                    char,
                    "You have been declared dead. Thanks for playing!",
                    "You have been officially declared dead. Thanks for playing our game.",
                    urgent=True)
            else:
                lo.order = LineOrder.objects.exclude(id=lo.id).filter(
                    line=line, order__lt=lo.order).aggregate(
                        Max('order'))['order__max'] + 1
                lo.save()
                Message.mail_to(
                    char,
                    "You have been declared missing.",
                    "You have been officially declared missing, and demoted to the bottom of any groups you are in.",
                    urgent=True)
            for c in line.members.exclude(id=char.id):
                message = "Notice to all members of %s:\n %s has been declared %s. \n" % (
                    line.name, char.gto.name,
                    "dead" if really_dead else "missing")
                message += "The cause: %s.\n" % request.POST.get(
                    'cause', 'Unknown')
                if orig_order == 1:
                    message += "%s is the new controller of %s." % (
                        line.current_leader().character.gto.name, line.name)
                print c
                print Mailbox.objects.get(character=c, type=1)
                Message.mail_to(
                    c,
                    "%s Alert: %s" %
                    ("Death" if really_dead else "Missing", char.gto.name),
                    message,
                    sender="Mogadishu Office of Civil Security",
                    urgent=True)
        messages.success(
            request, "%s was declared %s.  Mail sent." %
            (char.name, "dead" if really_dead else "missing"))

    return render(request, template,
                  {'chars': Character.objects.filter(alive=True)})
Exemplo n.º 11
0
    def tick(cls):
        """
        Tick the game state forward one day.
        """
        from messaging.models import Message

        # Resolve auctions.

        auctioned_items = Item.objects.filter(id__in=ItemBid.objects.filter(day=GameDay.get_day()).values('item'))

        for item in auctioned_items:
            bids = ItemBid.objects.filter(day=GameDay.get_day(), item=item, character__alive=True).order_by('-amount')
            winning = bids[0]
            winner = winning.character
            winning.won = True
            winning.resolved = True
            winning.save()
            NodeEvent.objects.create(
                where=winning.node,
                who=winner,
                day=GameDay.get_day(),
                type=EVENT_AUCTION,
                who_disguised=bids[0].disguised
            )

            Message.mail_to(winner, "Congratulations! You won %s!" % item.name,
                            "You've won %s at a cost of %s.<br />Here's what you've won:<br/><br/>%s"
                            % (item.name, winning.amount, item.post_buy), sender="Bakaara Market")
            losers = bids[1:]
            for loser in losers:
                loser.won = False
                loser.resolved = True
                loser.save()
                Message.mail_to(loser.character, "Sorry, you didn't win %s." % item.name,
                                "You didn't win %s.  Add %s back to your budget. Better luck next time!"
                                % (item.name, loser.amount), sender="Bakaara Market")
            item.valid = False
            item.save()

        for char in Character.objects.all():
            char.points = char.market_stat()
            char.save()

        for w in CharNodeWatch.objects.filter():
            messages = []
            events = {0:set(), 1:set(), 2:set()}
            for e in NodeEvent.objects.filter(where=w.node, day=GameDay.get_day()):
                events[0].update([e])
            nodes = set()
            for n in w.node.get_all_neighbors():
                for e in NodeEvent.objects.filter(where=n, day=GameDay.get_day()):
                    if not e in events[0]:
                        events[1].update([e])
                nodes.update(n.get_all_neighbors())
            for n in nodes:
                for e in NodeEvent.objects.filter(where=n, day=GameDay.get_day()):
                    if not e in events[0] or e in events[1]:
                        events[2].update([e])
            for ed in events:
                for e in events[ed]:
                    messages.append(e.display_for(ed, w.char))
            random.shuffle(messages)
            Message.mail_to(w.char, "Agent report from %s" % w.node.name,
                            "I saw the following things: <ul>" + "".join(("<li>%s</li>" % a) for a in messages) + "</ul>",
                            sender="Bakaara Market")

        for item in Item.objects.filter(valid=True):
            if item.rarity_class == RARITY_SCARCE:
                num_purchase_events = NodeEvent.objects.filter(day__gte=(GameDay.get_day() - 1), item=item).count()
                if num_purchase_events > 0:
                    if reduce(lambda a, b: a or b,
                              [random.random() < item.rarity_prob for _foo in range(num_purchase_events)],
                              False):  # Roll num_purchase_events random()s. If any come up True, item vanishes. So sad.
                        item.valid = False
                        item.save()

        gameday = GameDay.objects.get()
        gameday.day += 1
        gameday.save()

        debug("TICK.  Day is now %d." % gameday.day)