Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local ToySkull = RegisterMod("ToySkull", 1)
- local game = Game()
- --reference item & costume
- CollectibleType.COLLECTIBLE_TOY_SKULL = Isaac.GetItemIdByName("Toy Skull")
- ToySkull.COSTUME_TOY_SKULL = Isaac.GetCostumeIdByPath("gfx/characters/toyskull.anm2")
- local ToyBonus = {
- TOYSKULL = 2 --Luck
- }
- --Shell Game tables
- local Grab = {
- Coin = nil,
- Key = nil,
- Bomb = nil
- }
- local Shell = {
- Traget = nil,
- RADIUS = 4
- }
- local BeaggarState = {
- IDLE = 0
- PAYNOTHING = 2
- PAYPRICE = 3
- PRICE = 4
- TELEPORT = 5
- }
- local pickup = {}
- --update the inventory
- local function UpdateToy(player)
- HasToy.ToySkull = player:HasCollectible(CollectibleType.COLLECTIBLE_TOY_SKULL)
- end
- --if you start a run or continue. Before anything happens
- function ToySkull:onPlayerInit(player)
- UpdateToy(player)
- end
- ToySkull:AddCallback(ModCallbacks.MC_POST_PLAYER_INIT, ToySkull.onPlayerInit)
- --when passive effects should update
- function ToySkull:onUpdate(player)
- if game:GetFrameCount() == 1 then
- ToySkull.HasToySkull = false
- --spawn in if necessary
- end
- if not ToySkull.HasToySkull and HasToy.ToySkull then
- player:AddNullCostume(ToySkull.COSTUME_TOY_SKULL)
- player:AddCoin(1)
- player:AddKey(1)
- player:AddBomb(1)
- ToySkull.HasToySkull = true
- end
- UpdateToy(player)
- end
- ToySkull:AddCallback(Modcallbacks.MC_POST_PEFFECT_UPDATE, ToySkull.onUpdate)
- --update the cache
- function ToySkull:onCache(player, cacheFlag)
- if cacheFlag == CacheFlag.CACHE_LUCK then
- if player:HasCollectible(CollectibleType.COLLECTIBLE_TOY_SKULL) and not HasToy.ToySkull then
- player.Luck = player.Luck + ToyBonus.ToySkull
- end
- end
- end
- ToySkull:AddCallback(ModCallbacks.MC_EVALUATE_CACHE, ToySkull.onCache)
- --add Shell Game functionality
- function ToySkull:onPayout(pickup)
- --is there a Shell Game Beggar in the room?
- if Shell.Target == nil then
- if HasToy.ToySkull then
- local roomEntities = Isaac.GetRoomEntities()
- local shellGame = Isaac:GetEntityVariantByName("Shell Game Beggar")
- for i, entity in pairs(roomEntities) do
- if entity.Type == EntityType.ENTITY_SLOT
- and entity.Variant == shellGame then
- Shell.Target = entity
- end
- end
- --if yes, then the game will check if he spawns a pickup. In this case a coin
- elseif Shell.Target.State == BeggarState.PAYPRICE and Isaac.Spawn(EntityType.ENTITY_PICKUP, PickupVariant.PICKUP_COIN, CoinSubType.COIN_PENNY, Shell.Target.Position, 0, Shell.Target) then
- local numberCoins = Isaac:CountEntities(Shell.Target, EntityType.ENTITY_PICKUP, PickupVariant.PICKUP_COIN, CoinSubType.COIN_PENNY)
- local shellEntities = Isaac.FindInRadius(Shell.Target.Position, 50, EntityPartition.PICKUP)
- for j = 1, numberCoins do
- for a, pickup in pairs(shellEntities) do
- if pickup.Variant == PickupVariant.PICKUP_COIN
- and pickup.Subtype == CoinSubType.COIN_PENNY then
- -- if the game finds a coin, then it will replace it with an Sack
- Grab.Coin = pickup
- Isaac.Spawn(
- EntityType.ENTITY_PICKUP,
- PickupVariant.PICKUP_GRAB_BAG,
- Grab.Coin.Position,
- Grab.Coin.Velocity,
- Shell.Target
- )
- Grab.Coin:Remove()
- Grab.Coin = nil
- end
- end
- end
- Shell.Target = nil
- --now a doublecoin
- elseif Shell.Target.State == BeggarState.PAYPRICE and Isaac.Spawn(EntityType.ENTITY_PICKUP, PickupVariant.PICKUP_COIN, CoinSubType.COIN_DOUBLEPACK, Shell.Target.Position, 0, Shell.Target) then
- local numberCoins = Isaac:CountEntities(Shell.Target, EntityType.ENTITY_PICKUP, PickupVariant.PICKUP_COIN, CoinSubType.COIN_DOUBLEPACK)
- local shellEntities = Isaac.FindInRadius(Shell.Target.Position, 50, EntityPartition.PICKUP)
- for k = 1, numberCoins do
- for b, pickup in pairs(shellEntities) do
- if pickup.Variant == PickupVariant.PICKUP_COIN
- and pickup.Subtype == CoinSubType.COIN_DOUBLEPACK then
- --if the game finds a doublecoin, then it will replace it with a Sack
- Grab.Coin = pickup
- Isaac.Spawn(
- EntityType.ENTITY_PICKUP,
- PickupVariant.PICKUP_GRAB_BAG,
- Grab.Coin.Position,
- Grab.Coin.Velocity,
- Shell.Target
- )
- Grab.Coin:Remove()
- Grab.Coin = nil
- end
- end
- end
- Shell.Target = nil
- --now a key
- elseif Shell.Target.State == BeggarState.PAYPRICE and Isaac.Spawn(EntityType.ENTITY_PICKUP, PickupVariant.PICKUP_KEY, KeySubType.KEY_NORMAL, Shell.Target.Position, 0, Shell.Target) then
- local numberKeys = Isaac:CountEntities(Shell.Target, EntityType.ENTITY_PICKUP, PickupVariant.PICKUP_KEY, KeySubType.KEY_NORMAL)
- local shellEntities = Isaac.FindInRadius(Shell.Target.Position, 50, EntityPartition.PICKUP)
- for m = 1, numberKeys do
- for c, pickup in pairs(shellEntities) do
- if pickup.Variant == PickupVariant.PICKUP_KEY
- and pickup.Subtype == KeySubType.KEY_NORMAL then
- --if the game finds a key, then it will replace it with a Pill
- Grab.KEY = pickup
- Isaac.Spawn(
- EntityType.ENTITY_PICKUP,
- PickupVariant.PICKUP_PILL,
- Grab.Key.Position,
- Grab.Key.Velocity,
- Shell.Target
- )
- Grab.Key:Remove()
- Grab.Key = nil
- end
- end
- end
- Shell.Target = nil
- --now a doublekey
- elseif Shell.Target.State == BeggarState.PAYPRICE and Isaac.Spawn(EntityType.ENTITY_PICKUP, PickupVariant.PICKUP_KEY, KeySubType.KEY_DOUBLEPACK, Shell.Target.Position, 0, Shell.Target) then
- local numberKeys = Isaac:CountEntities(Shell.Target, EntityType.ENTITY_PICKUP, PickupVariant.PICKUP_KEY, KeySubType.KEY_DOUBLEPACK)
- local shellEntities = Isaac.FindInRadius(Shell.Target.Position, 50, EntityPartition.PICKUP)
- for n = 1, numberKeys do
- for d, pickup in pairs(shellEntities) do
- if pickup.Variant == PickupVariant.PICKUP_KEY
- and pickup.Subtype == KeySubType.KEY_DOUBLEPACK then
- --if the game finds a doublekey, then it will replace it with a Pill
- Grab.KEY = pickup
- Isaac.Spawn(
- EntityType.ENTITY_PICKUP,
- PickupVariant.PICKUP_PILL,
- Grab.Key.Position,
- Grab.Key.Velocity,
- Shell.Target
- )
- Grab.Key:Remove()
- Grab.Key = nil
- end
- end
- end
- Shell.Target = nil
- --now a bomb
- elseif Shell.Target.State == BeggarState.PAYPRICE and Isaac.Spawn(EntityType.ENTITY_PICKUP, PickupVariant.PICKUP_BOMB, BombSubType.BOMB_NORMAL, Shell.Target.Position, 0, Shell.Target) then
- local numberBombs = Isaac:CountEntities(Shell.Target, EntityType.ENTITY_PICKUP, PickupVariant.PICKUP_BOMB, BombSubType.BOMB_NORMAL)
- local shellEntities = Isaac.FindInRadius(Shell.Target.Position, 50, EntityPartition.PICKUP)
- for o = 1, numberBombs do
- for e, pickup in pairs(shellEntities) do
- if pickup.Variant == PickupVariant.PICKUP_BOMB
- and pickup.Subtype == BombSubType.BOMB_NORMAL then
- --if the game finds a bomb, then it will replace it with a random rune
- Grab.Bomb = pickup
- local rng = player:GetCollectibleRNG(CollectibleType.COLLECTIBLE_TOY_SKULL)
- local roll = rng:RandomInit(100)
- if roll < 10 then
- Isaac.Spawn(EntityType.ENTITY_PICKUP, PickupVariant.PICKUP_CARD, CARD_RUNE_HAGALAZ, Grab.Bomb.Position, Grab.Bomb.Velocity, Shell.Target)
- esleif roll < 20 then
- Isaac.Spawn(EntityType.ENTITY_PICKUP, PickupVariant.PICKUP_CARD, CARD_RUNE_JERA, Grab.Bomb.Position, Grab.Bomb.Velocity, Shell.Target)
- elseif roll < 30 then
- Isaac.Spawn(EntityType.ENTITY_PICKUP, PickupVariant.PICKUP_CARD, CARD_RUNE_EHWAZ, Grab.Bomb.Position, Grab.Bomb.Velocity, Shell.Target)
- elseif roll < 40 then
- Isaac.Spawn(EntityType.ENTITY_PICKUP, PickupVariant.PICKUP_CARD, CARD_RUNE_DAGAZ, Grab.Bomb.Position, Grab.Bomb.Velocity, Shell.Target)
- elseif roll < 50 then
- Isaac.Spawn(EntityType.ENTITY_PICKUP, PickupVariant.PICKUP_CARD, CARD_RUNE_ANSUZ, Grab.Bomb.Position, Grab.Bomb.Velocity, Shell.Target)
- elseif roll < 60 then
- Isaac.Spawn(EntityType.ENTITY_PICKUP, PickupVariant.PICKUP_CARD, CARD_RUNE_PERTHRO, Grab.Bomb.Position, Grab.Bomb.Velocity, Shell.Target)
- esleif roll < 70 then
- Isaac.Spawn(EntityType.ENTITY_PICKUP, PickupVariant.PICKUP_CARD, CARD_RUNE_BERKANO, Grab.Bomb.Position, Grab.Bomb.Velocity, Shell.Target)
- elseif roll < 80 then
- Isaac.Spawn(EntityType.ENTITY_PICKUP, PickupVariant.PICKUP_CARD, CARD_RUNE_ALGIZ, Grab.Bomb.Position, Grab.Bomb.Velocity, Shell.Target)
- elseif roll < 90 then
- Isaac.Spawn(EntityType.ENTITY_PICKUP, PickupVariant.PICKUP_CARD, CARD_RUNE_BLANK, Grab.Bomb.Position, Grab.Bomb.Velocity, Shell.Target)
- else Isaac.Spawn(EntityType.ENTITY_PICKUP, PickupVariant.PICKUP_CARD, CARD_RUNE_BLACK, Grab.Bomb.Position, Grab.Bomb.Velocity, Shell.Target)
- end
- Grab.Bomb:Remove()
- Grab.Bomb = nil
- end
- end
- end
- Shell.Target = nil
- --now a doublebomb
- elseif Shell.Target.State == BeggarState.PAYPRICE and Isaac.Spawn(EntityType.ENTITY_PICKUP, PickupVariant.PICKUP_BOMB, BombSubType.BOMB_DOUBLEPACK, Shell.Target.Position, 0, Shell.Target) then
- local numberBombs = Isaac:CountEntities(Shell.Target, EntityType.ENTITY_PICKUP, PickupVariant.PICKUP_BOMB, BombSubType.BOMB_DOUBLEPACK)
- local shellEntities = Isaac.FindInRadius(Shell.Target.Position, 50, EntityPartition.PICKUP)
- for p = 1, numberBombs do
- for f, pickup in pairs(shellEntities) do
- if pickup.Variant == PickupVariant.PICKUP_BOMB
- and pickup.Subtype == BombSubType.BOMB_DOUBLPACK then
- --if the game finds a doublebomb, then it will replace it with a random rune
- Grab.Bomb = pickup
- local rng = player:GetCollectibleRNG(CollectibleType.COLLECTIBLE_TOY_SKULL)
- local roll = rng:RandomInit(100)
- if roll < 10 then
- Isaac.Spawn(EntityType.ENTITY_PICKUP, PickupVariant.PICKUP_CARD, CARD_RUNE_HAGALAZ, Grab.Bomb.Position, Grab.Bomb.Velocity, Shell.Target)
- esleif roll < 20 then
- Isaac.Spawn(EntityType.ENTITY_PICKUP, PickupVariant.PICKUP_CARD, CARD_RUNE_JERA, Grab.Bomb.Position, Grab.Bomb.Velocity, Shell.Target)
- elseif roll < 30 then
- Isaac.Spawn(EntityType.ENTITY_PICKUP, PickupVariant.PICKUP_CARD, CARD_RUNE_EHWAZ, Grab.Bomb.Position, Grab.Bomb.Velocity, Shell.Target)
- elseif roll < 40 then
- Isaac.Spawn(EntityType.ENTITY_PICKUP, PickupVariant.PICKUP_CARD, CARD_RUNE_DAGAZ, Grab.Bomb.Position, Grab.Bomb.Velocity, Shell.Target)
- elseif roll < 50 then
- Isaac.Spawn(EntityType.ENTITY_PICKUP, PickupVariant.PICKUP_CARD, CARD_RUNE_ANSUZ, Grab.Bomb.Position, Grab.Bomb.Velocity, Shell.Target)
- elseif roll < 60 then
- Isaac.Spawn(EntityType.ENTITY_PICKUP, PickupVariant.PICKUP_CARD, CARD_RUNE_PERTHRO, Grab.Bomb.Position, Grab.Bomb.Velocity, Shell.Target)
- esleif roll < 70 then
- Isaac.Spawn(EntityType.ENTITY_PICKUP, PickupVariant.PICKUP_CARD, CARD_RUNE_BERKANO, Grab.Bomb.Position, Grab.Bomb.Velocity, Shell.Target)
- elseif roll < 80 then
- Isaac.Spawn(EntityType.ENTITY_PICKUP, PickupVariant.PICKUP_CARD, CARD_RUNE_ALGIZ, Grab.Bomb.Position, Grab.Bomb.Velocity, Shell.Target)
- elseif roll < 90 then
- Isaac.Spawn(EntityType.ENTITY_PICKUP, PickupVariant.PICKUP_CARD, CARD_RUNE_BLANK, Grab.Bomb.Position, Grab.Bomb.Velocity, Shell.Target)
- else Isaac.Spawn(EntityType.ENTITY_PICKUP, PickupVariant.PICKUP_CARD, CARD_RUNE_BLACK, Grab.Bomb.Position, Grab.Bomb.Velocity, Shell.Target)
- end
- Grab.Bomb:Remove()
- Grab.Bomb = nil
- end
- end
- end
- Shell.Target = nil
- end
- end
- end
- ToySkull:AddCallback(ModCallbacks.MC_NPC_UPDATE, ToySkull.onPayout, EntityType.ENTITY_SLOT)
Advertisement
Add Comment
Please, Sign In to add comment