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)
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
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
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)
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
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
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)})
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)
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)
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)})
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)