def shiptradecomplete(senderpk, recieverpk, taskid, ships, training): #ships is a string argument recipient = World.objects.get(pk=recieverpk) sender = World.objects.get(pk=senderpk) recievefleet = recipient.preferences.recievefleet if recievefleet.sector != recipient.sector: #if out of sector, reset the choice name = recievefleet.name recievefleet = recipient.fleets.all().get(sector='hangar') recipient.preferences.recievefleet = recievefleet recipient.preferences.save() NewsItem.objects.create( target=recipient, content= "%s is out of sector so incoming ships will be directed to the hangar." % name) amount, ship = ships.split(' ') log = ResourceLog.objects.create(owner=recipient, target=sender, sent=False, trade=True) Logresource.objects.create(resource=ship, log=log, amount=amount) actions = {'add': {ship: int(amount), 'training': training}} utilities.atomic_fleet(recievefleet.pk, actions) htmldata = news.tradecompletionships(sender, ships) NewsItem.objects.create(target=recipient, content=htmldata) link = '<a href="%s">%s</a>' % (sender.get_absolute_url(), sender.name) outcome = "%s has recieved %s from our trade with %s!" % ( recievefleet.name, ships, link) Task.objects.filter(pk=taskid).update(outcome=outcome)
def fleetaid(worldpk, targetpk, taskpk, fleetpk, lending=True): world = World.objects.get(pk=worldpk) targetworld = World.objects.get(pk=targetpk) task = Task.objects.get(pk=taskpk) transferfleet = fleet.objects.get(pk=fleetpk) actions = { 'set': { 'controller': targetworld, 'sector': targetworld.sector } } if lending is False: #recipient is granted ownership actions['set'].update({'world': targetworld}) utilities.atomic_fleet(transferfleet.pk, actions) #sets attributes in a safe way htmldata = news.fleetaidcompletion(world, transferfleet.name) NewsItem.objects.create(target=target, content=htmldata) ResourceLog.objects.create(owner=target, target=world, res=transferfleet.name, amount=1, sent=False, trade=False) outcome = "We recieved fleet %s from %s at %s!" % (transferfleet.name, world.name, now()) task = Task.objects.filter(pk=taskpk).update(outcome=outcome)
def shipaid(senderpk, recipientpk, taskid, ship, amount, training): world = World.objects.get(pk=senderpk) fullworld = '<a href="%s">%s</a>' % (world.get_absolute_url(), world.name) target = World.objects.get(pk=recipientpk) tgtfleet = target.preferences.recievefleet action = {'add': {ship: amount, 'training': training}} utilities.atomic_fleet(tgtfleet.pk, action) outcome = "We recieved %s %s from %s at %s" % (amount, shiptype.replace('_', ' ').capitalize(), sender, now()) Task.objects.filter(pk=taskid).update(outcome=outcome)
def shipaid(senderpk, recipientpk, taskid, ship, amount, training): world = World.objects.get(pk=senderpk) fullworld = '<a href="%s">%s</a>' % (world.get_absolute_url(), world.name) target = World.objects.get(pk=recipientpk) tgtfleet = target.preferences.recievefleet action = {'add': {ship: amount, 'training': training}} utilities.atomic_fleet(tgtfleet.pk, action) outcome = "We recieved %s %s from %s at %s" % ( amount, shiptype.replace('_', ' ').capitalize(), sender, now()) Task.objects.filter(pk=taskid).update(outcome=outcome)
def shipbuilding_update(): for order in shipqueue.objects.select_related('fleet').all().iterator(): if order.fleet.world.sector == order.fleet.sector: outcome = "%s has been delivered to %s!" % (order.content(), order.fleet.name) else: outcome = "%s has warped out of the sector! %s was delivered to the hangar" % ( order.fleet.name, order.content()) order.fleet = order.world.fleets.all().get(sector="hangar") Task.objects.filter(pk=order.task.pk).update(outcome=outcome) utilities.atomic_fleet(order.fleet.pk, {'mergeorder': order}) return spyturnchange()
def fleetaid(worldpk, targetpk, taskpk, fleetpk, lending=True): world = World.objects.get(pk=worldpk) targetworld = World.objects.get(pk=targetpk) task = Task.objects.get(pk=taskpk) transferfleet = fleet.objects.get(pk=fleetpk) actions = {'set': {'controller': targetworld, 'sector': targetworld.sector}} if lending is False: #recipient is granted ownership actions['set'].update({'world': targetworld}) utilities.atomic_fleet(transferfleet.pk, actions) #sets attributes in a safe way htmldata = news.fleetaidcompletion(world, transferfleet.name) NewsItem.objects.create(target=target, content=htmldata) ResourceLog.objects.create(owner=target, target=world, res=transferfleet.name, amount=1, sent=False, trade=False) outcome = "We recieved fleet %s from %s at %s!" % (transferfleet.name, world.name, now()) task = Task.objects.filter(pk=taskpk).update(outcome=outcome)
def fleet_changes(tochange, fuel): training = tochange.training - (tochange.maxtraining() * (0.1 if tochange.sector == 'hangar' else 0.02)) if training < 0: training = 0 actions = {'set': {'training': training, 'attacked': False}} if fuel: weariness = tochange.weariness + 40 if weariness > 200: weariness = 200 else: weariness = tochange.weariness - 100 if weariness < 0: weariness = 0 if tochange.sector != 'hangar': actions['set'].update({'weariness': weariness}) utilities.atomic_fleet(tochange.pk, actions)
def fleet_changes(tochange, fuel): training = tochange.training - ( tochange.maxtraining() * (0.1 if tochange.sector == 'hangar' else 0.02)) if training < 0: training = 0 actions = {'set': {'training': training, 'attacked': False}} if fuel: weariness = tochange.weariness + 40 if weariness > 200: weariness = 200 else: weariness = tochange.weariness - 100 if weariness < 0: weariness = 0 if tochange.sector != 'hangar': actions['set'].update({'weariness': weariness}) utilities.atomic_fleet(tochange.pk, actions)
def shiptradecomplete(senderpk, recieverpk, taskid, ships, training): #ships is a string argument recipient = World.objects.get(pk=recieverpk) sender = World.objects.get(pk=senderpk) recievefleet = recipient.preferences.recievefleet if recievefleet.sector != recipient.sector: #if out of sector, reset the choice name = recievefleet.name recievefleet = recipient.fleets.all().get(sector='hangar') recipient.preferences.recievefleet = recievefleet recipient.preferences.save() NewsItem.objects.create(target=recipient, content="%s is out of sector so incoming ships will be directed to the hangar." % name) amount, ship = ships.split(' ') log = ResourceLog.objects.create(owner=recipient, target=sender, sent=False, trade=True) Logresource.objects.create(resource=ship, log=log, amount=amount) actions = {'add': {ship: int(amount), 'training': training}} utilities.atomic_fleet(recievefleet.pk, actions) htmldata = news.tradecompletionships(sender, ships) NewsItem.objects.create(target=recipient, content=htmldata) link = '<a href="%s">%s</a>' % (sender.get_absolute_url(), sender.name) outcome = "%s has recieved %s from our trade with %s!" % (recievefleet.name, ships, link) Task.objects.filter(pk=taskid).update(outcome=outcome)
def fleet_warp(fleetpk, name, sector, taskpk): actions = {'set': {'sector': sector}} utilities.atomic_fleet(fleetpk, actions) outcome="Fleet %s has arrived in sector %s at %s" % (name, sector, now()) Task.objects.filter(pk=taskpk).update(outcome=outcome)
def policies_military(request): # variable setup, stuff needed to process POST data world = request.user.world result = indefwar = rumsodmsg = None shipdata = v.shipcosts(world.sector) rebelfuelcost = 0 if request.method == 'POST': form = request.POST actions = False #if the n***a wants to build ships if 'build' in form: shiptype = form['build'] form = shipbuildform(world, data={shiptype: form[shiptype]}) if form.is_valid(): amount = form.cleaned_data[shiptype] ship = (shiptype if amount > 1 else shiptype[:-1] ) #shipname, if >1 then plural if amount == 0: result = "Can't build 0 %s!" % ship.replace('_', ' ') else: #make sure he can (or she) can afford it results = utilities.costcheck(world, form.cleaned_data) if results['status'] is True: #player can afford it actions = { 'budget': { 'action': 'subtract', 'amount': D(results['cost']['geu']) }, 'duranium': { 'action': 'subtract', 'amount': results['cost']['duranium'] }, 'tritanium': { 'action': 'subtract', 'amount': results['cost']['tritanium'] }, 'adamantium': { 'action': 'subtract', 'amount': results['cost']['adamantium'] }, 'productionpoints': { 'action': 'subtract', 'amount': results['cost']['productionpoints'] } } #queue merges with build fleet at turn change queue = shipqueue(world=world, fleet=world.preferences.buildfleet) queue.__dict__[shiptype] = amount current_time = v.now() if current_time.hour > 12: hours = 24 - current_time.hour - 1 minutes = 60 - current_time.minute else: hours = 12 - current_time.hour - 1 minutes = 60 - current_time.minute outcometime = current_time + time.timedelta( hours=hours, minutes=minutes) ship = ship.replace('_', ' ') task = Task.objects.create(target=world, content=taskdata.buildship( ship, amount), datetime=outcometime) queue.task = task queue.save() result = "%s %s are building" % (amount, ship) else: result = "You can't afford to build %s %s!" % ( amount, ship.replace('_', ' ')) if "research" in form: form = ResearchForm(request.POST) if form.is_valid(): next_tier = v.tiers[v.tiers.index(world.techlevel) + 1] rdcost = shipdata[next_tier.replace(' ', '_').lower() + 's']['research'] durcost = rdcost['duranium'] try: tritcost = rdcost['tritanium'] except: tritcost = 0 try: adamcost = rdcost['adamantium'] except: adamcost = 0 data = form.cleaned_data amount = data['researchamount'] if amount < 0: result = 'Enter a positive integer.' elif world.techlevel == "dreadnought": result = 'You have researched all ship types already!' elif world.budget < amount: result = outcomes.nomoney() elif durcost > world.duranium: result = outcomes.research('NoDur') elif tritcost > world.tritanium: result = outcomes.research('NoTrit') elif adamcost > world.adamantium: result = outcomes.research('NoAdam') elif world.turnresearched: result = outcomes.research('TooSoon') elif amount > 3 * world.gdp: result = outcomes.research('TooMuch') else: actions = { 'budget': { 'action': 'subtract', 'amount': amount }, 'duranium': { 'action': 'subtract', 'amount': durcost }, 'tritanium': { 'action': 'subtract', 'amount': tritcost }, 'adamantium': { 'action': 'subtract', 'amount': adamcost }, 'turnresearched': { 'action': 'set', 'amount': True }, 'budget': { 'action': 'subtract', 'amount': amount }, } if world.sector == 'draco': amount = int(amount * 1.25) message = outcomes.researchtext(world, amount) actions.update( {'millevel': { 'action': 'add', 'amount': amount }}) result = outcomes.research('Success', result=message) if "moveship" in form: form = fleetwarpform(world, request.POST) if form.is_valid( ): #form checks practically everything but warpcost warpfleet = fleet.objects.get(pk=form.cleaned_data['fleet']) if warpfleet.enoughfuel(): tgtsector = form.cleaned_data['destination'] actions = { 'warpfuel': { 'action': 'subtract', 'amount': warpfleet.fuelcost() } } taskcontent = taskdata.warpfleet(warpfleet.name, warpfleet.sector, tgtsector) delay = (4 if tgtsector == warpfleet.sector else 8) outcometime = v.now() + time.timedelta(minutes=2) task = Task.objects.create(target=world, content=taskcontent, datetime=outcometime) newtask.fleet_warp.apply_async(args=(warpfleet.pk, warpfleet.name, tgtsector, task.pk), eta=outcometime) result = "%s bugs out and is warping to %s" % ( warpfleet.name, tgtsector) #actually altering data goes last utilities.atomic_fleet(warpfleet.pk, ['warp']) else: result = "Not enough warpfuel, %s needs %s more warpfuel to warp!" % \ (warpfleet.name, (warpfleet.fuelcost() - world.warpfuel)) if "train" in form: form = trainfleetform(world, form) if form.is_valid(): targetfleet = form.cleaned_data['fleet'] if world.budget < targetfleet.trainingcost(): result = outcomes.nomoney() elif targetfleet.training >= targetfleet.maxtraining(): result = outcomes.training('AtMax') else: actions = { 'budget': { 'action': 'subtract', 'amount': targetfleet.trainingcost() }, } utilities.atomic_fleet(targetfleet.pk, {'train': True}) if "buildshipyard" in form: if world.budget < 500: result = outcomes.nomoney() elif world.duranium < 5: result = outcomes.notenoughduranium() else: actions = { 'budget': { 'action': 'subtract', 'amount': 500 }, 'duranium': { 'action': 'subtract', 'amount': 1 }, 'shipyards': { 'action': 'add', 'amount': 1 }, } result = outcomes.shipyards('Success') if "attackrebels" in form: fleets = world.controlled_fleets.all() worldpower = utilities.militarypower(world, world.sector) fuelcost = int(0.1 * utilities.warpfuelcost(worldlist)) if world.budget < 10: result = outcomes.nomoney() elif world.rebels == 0: result = outcomes.norebels() elif world.warpfuel < fuelcost: result = 'You do not have enough warpfuel to hunt down the rebels!' elif worldpower == 0: result = 'You do not have a fleet to attack the rebels with!' else: world.budget = F('budget') - 10 world.warpfuel = F('warpfuel') - fuelcost totworldpower = utilities.powerallmodifiers( world, world.sector) rebelpower = 0 for f in fleets: rebelpower += f.basepower() # sum of total fleet power outcome = random.randint(1, 100) if (1 <= outcome < 5) or (30 < outcome <= 100): if 1 <= world.rebels < 20: rebelpower = 0.01 * rebelpower elif 20 <= world.rebels < 40: rebelpower = 0.02 * rebelpower elif 40 <= world.rebels < 60: rebelpower = 0.03 * rebelpower elif 60 <= world.rebels < 80: rebelpower = 0.04 * rebelpower elif world.rebels >= 80: rebelpower = 0.05 * rebelpower dmg = utilities.war_result(rebelpower, totworldpower, worldpower) utilities.warloss_byregion(world, world.sector, deflosses) if 30 < outcome <= 100: utilities.rebelschange(world, -5) elif 1 <= outcome <= 5: utilities.rebelschange(world, 5) utilities.wearinesschange(world, world.sector, -2) world.save(update_fields=['budget', 'warpfuel']) result = news.rebelresult(outcome, deflosses) if "rumsodmil" in form: targetname = form['targetname'] try: target = World.objects.get(world_name=targetname) except ObjectDoesNotExist: result = 'There is no such world by that name!' else: if world.rumsoddium != 4: result = 'You do not have enough rumsoddium for the ritual!' else: target.gdp = F('gdp') - int(target.gdp / 2) target.budget = F('budget') - D(target.budget / 2) target.warpfuel = F('warpfuel') - int(target.warpfuel / 2) target.duranium = F('duranium') - int(target.duranium / 2) target.tritanium = F('tritanium') - int( target.tritanium / 2) target.adamantium = F('adamantium') - int( target.adamantium / 2) world.rumsoddium = 0 world.save(update_fields=['rumsoddium']) target.save(update_fields=[ 'gdp', 'budget', 'warpfuel', 'duranium', 'tritanium', 'adamantium' ]) rumsodmsg = v.rumsodmilitary htmldata = news.rumsodmilitaryreceive(world) NewsItem.objects.create(target=target, content=htmldata) utilities.rumsoddiumhandout() if "buildflagship" in form: form = PersonalShipForm(request.POST) if form.is_valid(): data = form.cleaned_data shiptype = data['shiptype'] if world.flagshiptype != 0: result = outcomes.personalship('Already') elif shiptype not in [1, 2, 3]: result = 'Invalid shiptype selected!' elif world.budget < 500: result = outcomes.nomoney() elif (world.shipyards - world.shipyardsinuse) < 5: result = outcomes.notenoughshipyards() elif world.duranium < 20: result = outcomes.notenoughduranium() else: current_time = v.now() if current_time.hour > 12: hours = 24 - current_time.hour - 1 minutes = 60 - current_time.minute else: hours = 12 - current_time - 1 minutes = 60 - current_time.minute outcometime = v.now() + time.timedelta(hours=hours, minutes=minutes) world.budget = F('budget') - D(500) world.duranium = F('duranium') - 20 world.productionpoints = F('shipyardsinuse') + 25 world.flagshipbuild = True world.save(update_fields=[ 'budget', 'duranium', 'productionpoints', 'flagshipbuild' ]) taskdetails = taskdata.buildpersonalship(shiptype) task = Task(target=world, content=taskdetails, datetime=outcometime) task.save() newtask.buildpersonalship.apply_async(args=(world.pk, task.pk, shiptype), eta=outcometime) result = outcomes.personalship('Success', shiptype) if "scuttleflagship" in form: if world.flagshiptype == 0: result = 'You do not have a flagship to scuttle!' else: utilities.flagshipreset(world) result = 'You scuttled your flagship.' elif "setfleetprefs" in form: form = buildlocationform(world, request.POST) if form.is_valid(): prefs = world.preferences prefs.buildfleet = form.cleaned_data['buildchoice'] prefs.recievefleet = form.cleaned_data['recievechoice'] prefs.save() result = "Fleet preferences successfully updated" if actions: utilities.atomic_world(world.pk, actions) world.refresh_from_db() if world.wardefender.count() > 0: indefwar = True #create context dictionary with needed variables instead of fuckhuge return dict costs = [] ids = [] for f in world.fleets.all().filter(sector=world.sector): costs.append(f.trainingcost()) ids.append(f.pk) context = { 'costs': costs, 'ids': ids, 'result': result, 'researchform': ResearchForm(), 'buildtoform': buildlocationform(world, initial={ 'buildchoice': world.preferences.buildfleet.pk, 'recievechoice': world.preferences.recievefleet.pk }), 'moveform': fleetwarpform(world), 'prefs': world.shipsortprefs, 'buildlist': display.milpolicydisplay(world), 'rumpolicy': (True if world.rumsoddium == 4 else None), 'rumsodmsg': rumsodmsg, 'indefwar': (True if world.wardefender.count() > 0 else False), 'rebelfuelcost': rebelfuelcost, 'displayresearch': (True if v.tiers.index(world.techlevel) is len(v.tiers) else False), 'result': result, 'rumsodmsg': rumsodmsg, 'world': world, 'trainform': trainfleetform(world), } if world.techlevel != "Dreadnought": next_tier = v.tiers[v.tiers.index(world.techlevel) + 1] rdcost = shipdata[next_tier.replace(' ', '_').lower() + 's']['research'] context.update({'costmsg': rdcost, 'shiptext': next_tier}) return render(request, 'policies_military.html', context)
def fleet_warp(fleetpk, name, sector, taskpk): actions = {'set': {'sector': sector}} utilities.atomic_fleet(fleetpk, actions) outcome = "Fleet %s has arrived in sector %s at %s" % (name, sector, now()) Task.objects.filter(pk=taskpk).update(outcome=outcome)