Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -----------------------------------
- -- Chocobo Raising
- -- Dedicated to 'Friend' the Chocobo. RIP.
- -----------------------------------
- require('scripts/globals/chocobo_names')
- require('scripts/globals/utils')
- -----------------------------------
- xi = xi or {}
- xi.chocoboRaising = xi.chocoboRaising or {}
- xi.chocoboRaising.chocoState = xi.chocoboRaising.chocoState or {}
- local debug = utils.getDebugPlayerPrinter(xi.settings.main.DEBUG_CHOCOBO_RAISING)
- -----------------------------------
- -- Settings
- -----------------------------------
- -- Length of a day, in seconds
- xi.chocoboRaising.dayLength = 86400
- xi.chocoboRaising.daysToChick = 4
- xi.chocoboRaising.daysToAdolescent = 19
- xi.chocoboRaising.daysToAdult1 = 29
- xi.chocoboRaising.daysToAdult2 = 43
- xi.chocoboRaising.daysToAdult3 = 64
- xi.chocoboRaising.daysToAdult4 = 129
- -- Energy settings for different walks
- local walkEnergyRandomness = 5
- local walkEnergyAmount = { 25, 33, 50 }
- local walkEventChance = 33
- local watchOverEnergy = 5
- -- Chocobo speed and endurance ratings
- xi.chocoboRaising.ridingSpeedBase = 80
- xi.chocoboRaising.ridingSpeedPerRank = 2.5
- xi.chocoboRaising.ridingSpeedCap = 100
- xi.chocoboRaising.ridingTimeBase = 17
- xi.chocoboRaising.ridingTimePerRank = 4
- xi.chocoboRaising.ridingTimeCap = 45
- local skillRanks = {
- F_POOR = 0,
- E_SUBSTANDARD = 1,
- D_A_BIT_DEFICIENT = 2,
- C_AVERAGE = 3,
- B_BETTER_THAN_AVERAGE = 4,
- A_IMPRESSIVE = 5,
- S_OUTSTANDING = 6,
- SS_FIRST_CLASS = 7,
- }
- local skillRankBoundaries = {
- F_POOR = 31,
- E_SUBSTANDARD = 63,
- D_A_BIT_DEFICIENT = 95,
- C_AVERAGE = 127,
- B_BETTER_THAN_AVERAGE = 159,
- A_IMPRESSIVE = 191,
- S_OUTSTANDING = 223,
- SS_FIRST_CLASS = 255,
- }
- local numberToRank = function(skill)
- local rank = skillRanks.F_POOR
- for idx, boundary in pairs(skillRankBoundaries) do
- if skill >= boundary and skillRanks[idx] > rank then
- rank = skillRanks[idx]
- end
- end
- return rank
- end
- xi.chocoboRaising.getPlayerRidingSpeedAndTime = function(player)
- local baseSpeed = xi.chocoboRaising.ridingSpeedBase
- local baseTime = xi.chocoboRaising.ridingTimeBase
- local chocoState = player:getChocoboRaisingInfo()
- if chocoState == nil then
- return baseSpeed, baseTime
- end
- local strRank = numberToRank(chocoState.strength)
- local endRank = numberToRank(chocoState.endurance)
- local outSpeed = utils.clamp(baseSpeed + (strRank * xi.chocoboRaising.ridingSpeedPerRank), 0, xi.chocoboRaising.ridingSpeedCap)
- local outTime = utils.clamp(baseTime + (endRank * xi.chocoboRaising.ridingTimePerRank), 0, xi.chocoboRaising.ridingTimeCap)
- return outSpeed, outTime
- end
- -- Conditions and care plans
- local conditions = {
- ILL = 0, VERY_ILL = 1, SICK = 2, INJURED = 3, SPOILED = 4, BORED = 5, LOVESICK = 6, RUN_AWAY = 7,
- HIGH_SPIRITS = 8, PERKY = 9, EXTREMELY_HAPPY = 10, FULL_OF_ENERGY_1 = 11, FULL_OF_ENERGY_2 = 12, BRIGHT_AND_FOCUSED = 13,
- }
- local hasCondition = function(chocoState)
- return chocoState.conditions > 0
- end
- local getCondition = function(chocoState, condition)
- return utils.mask.getBit(chocoState.conditions, condition)
- end
- local setCondition = function(chocoState, condition, value)
- chocoState.conditions = utils.mask.setBit(chocoState.conditions, condition, value)
- end
- local conditionsHealedByItems = {
- [conditions.ILL] = { xi.item.CLUMP_OF_TOKOPEKKO_WILDGRASS, xi.item.CELERITY_SALAD },
- [conditions.VERY_ILL] = { xi.item.CLUMP_OF_TOKOPEKKO_WILDGRASS, xi.item.CELERITY_SALAD },
- [conditions.SICK] = { xi.item.CLUMP_OF_GARIDAV_WILDGRASS, xi.item.CELERITY_SALAD },
- [conditions.INJURED] = { xi.item.CLUMP_OF_GAUSEBIT_WILDGRASS, xi.item.CELERITY_SALAD },
- [conditions.SPOILED] = { xi.item.CELERITY_SALAD },
- [conditions.BORED] = { xi.item.CELERITY_SALAD },
- [conditions.LOVESICK] = { xi.item.CELERITY_SALAD },
- }
- local carePlans = {
- BASIC_CARE = 0, RESTING = 1, TAKING_A_WALK = 2, LISTENING_TO_MUSIC = 3, EXERCISING_ALONE = 4, EXERCISING_IN_A_GROUP = 5,
- PLAYING_WITH_CHILDREN = 6, PLAYING_WITH_CHOCOBOS = 7, CARRYING_PACKAGES = 8, EXHIBITING_TO_THE_PUBLIC = 9,
- DELIVERING_MESSAGES = 10, DIGGING_FOR_TREASURE = 11, ACTING_IN_A_PLAY = 12,
- }
- local carePlanData = {
- [carePlans.BASIC_CARE] = { 1, 1, 1, 1, -1, -1, nil },
- [carePlans.RESTING] = { 0, 0, 0, 0, 0, 1, nil },
- [carePlans.TAKING_A_WALK] = { 1, 1, -1, -1, -1, -1, nil },
- [carePlans.LISTENING_TO_MUSIC] = { -1, -1, 1, 1, -1, -1, nil },
- [carePlans.EXERCISING_ALONE] = { 1, 0, -1, -1, -1, -1, nil },
- [carePlans.EXERCISING_IN_A_GROUP] = { 0, 1, -1, -1, -1, -1, nil },
- [carePlans.PLAYING_WITH_CHILDREN] = { -1, -1, 1, 0, -1, -1, nil },
- [carePlans.PLAYING_WITH_CHOCOBOS] = { -1, -1, 0, 1, -1, -1, nil },
- [carePlans.CARRYING_PACKAGES] = { 5, 5, -5, -5, -10, -5, 100 },
- [carePlans.EXHIBITING_TO_THE_PUBLIC] = { -5, -5, 5, 5, -10, -5, 100 },
- [carePlans.DELIVERING_MESSAGES] = { 10, 0, 0, -5, -10, -10, 100 },
- [carePlans.DIGGING_FOR_TREASURE] = { 0, -5, 10, 0, -10, -10, 100 },
- [carePlans.ACTING_IN_A_PLAY] = { -5, 0, 0, 10, -10, -10, 100 },
- }
- local handleStatChange = function(stat, change, max)
- if change > 0 then
- change = change * xi.settings.main.CHOCOBO_RAISING_STAT_POS_MULTIPLIER
- elseif change < 0 then
- change = change * xi.settings.main.CHOCOBO_RAISING_STAT_NEG_MULTIPLIER
- end
- stat = utils.clamp(stat + change, 0, max)
- return stat
- end
- local handleCarePlan = function(player, chocoState, carePlan)
- chocoState.strength = handleStatChange(chocoState.strength, carePlanData[carePlan][1], 255)
- chocoState.endurance = handleStatChange(chocoState.endurance, carePlanData[carePlan][2], 255)
- chocoState.discernment = handleStatChange(chocoState.discernment, carePlanData[carePlan][3], 255)
- chocoState.receptivity = handleStatChange(chocoState.receptivity, carePlanData[carePlan][4], 255)
- chocoState.affection = handleStatChange(chocoState.affection, carePlanData[carePlan][5], 255)
- chocoState.energy = handleStatChange(chocoState.energy, carePlanData[carePlan][6], 100)
- local payment = carePlanData[carePlan][7]
- if payment then
- payment = payment * xi.settings.main.CHOCOBO_RAISING_GIL_MULTIPLIER
- debug(string.format('Care Plan Payment: %d', payment))
- -- Handle payment
- end
- end
- local validFoods = {
- [xi.item.BUNCH_OF_GYSAHL_GREENS] = { 25, 10, 0, 0, 0, 0, 0, 0, 0, glow.RED },
- [xi.item.BUNCH_OF_SHARUG_GREENS] = { 25, 10, 0, 0, 0, 0, 0, 0, 0, glow.RED },
- [xi.item.BUNCH_OF_AZOUPH_GREENS] = { 25, 10, 0, 0, 0, 0, 0, 0, 0, glow.RED },
- [xi.item.CARROT_PASTE] = { 25, 10, 0, 0, 0, 0, 0, 0, 0, glow.RED },
- [xi.item.HERB_PASTE] = { 25, 10, 0, 0, 0, 0, 0, 0, 0, glow.RED },
- [xi.item.VEGETABLE_PASTE] = { 25, 10, 0, 0, 0, 0, 0, 0, 0, glow.RED },
- [xi.item.WORM_PASTE] = { 25, 10, 0, 0, 0, 0, 0, 0, 0, glow.RED },
- [xi.item.VOMP_CARROT] = { 25, 10, 0, 0, 0, 0, 0, 0, 0, glow.RED },
- [xi.item.SAN_DORIAN_CARROT] = { 25, 10, 0, 0, 0, 0, 0, 0, 0, glow.RED },
- [xi.item.ZEGHAM_CARROT] = { 25, 10, 0, 0, 0, 0, 0, 0, 0, glow.BLUE },
- [xi.item.CLUMP_OF_GAUSEBIT_WILDGRASS] = { 25, 10, 0, 0, 0, 0, 0, 0, 0, glow.YELLOW },
- [xi.item.CLUMP_OF_GARIDAV_WILDGRASS] = { 25, 10, 0, 0, 0, 0, 0, 0, 0, glow.YELLOW },
- [xi.item.CLUMP_OF_TOKOPEKKO_WILDGRASS] = { 25, 10, 0, 0, 0, 0, 0, 0, 0, glow.YELLOW },
- [xi.item.CHOCOLIXIR] = { 50, 0, 100, 0, 0, 0, 0, 0, 0, glow.YELLOW },
- [xi.item.HI_CHOCOLIXIR] = { 25, 0, 100, 0, 0, 0, 0, 0, 0, glow.YELLOW },
- [xi.item.CHOCOTONIC] = { 25, 10, 0, 0, 0, 0, 0, 0, 0, glow.YELLOW },
- [xi.item.CUPID_WORM] = { 25, 10, 0, 0, 0, 0, 0, 0, 0, glow.BLUE },
- [xi.item.GREGARIOUS_WORM] = { 25, 10, 0, 0, 0, 0, 0, 0, 0, glow.YELLOW },
- [xi.item.PARASITE_WORM] = { 25, 10, 0, 0, 0, 0, 0, 0, 0, glow.BLUE },
- [xi.item.TORNADO_SALAD] = { 25, 10, 0, 0, 0, 0, 0, 0, 0, glow.GREEN },
- [xi.item.CELERITY_SALAD] = { 25, 10, 0, 0, 0, 0, 0, 0, 0, glow.GREEN },
- [xi.item.LETHE_POTAGE] = { 25, 10, 0, 0, 0, 0, 0, 0, 0, glow.GREEN },
- [xi.item.LETHE_CONSOMME] = { 25, 10, 0, 0, 0, 0, 0, 0, 0, glow.GREEN },
- [xi.item.LA_THEINE_MILLET] = { 25, 10, 0, 0, 0, 0, 0, 0, 0, glow.GREEN },
- }
- -- Items that can be found on a walk in a certain area
- local walkItems = {
- [xi.zone.WEST_RONFAURE] = { xi.item.BEASTCOIN, xi.item.BRONZE_AXE, xi.item.RONFAURE_CHESTNUT, xi.item.FLINT_STONE, xi.item.CLUMP_OF_GARIDAV_WILDGRASS, xi.item.GOBLIN_MASK, xi.item.LITTLE_WORM, xi.item.PEBBLE, xi.item.SILVER_BEASTCOIN, xi.item.CLUMP_OF_TOKOPEKKO_WILDGRASS, xi.item.BAG_OF_WILDGRASS_SEEDS },
- [xi.zone.NORTH_GUSTABERG] = { xi.item.BEASTCOIN, xi.item.FLINT_STONE, xi.item.CLUMP_OF_GARIDAV_WILDGRASS, xi.item.GOBLIN_MASK, xi.item.LITTLE_WORM, xi.item.EAR_OF_MILLIONCORN, xi.item.PEBBLE, xi.item.QUADAV_BACKPLATE, xi.item.SILVER_BEASTCOIN, xi.item.CLUMP_OF_TOKOPEKKO_WILDGRASS, xi.item.BAG_OF_WILDGRASS_SEEDS },
- [xi.zone.EAST_SARUTABARUTA] = { xi.item.BEASTCOIN, xi.item.FLINT_STONE, xi.item.CLUMP_OF_GARIDAV_WILDGRASS, xi.item.GOBLIN_MASK, xi.item.GOBLIN_HELM, xi.item.LITTLE_WORM, xi.item.PEBBLE, xi.item.PIECE_OF_ROTTEN_MEAT, xi.item.SILVER_BEASTCOIN, xi.item.BOX_OF_TARUTARU_RICE, xi.item.CLUMP_OF_TOKOPEKKO_WILDGRASS, xi.item.BAG_OF_WILDGRASS_SEEDS, xi.item.YAGUDO_BEAD_NECKLACE },
- [xi.zone.LA_THEINE_PLATEAU] = { xi.item.BEASTCOIN, xi.item.CRAB_SHELL, xi.item.CUPID_WORM, xi.item.CHUNK_OF_DARKSTEEL_ORE, xi.item.CLUMP_OF_GARIDAV_WILDGRASS, xi.item.GOBLIN_ARMOR, xi.item.LILAC, xi.item.PEBBLE, xi.item.SILVER_BEASTCOIN, xi.item.CLUMP_OF_TOKOPEKKO_WILDGRASS, xi.item.ZEGHAM_CARROT, xi.item.MYTHRIL_BEASTCOIN },
- [xi.zone.KONSCHTAT_HIGHLANDS] = { xi.item.BEASTCOIN, xi.item.CUPID_WORM, xi.item.CLUMP_OF_GARIDAV_WILDGRASS, xi.item.GOBLIN_ARMOR, xi.item.GOBLIN_HELM, xi.item.PEBBLE, xi.item.CHUNK_OF_DARKSTEEL_ORE, xi.item.CHUNK_OF_PLATINUM_ORE, xi.item.RAIN_LILY, xi.item.SHEEP_TOOTH, xi.item.SILVER_BEASTCOIN, xi.item.CLUMP_OF_TOKOPEKKO_WILDGRASS, xi.item.VOMP_CARROT, xi.item.ZEGHAM_CARROT },
- [xi.zone.TAHRONGI_CANYON] = { xi.item.AMARYLLIS, xi.item.BEASTCOIN, xi.item.CHICKEN_BONE, xi.item.CUPID_WORM, xi.item.CHUNK_OF_DARKSTEEL_ORE, xi.item.CLUMP_OF_GARIDAV_WILDGRASS, xi.item.GOBLIN_ARMOR, xi.item.PEBBLE, xi.item.CHUNK_OF_PLATINUM_ORE, xi.item.SILVER_BEASTCOIN, xi.item.VOMP_CARROT, xi.item.ZEGHAM_CARROT, xi.item.BAG_OF_TREE_CUTTINGS },
- [xi.zone.JUGNER_FOREST] = { xi.item.CHUNK_OF_ADAMAN_ORE, xi.item.GOBLIN_HELM, xi.item.GOLD_BEASTCOIN, xi.item.GREGARIOUS_WORM, xi.item.MYTHRIL_BEASTCOIN, xi.item.OLIVE_FLOWER, xi.item.CHUNK_OF_ORICHALCUM_ORE, xi.item.PEBBLE, xi.item.PIECE_OF_ROTTEN_MEAT, xi.item.SILVER_BEASTCOIN, xi.item.BAG_OF_TREE_CUTTINGS, xi.item.BAG_OF_WILDGRASS_SEEDS },
- [xi.zone.PASHHOW_MARSHLANDS] = { xi.item.CHUNK_OF_ADAMAN_ORE, xi.item.CATTLEYA, xi.item.GOBLIN_HELM, xi.item.GREGARIOUS_WORM, xi.item.MYTHRIL_BEASTCOIN, xi.item.CHUNK_OF_ORICHALCUM_ORE, xi.item.PEBBLE, xi.item.PIECE_OF_ROTTEN_MEAT, xi.item.SILVER_BEASTCOIN, xi.item.BAG_OF_TREE_CUTTINGS },
- [xi.zone.MERIPHATAUD_MOUNTAINS] = { xi.item.CHUNK_OF_ADAMAN_ORE, xi.item.CASABLANCA, xi.item.GOBLIN_HELM, xi.item.GOLD_BEASTCOIN, xi.item.GREGARIOUS_WORM, xi.item.MYTHRIL_BEASTCOIN, xi.item.PEBBLE, xi.item.PIECE_OF_ROTTEN_MEAT, xi.item.SILVER_BEASTCOIN, xi.item.BAG_OF_TREE_CUTTINGS, xi.item.CHUNK_OF_ORICHALCUM_ORE },
- }
- -----------------------------------
- -- Chocobo Growth Stages
- -----------------------------------
- local stage = {
- EGG = 1, CHICK = 2, ADOLESCENT = 3, ADULT_1 = 4, ADULT_2 = 5, ADULT_3 = 6, ADULT_4 = 7,
- }
- local colour = {
- YELLOW = 0, BLACK = 1, BLUE = 2, RED = 3, GREEN = 4,
- }
- local ageBoundaries = {
- { stage.EGG, xi.chocoboRaising.daysToChick, cutscenes.EGG_HATCHING, stage.CHICK },
- { stage.CHICK, xi.chocoboRaising.daysToAdolescent, cutscenes.CHICK_TO_ADOLESCENT, stage.ADOLESCENT },
- { stage.ADOLESCENT, xi.chocoboRaising.daysToAdult1, cutscenes.ADOLESCENT_TO_ADULT_1, stage.ADULT_1 },
- { stage.ADULT_1, xi.chocoboRaising.daysToAdult2, cutscenes.ADULT_1_TO_ADULT_2, stage.ADULT_2 },
- { stage.ADULT_2, xi.chocoboRaising.daysToAdult3, cutscenes.ADULT_2_TO_ADULT_3, stage.ADULT_3 },
- { stage.ADULT_3, xi.chocoboRaising.daysToAdult4, cutscenes.ADULT_3_TO_ADULT_4, stage.ADULT_4 },
- }
- local ageToStage = function(age)
- for _, entry in pairs(ageBoundaries) do
- if age <= entry[2] then
- return entry[1]
- end
- end
- return stage.ADULT_4
- end
- local updateChocoState = function(player, chocoState)
- chocoState.age = math.floor((os.time() - chocoState.created) / xi.chocoboRaising.dayLength) + 1
- chocoState.last_update_age = chocoState.age
- xi.chocoboRaising.chocoState[player:getID()] = chocoState
- player:setChocoboRaisingInfo(chocoState)
- return chocoState
- end
- local handleCSUpdate = function(player, chocoState, doEventUpdate)
- local csOffset = chocoState.csList[1]
- local locationOffset = raisingLocation[player:getZoneID()] * 256
- local csToPlay = locationOffset + csOffset
- table.remove(chocoState.csList, 1)
- local currentAgeOfChocoboDuringCutscene = 0
- if csOffset == cutscenes.EGG_HATCHING then
- chocoState.stage = stage.CHICK
- elseif csOffset == cutscenes.CHICK_TO_ADOLESCENT then
- chocoState.stage = stage.ADOLESCENT
- elseif csOffset == cutscenes.ADOLESCENT_TO_ADULT_1 then
- chocoState.stage = stage.ADULT_1
- elseif csOffset == cutscenes.ADULT_1_TO_ADULT_2 then
- chocoState.stage = stage.ADULT_2
- elseif csOffset == cutscenes.ADULT_2_TO_ADULT_3 then
- chocoState.stage = stage.ADULT_3
- elseif csOffset == cutscenes.ADULT_3_TO_ADULT_4 then
- chocoState.stage = stage.ADULT_4
- end
- chocoState = onRaisingEventPlayout(player, csOffset, chocoState)
- if doEventUpdate then
- player:updateEventString(chocoState.first_name, chocoState.last_name, chocoState.first_name, chocoState.first_name, 0, 0, 0, 0, 0, 0, 0, 0)
- player:updateEvent(#chocoState.csList, csToPlay, 0, chocoState.colour, chocoState.stage, 0, currentAgeOfChocoboDuringCutscene, 1)
- end
- return chocoState
- end
- xi.chocoboRaising.initChocoboData = function(player)
- local chocoState = player:getChocoboRaisingInfo()
- if chocoState == nil then
- return chocoState
- end
- chocoState.age = math.floor((os.time() - chocoState.created) / xi.chocoboRaising.dayLength) + 1
- chocoState.affectionRank = affectionRank.LIKES
- chocoState.csList = {}
- chocoState.foodGiven = {}
- chocoState.report = {}
- chocoState.report.events = {}
- if chocoState.age - chocoState.last_update_age <= 0 then
- chocoState.last_update_age = chocoState.age
- return chocoState
- end
- chocoState.report.day_start = chocoState.last_update_age
- chocoState.report.day_end = chocoState.age
- local reportLength = chocoState.report.day_end - chocoState.report.day_start
- chocoState.last_update_age = chocoState.age
- local events = {}
- local plan1Length = bit.rshift(bit.band(chocoState.care_plan, 0xF0000000), 28)
- local plan1Type = bit.rshift(bit.band(chocoState.care_plan, 0x0F000000), 24)
- local plan2Length = bit.rshift(bit.band(chocoState.care_plan, 0x00F00000), 20)
- local plan2Type = bit.rshift(bit.band(chocoState.care_plan, 0x000F0000), 16)
- local plan3Length = bit.rshift(bit.band(chocoState.care_plan, 0x0000F000), 12)
- local plan3Type = bit.rshift(bit.band(chocoState.care_plan, 0x00000F00), 8)
- local plan4Length = bit.rshift(bit.band(chocoState.care_plan, 0x000000F0), 4)
- local plan4Type = bit.rshift(bit.band(chocoState.care_plan, 0x0000000F), 0)
- local possibleCarePlanFuture = {}
- for _ = 1, plan1Length do
- table.insert(possibleCarePlanFuture, plan1Type)
- end
- for _ = 1, plan2Length do
- table.insert(possibleCarePlanFuture, plan2Type)
- end
- for _ = 1, plan3Length do
- table.insert(possibleCarePlanFuture, plan3Type)
- end
- for _ = 1, plan4Length do
- table.insert(possibleCarePlanFuture, plan4Type)
- end
- chocoState.energy = 100
- for idx = 1, reportLength do
- local possibleCarePlanEvent = possibleCarePlanFuture[idx]
- if possibleCarePlanEvent == nil then
- possibleCarePlanEvent = 0
- end
- local age = chocoState.report.day_start + idx - 1
- local currentStage = ageToStage(age)
- local event = { age, { possibleCarePlanEvent } }
- table.insert(events, event)
- if not hasCondition(chocoState) then
- for _, condition in pairs(conditions) do
- if utils.chance(5) then
- setCondition(chocoState, condition, true)
- break
- end
- end
- end
- for _, condition in pairs(conditions) do
- if getCondition(chocoState, condition) then
- setCondition(chocoState, condition, false)
- break
- end
- end
- chocoState.strength = handleStatChange(chocoState.strength, carePlanData[possibleCarePlanEvent][1], 255)
- chocoState.endurance = handleStatChange(chocoState.endurance, carePlanData[possibleCarePlanEvent][2], 255)
- chocoState.discernment = handleStatChange(chocoState.discernment, carePlanData[possibleCarePlanEvent][3], 255)
- chocoState.receptivity = handleStatChange(chocoState.receptivity, carePlanData[possibleCarePlanEvent][4], 255)
- chocoState.affection = handleStatChange(chocoState.affection, carePlanData[possibleCarePlanEvent][5], 255)
- chocoState.energy = handleStatChange(chocoState.energy, carePlanData[possibleCarePlanEvent][6], 100)
- end
- chocoState.report.events = events
- chocoState = updateChocoState(player, chocoState)
- return chocoState
- end
Advertisement
Add Comment
Please, Sign In to add comment