from ..Utilities.ArenaUtils import weightedDictRandom, DictToOrderedDict from Objs.Events.Event import Event import collections import random import math def setupDiesFromExplosiveTrap(state): state["events"]["DiesFromExplosiveTrap"].eventStore.setdefault( "trapCounter", 0) state["events"]["DiesFromExplosiveTrap"].eventStore.setdefault( "trapMakerCounter", collections.OrderedDict()) Event.registerInsertedCallback("startup", setupDiesFromExplosiveTrap) # Manipulate the weight of the event based on the number of traps and who it is def modifyExplosiveTrapChance(actor, baseEventActorWeight, event): if event.name == "DiesFromExplosiveTrap": trapCounter = event.eventStore["trapCounter"] if trapCounter == 0: return 0, False return (1 + math.log(trapCounter, 2)) * baseEventActorWeight, True return baseEventActorWeight, True Event.registerInsertedCallback("modifyIndivActorWeights", modifyExplosiveTrapChance)
from Objs.Events.Event import Event from Objs.Events.IndividualEventHandler import IndividualEventHandler import random def checkSponsorLove(actor, sponsor, baseEventActorWeight, event): if event.name != "SponsorGivesTips": return baseEventActorWeight, True possible_love = actor.hasThing("Love") if not possible_love or str(possible_love[0].target) != str(sponsor): return baseEventActorWeight, True return baseEventActorWeight*event.stateStore[0]["settings"]["relationInfluence"], True Event.registerInsertedCallback( "modifyIndivActorWeightsWithSponsors", checkSponsorLove) def checkActorLove(actor, origWeight, event): if event.name == "SponsorGivesTips" and actor.hasThing("Love"): return (origWeight*event.stateStore[0]["settings"]["relationInfluence"]/3, True) Event.registerEvent("modifyIndivActorWeights", checkActorLove) def func(self, mainActor, state=None, participants=None, victims=None, sponsors=None): state["allRelationships"].IncreaseFriendLevel( mainActor, sponsors[0], random.randint(2, 3)) mainActor.permStatChange({'survivalism': 2, 'cleverness': 2}) # This cannot happen more than once eventHandler = IndividualEventHandler(state) eventHandler.banEventForSingleContestant( "SponsorGivesTips", mainActor.name)
return baseEventActorWeight, True return 0, False return baseEventActorWeight, True def checkParticipantLove(actor, participant, baseEventActorWeight, event): if event.name != "FriendGivesMedicine": return baseEventActorWeight, True possible_love = actor.hasThing("Love") if not possible_love or str(possible_love[0].target) != str(participant): return baseEventActorWeight, True return baseEventActorWeight * event.stateStore[0]["settings"][ "relationInfluence"], True Event.registerInsertedCallback("modifyIndivActorWeightsWithParticipants", checkParticipantMedicine) Event.registerInsertedCallback("modifyIndivActorWeightsWithParticipants", checkParticipantLove) def checkActorLove(actor, origWeight, event): if event.name == "FriendGivesMedicine" and actor.hasThing("Love"): return (origWeight * event.stateStore[0]["settings"]["relationInfluence"] / 3, True) Event.registerEvent("modifyIndivActorWeights", checkActorLove) def func(self, mainActor,
return for x in range(1, TURNS_UNTIL_FORCE_FIGHT + 1): comparison = len(state["callbackStore"]["contestantLog"][ turnNumber[0] - x + 1]) if x > 1 else len( liveContestants) # Because of potential callback order issues if len(state["callbackStore"]["contestantLog"] [turnNumber[0] - x]) > 3 or comparison != len( state["callbackStore"]["contestantLog"][turnNumber[0] - x]): return baseEventActorWeights["SponsorForceFight"] = 5 + \ state["events"]["SponsorForceFight"].eventStore.setdefault( "forceLevel", 0) state["events"]["SponsorForceFight"].eventStore["forceLevel"] += 2 Event.registerInsertedCallback("modifyBaseWeights", allowForceFight) def func(self, mainActor, state=None, participants=None, victims=None, sponsors=None): desc = "Tired of waiting, the sponsors force two of the remaining contestants to fight. " # Build dict of weights for various possibilities optionDict = collections.OrderedDict() optionDict['fight'] = 1 if state['allRelationships'].friendships[str(mainActor)][str( participants[0])] > 3 and state['allRelationships'].friendships[ str(participants[0])][str(mainActor)] > 3:
from Objs.Events.Event import Event from collections import defaultdict def countDaysWithoutWater(state): for contestant in state["contestants"].values(): if contestant.hasThing("Clean Water"): state["events"]["Dysentary"].eventStore["daysWithoutWater"][str( contestant)] = 0 else: state["events"]["Dysentary"].eventStore["daysWithoutWater"][str( contestant)] += 1 Event.registerInsertedCallback("postDayCallbacks", countDaysWithoutWater) def adjustDysenteryChance(actor, indivProb, event): if str(event) == "Dysentary": # initializes if not present, by default it always returns 0 event.eventStore.setdefault("daysWithoutWater", defaultdict(int)) # A simple linear multiplier, more merciful and easier than exponential indivProb *= event.eventStore["daysWithoutWater"][str(actor)] return indivProb, True Event.registerInsertedCallback("modifyIndivActorWeights", adjustDysenteryChance) def func(self,
from Objs.Events.Event import Event import random def fixedMadokamiCallback(contestantKey, thisevent, state, participants, victims, sponsorsHere, alreadyUsed): if thisevent.name == "MadokamiKillsBadWorshipper": del sponsorsHere[:] # Have to clear the list BUT keep the reference sponsorsHere.append(state["sponsors"]["Madokami"]) return True, False Event.registerInsertedCallback("overrideContestantEvent", fixedMadokamiCallback) def func(self, mainActor, state=None, participants=None, victims=None, sponsors=None): success = random.randint(0, 1) if success: mainActor.kill() desc = sponsors[0].name + ' struck down ' + mainActor.name + " for " + \ Event.parseGenderPossessive(mainActor) + " blasphemous beliefs." tempList = [sponsors[0], mainActor] del state["events"]["AWorshipsB"].eventStore[mainActor.name] deadList = [mainActor.name] else:
from Objs.Events.Event import Event import random def fixedHomuciferCallback(contestantKey, thisevent, state, participants, victims, sponsorsHere, alreadyUsed): if thisevent.name == "HomuciferKillsBadWorshipper": del sponsorsHere[:] # Have to clear the list BUT keep the reference sponsorsHere.append(state["sponsors"]["Akuma Homura"]) return True, False Event.registerInsertedCallback("overrideContestantEvent", fixedHomuciferCallback) def func(self, mainActor, state=None, participants=None, victims=None, sponsors=None): success = random.randint(0, 1) if success: mainActor.kill() desc = sponsors[0].name + ' struck down ' + mainActor.name + " for " + \ Event.parseGenderPossessive(mainActor) + " dangerous beliefs." tempList = [sponsors[0], mainActor] del state["events"]["AWorshipsB"].eventStore[mainActor.name] deadList = [mainActor.name] else:
skippers = state["events"]["DoNothing"].eventStore[ "CornucopiaDoNothing"] if skippers: thisWriter = state.get("thisWriter") if thisWriter is not None: state["thisWriter"].addEvent( "The following contestants chose to skip the Cornucopia: " + Event.englishList(skippers), skippers) else: print( "The following contestants chose to skip the Cornucopia: " + Event.englishList(skippers)) skippers.clear() Event.registerInsertedCallback("postPhaseCallbacks", cornucopiaEndPhaseCallback) def func(self, mainActor, state=None, participants=None, victims=None, sponsors=None): # This is a dummy event, representing the character not participating. For display purposes, these are only displayed at the end of the turn. listNothing = self.eventStore.setdefault("CornucopiaDoNothing", []) listNothing.append(mainActor) return (None, [mainActor], []) Event.registerEvent("DoNothing", func)