lukanpeixe / projetocastleroid

Trabalhando em códigos para o mod/mapa de aventura para Terraria produzido pelo Idealizador e seguidores do canal Press key to play.
Apache License 2.0
8 stars 7 forks source link

5 - Troca de Dia e Noite com uso de wires #30

Closed SamuelDeboni closed 7 years ago

SamuelDeboni commented 7 years ago

Troca entre dia e noite quando recebe um sinal de wire. Foi baseado em um script de uma estatua por já ter funcionamento com partir de wires.

`using Microsoft.Xna.Framework; using System; using System.Linq; using Terraria; using Terraria.DataStructures; using Terraria.ID; using Terraria.ModLoader; using Terraria.ObjectData;

namespace Castleroid.Tiles { public class WiringSundial : ModTile { public override void SetDefaults() { Main.tileObsidianKill[Type] = true; TileObjectData.newTile.CopyFrom(TileObjectData.Style2xX); TileObjectData.addTile(Type); AddMapEntry(new Color(190, 230, 190), "WiringSundial"); dustType = 11; disableSmartCursor = true; }

    public override void KillMultiTile(int i, int j, int frameX, int frameY)
    {
        Item.NewItem(i * 16, j * 16, 32, 48, mod.ItemType("WiringSundialItem"));
    }

    public override void HitWire(int i, int j)
    {
        bool b = false;
        // Find the coordinates of top left tile square through math
        int y = j - (Main.tile[i, j].frameY / 18);
        int x = i - (Main.tile[i, j].frameX / 18);

        Wiring.SkipWire(x, y);
        Wiring.SkipWire(x, y + 1);
        Wiring.SkipWire(x, y + 2);
        Wiring.SkipWire(x + 1, y);
        Wiring.SkipWire(x + 1, y + 1);
        Wiring.SkipWire(x + 1, y + 2);

        if (Wiring.CheckMech(x, y, 30))
        {
            b = !b;

        }

        if(b)
            Main.time = 32400.1;
        else
            Main.time = 0;

    }
}

public class WiringSundialItem : ModItem
{
    public override void SetDefaults()
    {
        item.CloneDefaults(ItemID.Actuator);
        item.name = "WiringSundial";
        item.createTile = mod.TileType("WiringSundial");
        item.placeStyle = 0;
    }
}

} `

lukanpeixe commented 7 years ago

Isso parece maravilhoso, vai ser útil em algumas ocasiões.

Vou entender o código e talvez altere algumas coisas, para que exista um objeto que sempre deixe de noite quado ativado e outro que sempre deixe de dia, assim podemos personalizar a área para cada área do castelo, como Castlevania SOTN onde a catedral é um ambiente diurno e todo o resto do castelo é noturno.

lukanpeixe commented 7 years ago

Tentei fazer funcionar, mas o burro aqui se embananou na hora de fazer o código do item e deu um monte de erro kkk

Mas analisando o código, aparentemente ele copia a função do Sundial né? Enfim, esperarei oura pessoa ajeitar esta parte ou outro dia eu tento.

SamuelDeboni commented 7 years ago

Talvez de problema por falta dos sprites, WiringSundial e WiringSundiaItem na pasta tiles, então e só extrair esse arquivo com o script e sprites na pasta tiles e ai e so editar como quiser. WiringSundial.zip

lukanpeixe commented 7 years ago

Talvez de problema por falta dos sprites, WiringSundial e WiringSundiaItem na pasta tiles, então e só extrair esse arquivo com o script e sprites na pasta tiles e ai e so editar como quiser.

Na verdade, eu fui inventar moda de renomear o item/tile e acabei fazendo besteira (devo ter confundido um termo com o outro) enfim, vou testar a sua pasta aqui e já dou um retorno,

lukanpeixe commented 7 years ago

Beleza, testei aqui.

No castelo haverão 3 ambientes que gostaria que fosse diurno, e por isso um item de wire seria interessante para cambiar o tempo. Porém, se estiver muito complexo o processo, podemos deixar setado para noite eterna mesmo.

O ideal seria ter um item que deixa-se de dia e outro que deixa-se de noite.

Sobre a lambança que eu fiz, foi o seguinte: eu tentei atribuir o tile a um item com código separado na pasta item. Não tinha reparado que tanto o item quanto o tile estavam fazendo referência a mesma pasta (neste caso, a pasta tile),

SamuelDeboni commented 7 years ago

Vou fazer dois itens então, um para deixar de dia e outro para deixar de noite, deve facilitar.

SamuelDeboni commented 7 years ago

Pronto


using Microsoft.Xna.Framework;
using System;
using System.Linq;
using Terraria;
using Terraria.DataStructures;
using Terraria.ID;
using Terraria.ModLoader;
using Terraria.ObjectData;

namespace Castleroid.Tiles
{
    public class WiringSundial : ModTile
    {
        public override void SetDefaults()
        {
            // For some reason, setting tileFrameImportant will cause world gen to fail. Stack Overflow
            //Main.tileFrameImportant[Type] = true;

            Main.tileObsidianKill[Type] = true;
            TileObjectData.newTile.CopyFrom(TileObjectData.Style2xX);
            TileObjectData.addTile(Type);
            AddMapEntry(new Color(190, 230, 190), "WiringSundial");
            dustType = 11;
            disableSmartCursor = true;
        }

        public override void KillMultiTile(int i, int j, int frameX, int frameY)
        {
            Item.NewItem(i * 16, j * 16, 32, 48, mod.ItemType("WiringSundialItem"));
        }

        public override void HitWire(int i, int j)
        {
            // Find the coordinates of top left tile square through math
            int y = j - (Main.tile[i, j].frameY / 18);
            int x = i - (Main.tile[i, j].frameX / 18);

            Wiring.SkipWire(x, y);
            Wiring.SkipWire(x, y + 1);
            Wiring.SkipWire(x, y + 2);
            Wiring.SkipWire(x + 1, y);
            Wiring.SkipWire(x + 1, y + 1);
            Wiring.SkipWire(x + 1, y + 2);

            if (Wiring.CheckMech(x, y, 30))
            {
                Main.time = 32400.1;
            }
        }
    }

    public class WiringSundialItem : ModItem
    {
        public override void SetDefaults()
        {
            item.CloneDefaults(ItemID.Actuator);
            item.name = "WiringSundial";
            item.createTile = mod.TileType("WiringSundial");
            item.placeStyle = 0;
        }
    }

}

e wiring muldial


using Microsoft.Xna.Framework;
using System;
using System.Linq;
using Terraria;
using Terraria.DataStructures;
using Terraria.ID;
using Terraria.ModLoader;
using Terraria.ObjectData;

namespace Castleroid.Tiles
{
    public class WiringMundial : ModTile
    {
        public override void SetDefaults()
        {
            // For some reason, setting tileFrameImportant will cause world gen to fail. Stack Overflow
            //Main.tileFrameImportant[Type] = true;

            Main.tileObsidianKill[Type] = true;
            TileObjectData.newTile.CopyFrom(TileObjectData.Style2xX);
            TileObjectData.addTile(Type);
            AddMapEntry(new Color(190, 230, 190), "WiringMundial");
            dustType = 11;
            disableSmartCursor = true;
        }

        public override void KillMultiTile(int i, int j, int frameX, int frameY)
        {
            Item.NewItem(i * 16, j * 16, 32, 48, mod.ItemType("WiringMundialItem"));
        }

        public override void HitWire(int i, int j)
        {
            // Find the coordinates of top left tile square through math
            int y = j - (Main.tile[i, j].frameY / 18);
            int x = i - (Main.tile[i, j].frameX / 18);

            Wiring.SkipWire(x, y);
            Wiring.SkipWire(x, y + 1);
            Wiring.SkipWire(x, y + 2);
            Wiring.SkipWire(x + 1, y);
            Wiring.SkipWire(x + 1, y + 1);
            Wiring.SkipWire(x + 1, y + 2);

            if (Wiring.CheckMech(x, y, 30))
            {
                Main.time = 0;
            }
        }
    }

    public class WiringMundialItem : ModItem
    {
        public override void SetDefaults()
        {
            item.CloneDefaults(ItemID.Actuator);
            item.name = "WiringMundial";
            item.createTile = mod.TileType("WiringMundial");
            item.placeStyle = 0;
        }
    }

}
lukanpeixe commented 7 years ago

Vou fazer dois itens então, um para deixar de dia e outro para deixar de noite, deve facilitar.

Obrigadão Samuel, não vou poder testar agora, mas quando puder eu dou meu feedback :smiley:

lukanpeixe commented 7 years ago

Finalmente pude testar (o diurno) e esta OK! :smile_cat: Mas ainda há uma questão: manter o tempo continuo. Tentei duas coisas: Chutar termos genéricos para zerar a passagem do tempo, como Main.timeCount // Main.timeTransition // Main.timeSpeedy tudo = 0 mas não existe uma atribuição para estas linhas. Usar este troço após o Main.time (almejando um looping)

for (; ; )
{
    // ...
}

Fonte: https://msdn.microsoft.com/pt-BR/library/ch45axte.aspx Mas congelou o jogo haha

Enfim, deve ter um meio, não muito complicado de fazer o Main.time = 32400.1; a cada 15 frames (0,25 seg) e criar uma condição para paralisar o loop, condição essa que seria ativada no outro item noturno, que também teria um loop e uma condição para ser ativada com o item diurno. (quase bugei nessa frase)

É isso, por hoje, chega de código, deixa eu ir jantar/dormir ;D

Kemado commented 7 years ago

isoo funciona assim for(i = 0; i < 10 ; i++) enquanto o i for menor que 10 ele executa uma peça de código; e meio complexo explicar assim. O motivo do jogo congelar é porque ele compila o mesmo código 60x por segundo, ou fps que vc tem e o for executa até ele terminar as 10, 15, 200 vezes que foi programado.

SamuelDeboni commented 7 years ago

consegui subittitui o Main.Time = 32400.1; por Main.time = Main.time-1; assim a cada frame o tempo e adicionado em 1 mas com esse comando coloca o tempo para o valor do frame anterior e desta forma o tempo fica parado porem mesmo assim da para mudar o tempo com o wiringSundial

lukanpeixe commented 7 years ago

Muito obrigado pela ajuda @SamuelDeboni

Peguei o Main.Time-1; e coloquei no Castleroid.cs e depois peguei parte de seu código do WiringSundial e quebrei a cabeça para fazer dois itens visualmente amigáveis para alteração para Dia e Noite e funciona perfeitamente.

Até descobri uma coisa bizarra: Deixei o Main.time = -32400.1; e além de obviamente bugar o relógio, o mapa ficou assustadoramente vermelho cor de sangue O_O vai dar para usar isso a nosso favor xD

A única coisa que não consegui foi botar o horário noturno para a meia noite (00:00 / Lua no Meio da Tela).

Main.time = 0 volta 07:30PM se não me engano :/

SamuelDeboni commented 7 years ago

meia noite e Main.time = 16240

lukanpeixe commented 7 years ago

meia noite e Main.time = 16240

Não deu certo, voltou AM 09:00.

SamuelDeboni commented 7 years ago

Estranho, comigo deu. Coloquei o Main.time = 16240 no wiringSundial e 12:00AM certinho

lukanpeixe commented 7 years ago

Estranho, comigo deu.

ihhhh começou as dorgas haha

Eu vou upar os itens que eu fiz e logo libero do Gdrive, ai você dá uma olhada :D

lukanpeixe commented 7 years ago

Embora não tenha ainda fechado a questão da meia noite, fecharei o tópico porque o MoonSummon e SunSummon funcionam de forma satisfatória. Informações extras sobre o assunto podem ser tratadas na #14