local Lore = RegisterMod( "thecreativelore", 1 ); local game = Game() local Room = Room -- TO_DO[ -- -- ITEMS[ -- -- * Add items in pools -- -- [Yale Horns]: -- * Make tear inherit common tear properties smh -- * Make sure tear properly scales with player.ShotSpeed -- -- [Mommy of Two]: -- [DONE] Baby Ariel whole sprite -- [DONE] Baby Yari behaviour -- * do Ariel behaviour -- * finish Yari's one too. -- * Code in Best Friends Forever Interaction!! -- -- [Drake Soul]: -- * Make effect happen; < 3 hp -> DMG MULT = 1.25, RANGE += 20 -- * Decide if go with costume as Noe suggested (horns again?) or better -- do a phrase like Whore of Babylon. -- * I like the second better. -- -- [Bronze Wings]: -- * Get the costume off Nerielle and make it this item instead. -- * Make that when u get the item, player can fly. -- * This is really that simple. -- -- [Scaly Egg]: -- * Make Lil Drake functional -- * SPRITE Lil Drake -- * Code in Mommy of Two synergy. -- * Code in Best Friends Forever Interaction!! -- -- [Bronze Scale]: -- * Code in the fire resistance -- * Costume spriting -- -- [Zappy Breath]: -- * Get Actives Working on this -- * Fire Tech X shot somehow -- -- [Dragon Mark]: -- * Sprite this somehow!!?? -- * Think of a better costume. Anything than horns honestly, thats for Nerielle. -- * Give tears burning effect -- * +1 DMG -- * Soul heart :D -- -- [Succubus Charm] -- * Make it more fun and engaging -- * Make the poison overtime work/check if its the charmed anim over it -- * Remove charm if ToPoison -- -- [TRANSFORMATION: True Dragon] -- * Get this Working -- * Add effects -- ] -- -- PLAYERS[ -- [Ariel]: -- * Get Ariel a fun mechanic -- * Get costume properly layered -- * Fix Ariel Shooting anim -- broken -- -- [Nerielle]: -- * Fix Nerielle Shooting anim -- broken. -- * Get Nerielle her items. -- -- [Yari] -- * Give mom kisses -- ] -- ] --[[ USEFUL FUNCTIONS ]]-- local function SpawnFollower(Type, player) return Isaac.Spawn(EntityType.ENTITY_FAMILIAR, Type, 0, player.Position, Vector(0,0), player):ToFamiliar() end local function RealignFamiliars() local Caboose = nil for _, entity in pairs(Isaac.GetRoomEntities()) do if entity.Type == EntityType.ENTITY_FAMILIAR and entity.Child == nil then if Caboose == nil then Caboose = entity else if Caboose.FrameCount < entity.FrameCount then Caboose.Parent = entity entity.Child = Caboose else Caboose.Child = entity entity.Parent = Caboose end end end end end local function FindClosestEnemy( position, distance, validator ) local closestDistance = distance or 9999 local closestEnemy = nil local enemies = Isaac.FindInRadius( position, closestDistance, EntityPartition.ENEMY ) for k,enemy in ipairs(enemies) do if enemy:IsActiveEnemy() == true and enemy:IsVulnerableEnemy() == true and enemy:HasEntityFlags( EntityFlag.FLAG_FRIENDLY ) == false then local distance = (position - enemy.Position):Length() if distance < closestDistance then if validator == nil or validator(enemy) == true then closestEnemy = enemy closestDistance = distance end end end end return closestEnemy end --[[ DECLARING ITEMS ]]-- -- Passive Yale Horns CollectibleType.COLLECTIBLE_YALE_HORNS = Isaac.GetItemIdByName("Yale Horns") -- Passive Drake Soul CollectibleType.COLLECTIBLE_DRAKE_SOUL = Isaac.GetItemIdByName("Drake Soul") -- Passive Bronze Scale Collar CollectibleType.COLLECTIBLE_BRONZE_SCALE = Isaac.GetItemIdByName("Bronze Scale Collar") -- Passive Dragon Mark CollectibleType.COLLECTIBLE_DRAGON_MARK = Isaac.GetItemIdByName("Dragon Mark") -- Familiar Mommy of Two CollectibleType.COLLECTIBLE_MOMMY_OF_TWO = Isaac.GetItemIdByName("Mommy of Two") FamiliarVariant.BABY_ARIEL = Isaac.GetEntityVariantByName("Baby Ariel") FamiliarVariant.BABY_YARI = Isaac.GetEntityVariantByName("Baby Yari") -- Familiar Scaly Egg CollectibleType.COLLECTIBLE_SCALY_EGG = Isaac.GetItemIdByName("Scaly Egg") FamiliarVariant.LIL_DRAKE = Isaac.GetEntityVariantByName("Lil Drake") FamiliarVariant.BABY_NERIELLE = Isaac.GetEntityVariantByName("Baby Nerielle") -- Active Zappy Breath CollectibleType.COLLECTIBLE_ZAPPY_BREATH = Isaac.GetItemIdByName("Zappy Breath!") -- Active Succubus Charm CollectibleType.COLLECTIBLE_SUCCUBUS_CHARM = Isaac.GetItemIdByName("Succubus Charm") -- [[ DECLARING CHARACTERS ]] -- -- 01_Ariel local ARIEL_NAME = "01_Ariel"; local ARIEL_TYPE = Isaac.GetPlayerTypeByName(ARIEL_NAME); local ARIEL_STATS = { MoveSpeedNaturalBonus = 0.10, MoveSpeedNaturalMultiplier = 0.9, DamageNaturalMultiplier = 0.70, ShotSpeedNaturalMultiplier = 0.8, MaxFireDelayNaturalMultiplier = 1.0, MaxFireDelayNaturalExponent = 0.9, TearHeightBonus = 12, }; local ARIEL_HEAD = Isaac.GetCostumeIdByPath("gfx/characters/players/01_Ariel_Head.anm2") -- 02_Nerielle local NERIELLE_NAME = "02_Nerielle"; local NERIELLE_TYPE = Isaac.GetPlayerTypeByName(NERIELLE_NAME); local NERIELLE_STATS = { MoveSpeedNaturalBonus = 0.10, MoveSpeedNaturalMultiplier = 0.9, DamageNaturalMultiplier = 0.70, ShotSpeedNaturalMultiplier = 0.8, MaxFireDelayNaturalMultiplier = 1.0, MaxFireDelayNaturalExponent = 0.9, TearHeightBonus = 12, }; local NERIELLE_HEAD = Isaac.GetCostumeIdByPath("gfx/characters/players/02_Nerielle_Head.anm2") -- 03_Sive local SIVE_NAME = "03_Sive"; local SIVE_TYPE = Isaac.GetPlayerTypeByName(SIVE_NAME); local SIVE_STATS = { MoveSpeedNaturalBonus = 0.10, MoveSpeedNaturalMultiplier = 0.9, DamageNaturalMultiplier = 0.70, ShotSpeedNaturalMultiplier = 0.8, MaxFireDelayNaturalMultiplier = 1.0, MaxFireDelayNaturalExponent = 0.9, TearHeightBonus = 12, }; local SIVE_HEAD = Isaac.GetCostumeIdByPath("gfx/characters/players/03_Sive_Head.anm2") -- ON PLAYER INIT!! -- GIVE EM STUFF function Lore:PostPlayerInit( player ) if player:GetPlayerType() == ARIEL_TYPE then player:AddNullCostume( ARIEL_HEAD ); player:AddCollectible( CollectibleType.COLLECTIBLE_SUCCUBUS_CHARM, 0, 0); end if player:GetPlayerType() == NERIELLE_TYPE then player:AddNullCostume( NERIELLE_HEAD ); end if player:GetPlayerType() == SIVE_TYPE then player:AddNullCostume( SIVE_HEAD ); player.SpriteScale = Vector(1.5,1.5); player:AddCollectible( CollectibleType.COLLECTIBLE_MOMMY_OF_TWO, 0, 0); player:AddCollectible( CollectibleType.COLLECTIBLE_YALE_HORNS, 0, 0); end end Lore:AddCallback( ModCallbacks.MC_POST_PLAYER_INIT, Lore.PostPlayerInit ); -- STUFF FOR ENTITIES -- BABY ARIEL! function Lore:GetBabyAriel(Ariel) -- mommy:be_kissed() end Lore:AddCallback(ModCallbacks.MC_FAMILIAR_INIT, Lore.GetBabyAriel, FamiliarVariant.BABY_ARIEL) -- do ur thing baby succubus gal function Lore:UpdateBabyAriel(Ariel) Ariel:FollowParent() end Lore:AddCallback(ModCallbacks.MC_FAMILIAR_UPDATE, Lore.UpdateBabyAriel, FamiliarVariant.BABY_ARIEL) -- BABY YARI function Lore:GetBabyYari(Yari) -- ariel:copy() Yari.FireCooldown = 1 end Lore:AddCallback(ModCallbacks.MC_FAMILIAR_INIT,Lore.GetBabyYari, FamiliarVariant.BABY_YARI) function Lore:UpdateBabyYari(Yari) local player = Isaac.GetPlayer(0) Yari:PickEnemyTarget(400,5) Yari:Shoot() local MoveDir = player:GetMovementDirection() Yari:FollowParent() end Lore:AddCallback(ModCallbacks.MC_FAMILIAR_UPDATE, Lore.UpdateBabyYari, FamiliarVariant.BABY_YARI) -- LIL DRAKE function Lore:GetLilDrake(Drake) -- Drake:doDrakeStuff() end Lore:AddCallback(ModCallbacks.MC_FAMILIAR_INIT,Lore.GetLilDrake, FamiliarVariant.LIL_DRAKE) -- STUFF FOR ITEMS -- Active function Lore:ActivateSuccubusCharm(_Type, RNG) local player = Isaac.GetPlayer(0) local player_data = EntityRef(player) enemies = Isaac.FindInRadius(player.Position, 125, EntityPartition.ENEMY ) for k,enemy in ipairs(enemies) do local enemy_data = EntityRef(enemy); if enemy_data.IsCharmed == true then print("This entity is charmed! Let's poison them!") enemy:AddPoison(player_data, 120, 1) else print("This entity isn't charmed! Let's charm them!") enemy:AddCharmed(120) end end end Lore:AddCallback(ModCallbacks.MC_USE_ITEM, Lore.ActivateSuccubusCharm, CollectibleType.COLLECTIBLE_SUCCUBUS_CHARM) -- STUFF FOR PLAYERS function Lore:PlayerUpdate( player ) if player:GetPlayerType() == ARIEL_TYPE then end if player:GetPlayerType() == NERIELLE_TYPE then end end Lore:AddCallback( ModCallbacks.MC_POST_PLAYER_UPDATE, Lore.PlayerUpdate ); local BabyArielCount = 0 local BabyYariCount = 0 local BabyLilDrakeCount = 0 function Lore:onCache( player, cacheFlag) if cacheFlag == CacheFlag.CACHE_FAMILIARS then for _, entity in pairs(Isaac.GetRoomEntities()) do if EntityType == EntityType.ENTITY_FAMILIAR then if entity.Variant == FamliarVariant.BABY_ARIEL then BabyArielCount = BabyArielCount + 1 elseif entity.Variant == FamliarVariant.BABY_YARI then BabyYariCount = BabyYariCount + 1 elseif entity.Variant == FamliarVariant.LIL_DRAKE then LilDrakeCount = LilDrakeCount + 1 end end end print("FAMILIAR DATA ON INIT") print(" [Ariel] FamiliarVariant:",FamiliarVariant.BABY_ARIEL," Count: ",BabyArielCount) print(" [Yari] FamiliarVariant:",FamiliarVariant.BABY_YARI," Count: ",BabyYariCount) print("[Lil Drake] FamiliarVariant:",FamiliarVariant.LIL_DRAKE," Count: ",BabyLilDrakeCount) while player:GetCollectibleNum(CollectibleType.COLLECTIBLE_MOMMY_OF_TWO) > BabyArielCount do SpawnFollower(FamiliarVariant.BABY_ARIEL, player) BabyArielCount = BabyArielCount + 1 end while player:GetCollectibleNum(CollectibleType.COLLECTIBLE_MOMMY_OF_TWO) > BabyYariCount do SpawnFollower(FamiliarVariant.BABY_YARI, player) BabyYariCount = BabyYariCount + 1 end while player:GetCollectibleNum(CollectibleType.COLLECTIBLE_SCALY_EGG) > BabyLilDrakeCount do SpawnFollower(FamiliarVariant.LIL_DRAKE, player) BabyLilDrakeCount = BabyLilDrakeCount + 1 end RealignFamiliars() end end Lore:AddCallback(ModCallbacks.MC_EVALUATE_CACHE, Lore.onCache) function Lore:EvaluateCache( player, cacheFlag ) local player = Isaac.GetPlayer(0) -- get the player entity if player:GetPlayerType() == ARIEL_TYPE then if cacheFlag == CacheFlag.CACHE_FLYING then player.CanFly = 1 end end if player:GetPlayerType() == NERIELLE_TYPE then if cacheFlag == CacheFlag.CACHE_FLYING then player.CanFly = 1 end end end Lore:AddCallback(ModCallbacks.MC_EVALUATE_CACHE, Lore.EvaluateCache ); Lore:AddCallback(ModCallbacks.MC_POST_FIRE_TEAR, function(_, tear) local player = Isaac.GetPlayer(0) -- get the player entity if player:HasCollectible(CollectibleType.COLLECTIBLE_YALE_HORNS) == true then if yaleTearCount == nil then yaleTearCount = 0 end yaleTearCount = yaleTearCount + 1 if yaleTearCount == 3 then yaleTearCount = 0; local lookout = player:GetAimDirection() local at = math.random(-180,179) local finalTear = lookout:Rotated(at):Resized(player.ShotSpeed*10) local tearCopy = tear.Variant Isaac.Spawn(EntityType.ENTITY_TEAR, tearCopy, 0, player.Position, finalTear, player):ToTear() local finalTear = lookout:Rotated(at+180):Resized(player.ShotSpeed*10) local tearCopy = tear.Variant Isaac.Spawn(EntityType.ENTITY_TEAR, tearCopy, 0, player.Position, finalTear, player):ToTear() end end if player:GetPlayerType() == ARIEL_TYPE then tear.TearFlags = tear.TearFlags | TearFlags.TEAR_CHARM -- add slowing effect to the tear end if player:GetPlayerType() == NERIELLE_TYPE then tear.TearFlags = tear.TearFlags | TearFlags.TEAR_BURN -- add slowing effect to the tear end end)