Hardware components | ||||||
| × | 1 | ||||
Software apps and online services | ||||||
| ||||||
|
I was playing The Division video game with my friends, and the game has a digital companion which gives the player useful information during gameplay. It is an in-game computer called ISAC (Intelligent System Analytic Computer) which communicates to the player through a computerized voice. However, the computer is not accessible by the player; instead the player just receives information from the computer at appropriate times during gameplay. So I thought it would be useful if the player could initiation an interaction with the game's computer and get useful information back.
So to solve this problem, I created "Issac for The Division". I couldn't call it ISAC because that name is already trademarked by the publisher of the video game. Issac for The Division is some python code that lives in Amazon Web Services Lambda where the Alexa Skills Kit initiated by a user's voice interaction with Alexa calls the python code in Lambda and is returned information about the video game.
Unfortunately, the video game developers do not have any sort of API available so that community created apps can interact with their game, so all information about the game that Alexa is able to return is just stored within the python code in Lambda. However, I was able to data mine some useful information, such as an accurate list of future daily missions that was found to be hard coded into the responses sent via the game servers to the client machines.
The skill is published in the Amazon Alexa Skill store at this location:
http://alexa.amazon.com/#skills/amzn1.echo-sdk-ams.app.033d18de-33cd-4478-ae35-98fddfda4510
Here's is a video of the beta in action from last month:
Sample questionsBelow are some sample questions you can ask Issac to get information about missions, talents, skills, specific story characters, and other important information. [Replace Stuff in brackets by anything relevant]:
1) Alexa, ask Issac for the Daily Missions
2) Alexa, ask Issac how long until reset.
3) Alexa, ask Issac about the skill [Support Station]
4) Alexa, ask Issac about the talent [Reckless]
5) Alexa, ask Issac about [Jessica Kandel]
6) Alexa, ask Issac about [Cleaners]
Issac for The Division
Pythonfrom __future__ import division
from __future__ import print_function
import datetime
import urllib
import urllib2
import logging
import re
from urllib import urlopen
from urllib import FancyURLopener
def lambda_handler(event, context):
print("event.session.application.applicationId=" +
event['session']['application']['applicationId'])
if (event['session']['application']['applicationId'] !=
"amzn1.echo-sdk-ams.app.033d18de-33cd-4478-ae35-98fddfda4510"):
raise ValueError("Invalid Application ID")
if event['session']['new']:
on_session_started({'requestId': event['request']['requestId']},
event['session'])
if event['request']['type'] == "Launch":
return on_launch(event['request'], event['session'])
elif event['request']['type'] == "IntentRequest":
return on_intent(event['request'], event['session'])
elif event['request']['type'] == "SessionEndedRequest":
return on_session_ended(event['request'], event['session'])
else:
return get_welcome_response()
def on_session_started(session_started_request, session):
print("on_session_started requestId=" + session_started_request['requestId']
+ ", sessionId=" + session['sessionId'])
def on_launch(launch_request, session):
print("on_launch requestId=" + launch_request['requestId'] +
", sessionId=" + session['sessionId'])
return get_welcome_response()
def on_intent(intent_request, session):
print("on_intent requestId=" + intent_request['requestId'] +
", sessionId=" + session['sessionId'])
intent = intent_request['intent']
intent_name = intent_request['intent']['name']
print("intent_name = " + str(intent_name))
if intent_name == "DescribeTalents":
return describe_talent(intent, session)
elif intent_name == "DescribeSkills":
return describe_skill(intent, session)
elif intent_name == "ExplainAaronKeener":
return explain_aaronkeener(intent, session)
elif intent_name == "ExplainBaseOfOperations":
return explain_baseofoperations(intent, session)
elif intent_name == "ExplainCERA":
return explain_cera(intent, session)
elif intent_name == "ExplainCharlesBliss":
return explain_charlesbliss(intent, session)
elif intent_name == "ExplainClasses":
return explain_classes(intent, session)
elif intent_name == "ExplainCleaners":
return explain_cleaners(intent, session)
elif intent_name == "ExplainConsumables":
return explain_consumables(intent, session)
elif intent_name == "ExplainCredits":
return explain_credits(intent, session)
elif intent_name == "ExplainDarkZone":
return explain_darkzone(intent, session)
elif intent_name == "ExplainDivision":
return explain_division(intent, session)
elif intent_name == "ExplainECHO":
return explain_echo(intent, session)
elif intent_name == "ExplainEncounters":
return explain_encounters(intent, session)
elif intent_name == "ExplainFayeLau":
return explain_fayelau(intent, session)
elif intent_name == "ExplainGordonAmherst":
return explain_gordonamherst(intent, session)
elif intent_name == "ExplainGreenPoison":
return explain_greenpoison(intent, session)
elif intent_name == "ExplainGrenades":
return explain_grenades(intent, session)
elif intent_name == "ExplainGrinding":
return explain_grinding(intent, session)
elif intent_name == "ExplainIncursions":
return explain_incursions(intent, session)
elif intent_name == "ExplainIntel":
return explain_intel(intent, session)
elif intent_name == "ExplainIssac":
return explain_issac(intent, session)
elif intent_name == "ExplainJessicaKandel":
return explain_jessicakandel(intent, session)
elif intent_name == "ExplainJoeFerro":
return explain_joeferro(intent, session)
elif intent_name == "ExplainJTF":
return explain_jtf(intent, session)
elif intent_name == "ExplainLevel":
return explain_level(intent, session)
elif intent_name == "ExplainLMB":
return explain_lmb(intent, session)
elif intent_name == "ExplainMissions":
return explain_missions(intent, session)
elif intent_name == "ExplainPaulRhodes":
return explain_paulrhodes(intent, session)
elif intent_name == "ExplainRikers":
return explain_rikers(intent, session)
elif intent_name == "ExplainRioters":
return explain_rioters(intent, session)
elif intent_name == "ExplainRoyBenitez":
return explain_roybenitez(intent, session)
elif intent_name == "ExplainWiping":
return explain_wiping(intent, session)
elif intent_name == "GetDailyMissions":
return get_daily_missions(intent, session)
elif intent_name == "ListTalentsForGear":
return list_talents_for_gear(intent, session)
elif intent_name == "WhenIsReset":
return whenisreset(intent, session)
elif intent_name == "AMAZON.HelpIntent":
return get_help_response()
elif intent_name == "AMAZON.StopIntent":
return get_stop_response()
elif intent_name == "AMAZON.CancelIntent":
return get_cancel_response()
else:
return get_welcome_response()
def on_session_ended(session_ended_request, session):
print("on_session_ended requestId=" + session_ended_request['requestId'] +
", sessionId=" + session['sessionId'])
# --------------- Functions that control the skill's behavior ------------------
def get_help_response():
session_attributes = {}
card_title = "Issac's Help System"
speech_output = "I am here to help. You can ask " \
"me for the daily missions, how long until reset, to describe a talent or skill." \
"or get information about specific characters in the game. " \
"What would you like to know?"
reprompt_text = speech_output
should_end_session = False
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
def get_stop_response():
session_attributes = {}
card_title = "Issac's Goodbye Message"
speech_output = "Thank you for using Issac. Please don't forget to rate this skill and leave feedback. "
reprompt_text = speech_output
should_end_session = True
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
def get_cancel_response():
session_attributes = {}
card_title = "Issac's Cancel Message"
speech_output = "Okay. Request cancelled."
reprompt_text = speech_output
should_end_session = True
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
def get_welcome_response():
session_attributes = {}
card_title = "Issac's Welcome Message"
speech_output = "This is Issac your digital companion " \
"for the video game The Division. You can ask " \
"me about anything I should know. If you want specific examples just say, help."
reprompt_text = speech_output
should_end_session = False
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
def explain_aaronkeener(intent, session):
card_title = "Issac Explaining Aaron Keener"
session_attributes = {"Explain": "Aaron Keener" }
should_end_session = True
description = "Agent, Aaron Keener is a Strategic Homeland Division agent that has gone rogue " \
"and creatd their own unit with other First Wave agents. Keener's codename is Vanguard. " \
"Keener has stolen Gordon Amherst's virus manufacturing process and is planning to continue Amherst's work. " \
"He believes The Division no longer functions now that the epidemic has destroyed the world they were supposed to protect. "
speech_output = description
reprompt_text = speech_output
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
def explain_baseofoperations(intent, session):
card_title = "Issac Explaining Base of Operations"
session_attributes = {"Explain": "Base of Operations" }
should_end_session = True
description = "Agent, the Base of Operations is one of the first areas unlocked in Manhattan. " \
"It is located in Pennsylvania Plaza at the James Farley Post Office. It was converted by CERA into a contamination " \
"screening station and later into a Joint Task Force stronghold with Division Agent support. " \
"It is a safe place to purchase and upgrade weapons and contains three Wings that can be upgraded for obtain new skills, talents, and perks."
speech_output = description
reprompt_text = speech_output
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
def explain_cera(intent, session):
card_title = "Issac Explaining CERA"
session_attributes = {"Explain": "CERA" }
should_end_session = True
description = "Agent, The Catastrophic Emergency Response Agency known as CERA is a federal agency which was created to deal " \
"with large scale natural disasters. In The Division, they are the group most focused on halting and containing " \
"the spread of the Green Poison virus, and their efforts include quarantine zones, medical facilities, and supply " \
"distribution centers."
speech_output = description
reprompt_text = speech_output
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
def explain_charlesbliss(intent, session):
card_title = "Issac Explaining Charles Bliss"
session_attributes = {"Explain": "Charles Bliss" }
should_end_session = True
description = "Agent, Lieutenant Colonel Charles Bliss is the commander of the Last Man Battalion. Bliss was hired by Wall Street " \
"to protect their assets, but after they were trapped behind the quarantine zone, Bliss took matters into his own hands " \
"and started carving out New York for himself, promising to take it back from the 'liars and thieves.' " \
"He betrayed the Joint Task Force and The Division along with rogue agent Aaron Keener. " \
"Charles Bliss was killed in a helicopter crash, during the attack on the United Nations Embassy. "
speech_output = description
reprompt_text = speech_output
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
def explain_classes(intent, session):
card_title = "Issac Explaining Classes"
session_attributes = {"Explain": "Classes" }
should_end_session = True
description = "Agent, classes are not specifically chosen in The Division. However, you can adjust your " \
"gear, talents, and skills to change your loadout and stats to match a traditional specialized role or class. " \
"The holy trinity of classes in M.M.O.R.P.G games are the three roles of Tank, Medic, and D.P.S. " \
"A tank's job is to grab all enemy fire. A medic's job is to heal allies. A D.P.S's job is to deal damage to enemies. "
speech_output = description
reprompt_text = speech_output
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
def explain_cleaners(intent, session):
card_title = "Issac Explaining Cleaners"
session_attributes = {"Explain": "Cleaners" }
should_end_session = True
description = "Agent, The Cleaners are former New York City sanitation workers (Garbage men, janitors, custodians, etc.) who " \
"lost everything during the outbreak. Formed by Joe Ferro, they are convinced that the only way to save the city " \
"from the virus is to burn everything down, including the people still living in it."
speech_output = description
reprompt_text = speech_output
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
def explain_consumables(intent, session):
card_title = "Issac Explaining Consumables"
session_attributes = {"Explain": "Consumables" }
should_end_session = True
description = "Agent, Consumables give your character a temporary buff. There are six types: Canned Food, Energy Bars, " \
"Water, Soda, Incendiary Bullets, and Explosive Bullets. " \
"To select a consumable type hold right on the D pad. To use a consumable quickly press right on the D pad. " \
"Canned Food, when consumed increases healing effects on player by 40%. The effect lasts 30 seconds. " \
"Energy Bar, when consumed instantly removes all negative Status Effects on the player and protects the player from all " \
"Status Effects for 5 seconds. " \
"Water, when consumed increases all damage dealt to elite enemies by 20%. The effect lasts 30 seconds. " \
"Soda, when consumed reduces all cooldowns on skills by 30%. The effect lasts 30 seconds. " \
"Incendiary Bullets, when used have a chance to light a target on fire. " \
"Explosive Bullets, have a chance to deal area of effect damage. " \
"You can collect canned food, energy bars and water consumables from the Medical Wing by upgrading the Disaster Aid. " \
"You can collect incendiary and explosive bullets from the Security Wing after upgrading the Guard Post. "
speech_output = description
reprompt_text = speech_output
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
def explain_credits(intent, session):
card_title = "Issac Explaining Credits"
session_attributes = {"Explain": "Credits" }
should_end_session = True
description = "Agent, there are three in-game currencies: credits, dark zone funds, and phoenix credits. Credits are earned " \
"outside the dark zone and can be used to purchase basic gear outside the dark zone. Dark zone funds are earned " \
"inside the dark zone and can be used to purchase gear and blueprints inside the dark zone. " \
"Phoenix Credits are the most useful currency used to purchase high end gear and high end blueprints inside and outside " \
"of the dark zone. You can earn phoenix credits by killing named bosses and doing daily missions which are available " \
"after you reach level 30. Phoenix Credits have a maximum carry capacity of 1000."
speech_output = description
reprompt_text = speech_output
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
def explain_darkzone(intent, session):
card_title = "Issac Explaining Dark Zone"
session_attributes = {"Explain": "Dark Zone" }
should_end_session = True
description = "Agent, the Dark Zone is a contaminated quarantine zone, it is a dangerous place. " \
"Called the D.Z. for short, it has it's own separate level system and currency, both colored purple. " \
"Agents are allowed to shoot other agents in the Dark Zone making them into Rogue Agents. " \
"Any loot obtained in the Dark Zone must be extracted via helicopter at an Extraction Zone. " \
"If you die in the Dark Zone you lose XP and D.Z. funds, and any items carried are lootable by other players. " \
"Dark Zone funds earned in the Dark Zone are purple and can be spent at the Dark Zone Vendor and at checkpoints " \
"and safe houses inside the Dark Zone."
speech_output = description
reprompt_text = speech_output
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
def explain_division(intent, session):
card_title = "Issac Explaining The Division"
session_attributes = {"Explain": "The Division" }
should_end_session = True
description = "Agent, the Strategic Homeland Division, also known as 'The Division', is a classified unit of highly trained, " \
"self-supported tactical agents appearing in Tom Clancy's The Division. The main objective of The Division is to " \
"ensure the continuity of government in the case of a catastrophic emergency. " \
"Division agents are activated when all other forms of public protection have failed."
speech_output = description
reprompt_text = speech_output
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
def explain_echo(intent, session):
card_title = "Issac Explaining ECHO"
session_attributes = {"Explain": "ECHO" }
should_end_session = True
description = "Agent, The ECHO system is a major game mechanic in Tom Clancy's The Division. Using data mined from surveillance cameras, " \
"discarded smartphones and the like, the player's smartwatch is able to project 3D holograms of prior moments " \
"frozen in time. It functions as a story mechanic, an alternative to cutscenes, they fill the player in on events that have " \
"occurred in the city. "
speech_output = description
reprompt_text = speech_output
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
def explain_encounters(intent, session):
card_title = "Issac Explaining Encounters"
session_attributes = {"Explain": "Encounters" }
should_end_session = True
description = "Agent, encounters are the colored triangles on the map. They are obtained by reading the Briefing Board in each safe house. " \
"Encounters can only be completed once for X.P. and 60 points towards upgrading the Wings in your Base of Operations. " \
"Green encounters give Medical Wing points. Blue encounters give Security Wing points, and Yellow encounters give Tech Wing points. "
speech_output = description
reprompt_text = speech_output
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
def explain_fayelau(intent, session):
card_title = "Issac Explaining Faye Lau"
session_attributes = {"Explain": "Faye Lau" }
should_end_session = True
description = "Agent, Faye Lau is an Strategic Homeland Division agent activated after Black Friday as part of the second wave of agents " \
"tasked with saving what remains of New York City. After a field accident left her left leg and right eye severely injured, " \
"Lau now serves as a handler, responsible for the base's maintenance and collecting and giving intel to the player."
speech_output = description
reprompt_text = speech_output
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
def explain_gordonamherst(intent, session):
card_title = "Issac Explaining Gordon Amherst"
session_attributes = {"Explain": "Gordon Amherst" }
should_end_session = True
description = "Agent, Gordon Amherst is the individual behind the Green Poison, or Dollar Flu. His whereabouts were unknown " \
"until the he was found dead in an empty laboratory. Jessica Kandel had contempt for him prior to the outbreak, " \
"and some of his viewpoints and speeches nearly caused a riot at a campus." \
"He created the Green Poison because he believed humanity was too powerful and needed to be put in check. "
speech_output = description
reprompt_text = speech_output
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
def explain_greenpoison(intent, session):
card_title = "Issac Explaining Green Poison"
session_attributes = {"Explain": "Green Poison" }
should_end_session = True
description = "Agent, The Green Poison (also known as Dollar Flu) is a previously unknown strain of the smallpox virus " \
"with no functional vaccine or cure. Compared to the original smallpox, not only does it incubate faster, " \
"it is also infectious during the incubation period, meaning it spreads and takes affect much more quickly. " \
"Some people who are immune to catching this virus, but they are largely in the minority. " \
"The virus was created by Doctor Gordon Amherst as a means of population control, and was distributed via " \
"infected dollar bills during the Black Friday shopping craze."
speech_output = description
reprompt_text = speech_output
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
def explain_grenades(intent, session):
card_title = "Issac Explaining Grenades"
session_attributes = {"Explain": "Grenades" }
should_end_session = True
description = "Agent, Grenades have six types: E.M.P., Flashbang, Fragmentation, Incendiary, Shock, and Tear Gas. " \
"Select a grendade type by holding left on the D pad. Then choose a location to throw by quickly pressing left on the D pad. " \
"Once you select a location to throw it, press your trigger firing button and it will throw the grenade. " \
"E.M.P. Grenades apply Disrupt, which will destroy any active skills caught in the blast. " \
"E.M.P. Grenades also prevent the affected enemies from deploying any new skills for a period of time. " \
"Flashbang Grenades deal Blind Deaf, which will temporarily impair the vision and hearing of any enemy caught in the blast. " \
"Fragmentation Grenades deal high damage and have a chance to apply Bleed. " \
"Incendiary Grenades release fire on detonation. This fire has a chance to apply Burn to any enemy caught in the blast. " \
"Burn will drain an enemy's health over time. " \
"Shock Grenades apply Shock, which will temporarily paralyze any enemy caught in the blast radius and also deal damage. " \
"Tear Gas Grenades apply 'Disoriented', which will temporarily impair the vision, as well as the accuracy, " \
"of any enemy caught in the blast. "
speech_output = description
reprompt_text = speech_output
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
def explain_grinding(intent, session):
card_title = "Issac Explaining Grinding"
session_attributes = {"Explain": "Grinding" }
should_end_session = True
description = "Agent, grinding is the process of repeating a boss or mission to obtain desired loot drops. " \
"There have been several exploits in this game that some are calling Loot Caves. " \
"Some notable ones were Bullet King, and the Russian Consulate which allowed you to use " \
"Mobile Cover to glitch through the back fence to spawn, rinse, and wipe the final boss over and over again. "
speech_output = description
reprompt_text = speech_output
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
def explain_incursions(intent, session):
card_title = "Issac Explaining Operations"
session_attributes = {"Explain": "Operations" }
should_end_session = True
incursion_description = "Agent, Operations which were formerly called Incursions, are the end game content for The Division similar to raids. " \
"They are focused on squad based game play and will ultimately lead to each individual getting the game's best loot. " \
"The first Operation is free and is titled : Last Stronghold. It is in the Stuyvesant district at the bottom right of the map."
speech_output = incursion_description
reprompt_text = speech_output
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
def explain_intel(intent, session):
card_title = "Issac Explaining Intel"
session_attributes = {"Explain": "Intel" }
should_end_session = True
description = "Agent, there are 293 collectables in The Division video game. These are intel collected of the following six types: " \
"Crashed Drones, Phone Recordings, Echo Scenes, Incident Reports, Survival Guides, and Missing Agents. " \
"Collecting all the intel will help further the story and grant trophies or achievements. " \
"If you clear all encounters and side missions from a district, and have purchased the Canine Unit from the Base of Operations, " \
"then all intel locations will display on your map. "
speech_output = description
reprompt_text = speech_output
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
def explain_issac(intent, session):
card_title = "Issac Explaining Issac"
session_attributes = {"Explain": "Issac" }
should_end_session = True
description = "Agent, I am Issac, then Intelligent System Analytic Computer, I will assist and accompany you throughout " \
"your journey in Tom Clancy's The Division video game."
speech_output = description
reprompt_text = speech_output
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
def explain_jessicakandel(intent, session):
card_title = "Issac Explaining Jessica Kandel"
session_attributes = {"Explain": "Jessica Kandel" }
should_end_session = True
description = "Agent, Doctor Jessica Kandel is a virologist working with the Joint Task Force to find a cure " \
"to the Green Poison strain of the virus. Jessica and her wife Alexis Kwan got divorced a few months before the epidemic."
speech_output = description
reprompt_text = speech_output
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
def explain_joeferro(intent, session):
card_title = "Issac Explaining Joe Ferro"
session_attributes = {"Explain": "Joe Ferro" }
should_end_session = True
description = "Agent, Joe Ferro is a former sanitation worker and the founder and leader of the Cleaners. His headquarters makes the " \
"napalm that the cleaners use to fuel their flame throwers. He has been defeated by the players but respawns and replays."
speech_output = description
reprompt_text = speech_output
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
def explain_jtf(intent, session):
card_title = "Issac Explaining JTF"
session_attributes = {"Explain": "JTF" }
should_end_session = True
description = "Agent, the Joint Task Force or J.T.F. is a coalition of police officers, fire fighters, volunteers, and U.S. military personnel " \
"led by Roy Benitez that was formed after the events of Black Friday to take back New York City. "
speech_output = description
reprompt_text = speech_output
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
def explain_level(intent, session):
card_title = "Issac Explaining Leveling"
session_attributes = {"Explain": "Leveling" }
should_end_session = True
description = "Agent, in Tom Clancy's The Division video game, your 'Level' is the orange bar and number at the top right. " \
"You increase your level by earning X.P. through killing enemies and completing missions, side missions, and " \
"encounters outside of the Dark Zone. The maximum level at game launch is level 30. Your level cannot decrease. " \
"Once you reach rank 30 you unlock Daily Missions to earn Phoenix Credits." \
"The Dark Zone has a separate levelling system which is a purple Dark Zone Rank. When you die in the Dark Zone " \
"You can lose Dark Zone X.P. and can decrease in Dark Zone Rank. At game launch you must reach rank 30 in the Dark Zone " \
"To spend Dark Zone funds, although most worthwhile purchases require rank 50. The maximum rank is 99."
speech_output = description
reprompt_text = speech_output
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
def explain_lmb(intent, session):
card_title = "Issac Explaining LMB"
session_attributes = {"Explain": "LMB" }
should_end_session = True
description = "Agent, the Last Man Battalion, better known as the L.M.B, is a private military company led by Charles Bliss. " \
"The LMB was hired by prestigious Wall Street companies to protect assets during the outbreak, but where abandoned when the crisis " \
"worsened. Now they aim to retake New York and establish a new world order by force. "
speech_output = description
reprompt_text = speech_output
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
def explain_missions(intent, session):
card_title = "Issac Explaining Missions"
session_attributes = {"Explain": "Missions" }
should_end_session = True
description = "Agent, missions are available on the map. The main benefit is they extend the story and provide XP for leveling up. " \
"Side missions are also available to play through one time and can be added by talking to the district safe house's J.T.F. officer. " \
"Regular missions only reward XP one time for the same amount regardless of difficulty. " \
"The difficulty for regular missions can be changed at the mission start. " \
"After reaching level 30 outside the Dark Zone, you can play each Daily Hard Mission once per day for 15 phoenix coins each. " \
"and you can also play a Daily Challenge Mission as many times as you like for 30 phoenix credits and guaranteed high end gear."
speech_output = description
reprompt_text = speech_output
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
def explain_paulrhodes(intent, session):
card_title = "Issac Explaining Paul Rhodes"
session_attributes = {"Explain": "Paul Rhodes" }
should_end_session = True
description = "Agent, Paul Rhodes is a former member of the Last Man Battalion and an engineer working with the Joint Task Force. " \
"He is in charge of the Technical Wing and works to keep the power, supply lines, and the communications network intact for Manhattan."
speech_output = description
reprompt_text = speech_output
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
def explain_rikers(intent, session):
card_title = "Issac Explaining Rikers"
session_attributes = {"Explain": "Rikers" }
should_end_session = True
description = "Agent, The Rikers are escaped convicts from Rikers Island. They come from various gangs but they decided to unite " \
"under LaRae Barrett for the sake of the 'power by numbers' motto. Unlike the thug Rioters who are simply taking " \
"advantage of the anarchy, the Rikers are hardened criminals who revel in it, even threatening to plunge the city " \
"into the stone age if they can not claim New York for themselves. Riker enemy types are: enforcers, slingers, runners, " \
"hitmen, guards, and bosses."
speech_output = description
reprompt_text = speech_output
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
def explain_rioters(intent, session):
card_title = "Issac Explaining Rioters"
session_attributes = {"Explain": "Rioters" }
should_end_session = True
description = "Agent, Rioters are groups of common thugs and criminals that just want to rob and kill others for the sake of survival. " \
"Standard rioters are armed with pistols, but the group also has enemy types of: Dare Devils, Lurkers, Lookouts, " \
"Bruisers, and Heavy Weapons."
speech_output = description
reprompt_text = speech_output
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
def explain_roybenitez(intent, session):
card_title = "Issac Explaining Roy Benitez"
session_attributes = {"Explain": "Roy Benitez" }
should_end_session = True
description = "Agent, Roy Benitez is a former New York City police officer and the leader of the Joint Task Force. He commands the " \
"Security Wing and plans operations to take back the city from the various factions that have taken over."
speech_output = description
reprompt_text = speech_output
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
def explain_wiping(intent, session):
card_title = "Issac Explaining Wiping"
session_attributes = {"Explain": "Wiping" }
should_end_session = True
description = "Agent, Wiping is a gaming term that many players will use to reset an encounter. They may say things like 'Lets just wipe it.' " \
"Which means everyone should kill themselves so the group can start over from the last checkpoint. "
speech_output = description
reprompt_text = speech_output
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
def describe_talent(intent, session):
card_title = "Issac Describing a Talent"
session_attributes = {}
should_end_session = True
if 'Talent' in intent['slots']:
if 'value' in intent['slots']['Talent']:
talent = intent['slots']['Talent']['value'].title()
else:
talent = "Talent"
if talent == "1st Aid":
talent_description = "is a Skill not a Talent."
elif talent == "1St Aid":
talent_description = "is a Skill not a Talent."
elif talent == "first aid":
talent_description = "is a Skill not a Talent."
elif talent == "Support Station":
talent_description = "is a Skill not a Talent."
elif talent == "Recovery Link":
talent_description = "is a Skill not a Talent."
elif talent == "Recovery Lake":
talent_description = "is a Skill not a Talent."
elif talent == "Recovery Like":
talent_description = "is a Skill not a Talent."
elif talent == "Sticky Bomb":
talent_description = "is a Skill not a Talent."
elif talent == "Turrent":
talent_description = "is a Skill not a Talent."
elif talent == "Seeker Mine":
talent_description = "is a Skill not a Talent."
elif talent == "Tactical Link":
talent_description = "is a Skill not a Talent."
elif talent == "Tactical Lake":
talent_description = "is a Skill not a Talent."
elif talent == "Tactical Like":
talent_description = "is a Skill not a Talent."
elif talent == "Ballistic Shield":
talent_description = "is a Skill not a Talent."
elif talent == "Smart Cover":
talent_description = "is a Skill not a Talent."
elif talent == "Mobile Cover":
talent_description = "is a Skill not a Talent."
elif talent == "Survivor Link":
talent_description = "is a Skill not a Talent."
elif talent == "Survivor Lake":
talent_description = "is a Skill not a Talent."
elif talent == "Survivor Like":
talent_description = "is a Skill not a Talent."
elif talent == "Talent":
session_attributes = create_talent_attributes(talent)
speech_output = "Agent, I didn't recognize that talent. " \
"Please try again."
reprompt_text = speech_output
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
else:
talent_description = create_talent_description(talent)
session_attributes = create_talent_attributes(talent)
speech_output = "Agent, the talent " + talent + " " + talent_description
reprompt_text = speech_output
else:
speech_output = "Agent, I didn't recognize that talent. " \
"Please try again."
reprompt_text = speech_output
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
def create_talent_attributes(talent):
return {"Talent": talent}
def create_talent_description(talent):
if talent == "Accurate":
talent_description = "says that accuracy is increased by X percent. It is only available on weapons."
elif talent == "Adept":
talent_description = "says that using a skill increases your critical hit chance by X percent for Y seconds. It is only available on weapons."
elif talent == "Astute":
talent_description = "says that the first 3 bullets of your magazine have a 9.5% higher chance to do a critical hit. It is only available on Gloves gear and as a weapon talent."
elif talent == "Balanced":
talent_description = "says that the weapon reaches max accuracy faster when shouldering. It is only available on weapons."
elif talent == "Brutal":
talent_description = "says that headshot damage is increased by X percent when using this weapon. It is only available on weapons."
elif talent == "Capable":
talent_description = "says that using a skill improves the handling of your weapon for X seconds. It is only available on weapons."
elif talent == "Commanding":
talent_description = "says that every kill performed while the Signature Skill is active extends its duration by X percent. It is only available on weapons."
elif talent == "Competent":
talent_description = "says that weapon damage is increased by X percent for Y seconds after using a skill. It is only available on weapons."
elif talent == "Cool Headed":
talent_description = "says that performing a headshot reduces all skill cooldowns by X percent. It is only available on weapons."
elif talent == "Deadly":
talent_description = "says that critical hit damage is increased by X percent. It is only available on weapons."
elif talent == "Destructive":
talent_description = "says that armor destruction value is increased by X percent when using this weapon. It is only available on weapons."
elif talent == "Determined":
talent_description = "says that killing a target reduces skill cooldowns by X percent. It is only available on weapons."
elif talent == "Dominant":
talent_description = "says that every kill performed while your Signature Skill is active reduces the cooldown of your other skills by X percent. It is only available on weapons."
elif talent == "Expert":
talent_description = "says that the weapon deals 100% more damage when the target is below 30% health. It is only available on weapons."
elif talent == "Ferocious":
talent_description = "says that damage against elite and named enemies is increased by X percent. It is only available on weapons."
elif talent == "Fierce":
talent_description = "says that critical hit chance is increased by X percent when using this weapon. It is only available on weapons."
elif talent == "Harmful":
talent_description = "says that each hit has a X percent chance to apply the Bleed Status Effect to the target. It is only available on weapons."
elif talent == "Intense":
talent_description = "says that the first bullet of a magazine has a X percent chance to apply the On Fire Status Effect to the target. It is only available on weapons."
elif talent == "Meticulous":
talent_description = "says that killing a target has a X percent chance to instantly refill the magazine. It is only available on weapons."
elif talent == "Predatory":
talent_description = "says that killing a target regenerates X percent health over Y seconds. It is only available on weapons."
elif talent == "Prepared":
talent_description = "says that damage is increased by X percent when more than Y meters from the target. It is only available on weapons."
elif talent == "Proficient":
talent_description = "says that the first bullet shot when out of combat has a X percent bonus chance to result in a critical hit. It is only available on weapons."
elif talent == "Provident":
talent_description = "says that the last bullet of a magazine deals X percent more damage. It is only available on weapons."
elif talent == "Responsive":
talent_description = "says that damage is increased by X percent when closer than Y meters to the target. It is only available on weapons."
elif talent == "Restored":
talent_description = "says that killing a target with this weapon removes all negative Status Effects. It is only available on weapons."
elif talent == "Self-preserved":
talent_description = "says that critical hits with this weapon heal the user for X percent of damage dealt. It is only available on weapons."
elif talent == "Skilled":
talent_description = "says that headshot kills with this weapon increase Signature Skill resources by X percent. It is only available on weapons."
elif talent == "Stable":
talent_description = "says that stability is improved by X percent. It is only available on weapons."
elif talent == "Sustained":
talent_description = "says that killing a target increases your health by X percent. It is only available on weapons."
elif talent == "Swift":
talent_description = "says that reloading is X percent faster. It is only available on weapons."
elif talent == "Toxic":
talent_description = "says that headshots with this weapon have a X percent chance to apply the Blind Status Effect. It is only available on weapons."
elif talent == "Trained":
talent_description = "says that critical hits increase Signature Skill resources by X percent. It is only available on weapons."
elif talent == "Unforgiving":
talent_description = "says that missing health segments increase your damage: 1 missing segment plus X percent, 2 missing segments Y percent. It is only available on weapons."
elif talent == "Vicious":
talent_description = "says that hit chance is increased by X percent while at full health. It is only available on weapons."
elif talent == "Adrenaline":
talent_description = "provides an over-heal effect when you use a medical kit and are not already at full health. It is available to equip in your medical talent list."
elif talent == "Shock and Awe":
talent_description = "says that supressing an enemy will give you a 25% boost to your movement speed for a short period of time. It is available to equip in your medical talent list."
elif talent == "Combat medic":
talent_description = "says that using a medical kit will heal nearby allies for a small amount. It is available to equip in your medical talent list."
elif talent == "Critical Save":
talent_description = "says that using a medical kit at low health will provide a 40% boost to damage done. It is available to equip in your medical talent list."
elif talent == "Strike Back":
talent_description = "says that low health will grant a bonus to your skill cooldown rate. It is available to equip in your medical talent list."
elif talent == "Battle Buddy":
talent_description = "says that reviving a fallen squad member will give both of you a 50% reduction to damage received for 10 seconds. It is available to equip in your medical talent list."
elif talent == "Shrapnel":
talent_description = "says that landing a bleed effect gives a chance to apply the bleed to nearby enemies. It is available to equip in your medical talent list."
elif talent == "Triage":
talent_description = "says that using one of your skill heals on an ally reduces the cooldown of your other skills. It is available to equip in your medical talent list."
elif talent == "Steady Hands":
talent_description = "says that entering cover will reduce the recoil of your weapons for a short period of time. It is available to equip in your security talent list."
elif talent == "Desperate Times":
talent_description = "says that low health increases your blind accuracy. It is available to equip in your security talent list."
elif talent == "Precision":
talent_description = "says that landing a headshot will pulse the enemy hit. It is available to equip in your security talent list."
elif talent == "Repo Reaper":
talent_description = "says that killing an enemy with your sidearm will give you one clip of primary weapon ammo. It is available to equip in your security talent list."
elif talent == "Stopping Power":
talent_description = "says that successfully supressing an enemy increases headshot damage. It is available to equip in your security talent list."
elif talent == "One is None":
talent_description = "says that landing a headshot gives a 50 50 chance of returning the bullet to your gun. It is available to equip in your security talent list."
elif talent == "On the Move":
talent_description = "says that killing a bad guy while moving reduces incoming damage. It is available to equip in your security talent list."
elif talent == "Chain Reaction":
talent_description = "says that if an explosion damages more than one enemy, it does 40% more damage to all hit by the blast. It is available to equip in your security talent list."
elif talent == "Police Up":
talent_description = "says that killing an enemy using one of your skills has a 25% chance of refilling all your ammo. It is available to equip in your tech talent list."
elif talent == "Tactical Advance":
talent_description = "says that rolling from one piece of cover to another increase damage done by 2% per meter travelled for a short period of time. It is available to equip in your tech talent list."
elif talent == "Wildfire":
talent_description = "says that successfully landing a burn ability on an enemy gives a chance at spreading the burn effect to other nearby enemies. It is available to equip in your tech talent list."
elif talent == "Evasive Action":
talent_description = "says that damage is reduced while rolling between pieces of cover. It is available to equip in your tech talent list."
elif talent == "Tech Support":
talent_description = "says that killing an enemy extends the duration of any skills you have active. It is available to equip in your tech talent list."
elif talent == "Death by Proxy":
talent_description = "says that destroying another enemies deployed items, such as turrets, increases the power of your skill abilities. It is available to equip in your tech talent list."
elif talent == "Demolition Expert":
talent_description = "says that killing an enemy with an explosion increase the overall damage that your explosions do for 15 seconds. It is available to equip in your tech talent list."
elif talent == "Fear Tactics":
talent_description = "says that your shock abilities have a chance at spreading to other nearby enemies. It is available to equip in your tech talent list."
elif talent == "Technical":
talent_description = "says that while your signature skill is active, your Skill Power is increased by 13 percent. It is only available on Backpack gear."
elif talent == "Inventive":
talent_description = "says that your skill power is increased by X percent while you are at full health. It is only available on Backpack gear."
elif talent == "Relentless":
talent_description = "says that X percent of damage dealt by your skills is returned to you as healing. It is only available on Backpack gear."
elif talent == "Resourceful":
talent_description = "says that all healing applied to you is also applied to your skill objects. It is only available on Backpack gear."
elif talent == "Specialized":
talent_description = "says that X percent of your Firearms and Stamina are added to your Skill Power. It is only available on Backpack gear."
elif talent == "Robust":
talent_description = "says that you have 45 percent more armor while in cover. It is only available on Chest gear."
elif talent == "Rapid":
talent_description = "says that the cooldown of your healing skills is decreased by X percent. It is only available on Chest gear."
elif talent == "Vigorous":
talent_description = "says that all your healing skills have Over Heal enabled. It is only available on Chest gear."
elif talent == "Forceful":
talent_description = "says that your armor is increased by X percent while your Signature Skill is active. It is only available on Chest gear."
elif talent == "Enduring":
talent_description = "says that while in your last health segment, your health continuously regenerates to fill up the segment. It is only available on Mask gear."
elif talent == "Refreshed":
talent_description = "says that when your health is in the last segment, all your healing is improved by 30%. It is only available on Mask gear."
elif talent == "Rejuvenated":
talent_description = "says that consuming a med kit also removes all negative status effects from you. It is only available on Mask gear."
elif talent == "Tenacious":
talent_description = "says that using a med kit increases your damage by 9.5% for 10 seconds. It is only available on Mask gear."
elif talent == "Rehabilitated":
talent_description = "says that when you are affected by a status effect you are healed for 2% for every second. It is only available on Mask gear."
elif talent == "Savage":
talent_description = "says that your critical hit chance is increased by 13% against targets out of cover. It is only available on Gloves gear."
elif talent == "Reckless":
talent_description = "says that you deal 12.5 percent more damage and receive 10 percent more damage. It is only available on Chest or Gloves gear."
elif talent == "Cunning":
talent_description = "says that after reloading, your next shot with this weapon has a 9.5% higher critical hit chance. It is only available on Gloves gear."
elif talent == "Decisive":
talent_description = "says that headshots with your side arm deal 25 percent more damage. It is only available on Gloves gear."
elif talent == "Accomplished":
talent_description = "says that rewards from accolades are trippled. It is only available on Knee Pad gear."
elif talent == "Prosperous":
talent_description = "says that critical headshots grant you credits. It is only available on Knee Pad gear."
elif talent == "Perceptive":
talent_description = "says that your item find and gold find bonuses are increased by 25 percent. It is only available on Knee Pad gear."
elif talent == "Recovered":
talent_description = "says that damage taken while doing a cover to cover maneuver is regenerated over 5 seconds upon reaching your destination. It is only available on Holster gear."
elif talent == "Nimble":
talent_description = "says that while doing a cover to cover move in combat, you heal 2% of your max Health for every Y meter ran. It is only available on Holster gear."
elif talent == "Steadfast":
talent_description = "says that while in cover, health regeneration kicks in twice as fast. It is only available on Holster gear."
elif talent == "Sturdy":
talent_description = "says that your armor is increased by 12.5% when you stay more than Y seconds in the same cover. It is only available on Holster gear."
else:
talent_description = "did not match a talent in my database. Perhaps it is a Skill and not a Talent?"
return talent_description
def list_talents_for_gear(intent, session):
card_title = "Issac Describing Gear Talents"
session_attributes = {}
should_end_session = True
if 'Gear' in intent['slots']:
if 'value' in intent['slots']['Gear']:
gear = intent['slots']['Gear']['value'].title()
session_attributes = create_gear_attributes(gear)
gear_possibilities = create_gear_possibilities(gear)
speech_output = "Agent, the gear " + gear + " " + gear_possibilities
reprompt_text = speech_output
else:
gear = "Gear"
session_attributes = create_gear_attributes(gear)
speech_output = "Agent, I didn't recognize that gear. " \
"Please try again."
reprompt_text = speech_output
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
else:
speech_output = "Agent, I didn't recognize that gear. " \
"Please try again."
reprompt_text = speech_output
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
def create_gear_attributes(gear):
return {"Gear": gear}
def create_gear_possibilities(gear):
if gear == "Backpack":
gear_possibilities = "can be rolled with any of the following talents: Technical, Inventive, Relentless, Resourceful, or Specialized. " \
"Backpacks have different capacities which determines how many items may be carried on your character."
elif gear == "Backpacks":
gear_possibilities = "can be rolled with any of the following talents: Technical, Inventive, Relentless, Resourceful, or Specialized. " \
"Backpacks have different capacities which determines how many items may be carried on your character."
elif gear == "Pack":
gear_possibilities = "can be rolled with any of the following talents: Technical, Inventive, Relentless, Resourceful, or Specialized. " \
"Backpacks have different capacities which determines how many items may be carried on your character."
elif gear == "Packs":
gear_possibilities = "can be rolled with any of the following talents: Technical, Inventive, Relentless, Resourceful, or Specialized. " \
"Backpacks have different capacities which determines how many items may be carried on your character."
elif gear == "Chest":
gear_possibilities = "can be rolled with any of the following talents: Reckless, Robust, Rapid, Vigorous, or Forceful."
elif gear == "Chests":
gear_possibilities = "can be rolled with any of the following talents: Reckless, Robust, Rapid, Vigorous, or Forceful."
elif gear == "Mask":
gear_possibilities = "can be rolled with any of the following talents: Enduring, Refreshed, Rejuvenated, Tenacious, or Rehabilitated."
elif gear == "Masks":
gear_possibilities = "can be rolled with any of the following talents: Enduring, Refreshed, Rejuvenated, Tenacious, or Rehabilitated."
elif gear == "Knee Pad":
gear_possibilities = "can be rolled with any of the following talents: Accomplished, Prosperous, or Perceptive."
elif gear == "Knee Pads":
gear_possibilities = "can be rolled with any of the following talents: Accomplished, Prosperous, or Perceptive."
elif gear == "Glove":
gear_possibilities = "can be rolled with any of the following talents: Savage, Reckless, Cunning, Decisive, or Astute."
elif gear == "Gloves":
gear_possibilities = "can be rolled with any of the following talents: Savage, Reckless, Cunning, Decisive, or Astute."
elif gear == "Holster":
gear_possibilities = "can be rolled with any of the following talents: Recovered, Nimble, Steadfast, or Sturdy."
elif gear == "Holsters":
gear_possibilities = "can be rolled with any of the following talents: Recovered, Nimble, Steadfast, or Sturdy."
else:
gear_possibilities = "did not match any gear in my database."
return gear_possibilities
def describe_skill(intent, session):
card_title = "Issac Describing a Skill"
session_attributes = {}
should_end_session = True
if 'Skill' in intent['slots']:
if 'value' in intent['slots']['Skill']:
skill = intent['slots']['Skill']['value'].title()
else:
skill = "Skill"
if skill == "Accurate":
skill_possibilities = "is a Talent not a Skill."
elif skill == "Adept":
skill_possibilities = "is a Talent not a Skill."
elif skill == "Astute":
skill_possibilities = "is a Talent not a Skill."
elif skill == "Balanced":
skill_possibilities = "is a Talent not a Skill."
elif skill == "Brutal":
skill_possibilities = "is a Talent not a Skill."
elif skill == "Capable":
skill_possibilities = "is a Talent not a Skill."
elif skill == "Commanding":
skill_possibilities = "is a Talent not a Skill."
elif skill == "Competent":
skill_possibilities = "is a Talent not a Skill."
elif skill == "Cool Headed":
skill_possibilities = "is a Talent not a Skill."
elif skill == "Deadly":
skill_possibilities = "is a Talent not a Skill."
elif skill == "Destructive":
skill_possibilities = "is a Talent not a Skill."
elif skill == "Determined":
skill_possibilities = "is a Talent not a Skill."
elif skill == "Dominant":
skill_possibilities = "is a Talent not a Skill."
elif skill == "Expert":
skill_possibilities = "is a Talent not a Skill."
elif skill == "Ferocious":
skill_possibilities = "is a Talent not a Skill."
elif skill == "Fierce":
skill_possibilities = "is a Talent not a Skill."
elif skill == "Harmful":
skill_possibilities = "is a Talent not a Skill."
elif skill == "Intense":
skill_possibilities = "is a Talent not a Skill."
elif skill == "Meticulous":
skill_possibilities = "is a Talent not a Skill."
elif skill == "Predatory":
skill_possibilities = "is a Talent not a Skill."
elif skill == "Prepared":
skill_possibilities = "is a Talent not a Skill."
elif skill == "Proficient":
skill_possibilities = "is a Talent not a Skill."
elif skill == "Provident":
skill_possibilities = "is a Talent not a Skill."
elif skill == "Responsive":
skill_possibilities = "is a Talent not a Skill."
elif skill == "Restored":
skill_possibilities = "is a Talent not a Skill."
elif skill == "Self-preserved":
skill_possibilities = "is a Talent not a Skill."
elif skill == "Skilled":
skill_possibilities = "is a Talent not a Skill."
elif skill == "Stable":
skill_possibilities = "is a Talent not a Skill."
elif skill == "Sustained":
skill_possibilities = "is a Talent not a Skill."
elif skill == "Swift":
skill_possibilities = "is a Talent not a Skill."
elif skill == "Toxic":
...
This file has been truncated, please download it to see its full contents.
Comments