Commit 8eac20f1 authored by 神楽坂玲奈's avatar 神楽坂玲奈

first commit

parents
namespace ImgGen
{
using System;
public enum Attribute
{
ATTRIBUTE_DARK = 0x20,
ATTRIBUTE_DEVINE = 0x40,
ATTRIBUTE_EARTH = 1,
ATTRIBUTE_FIRE = 4,
ATTRIBUTE_LIGHT = 0x10,
ATTRIBUTE_WATER = 2,
ATTRIBUTE_WIND = 8
}
}
namespace ImgGen
{
using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential)]
public struct Data
{
public int code;
public int alias;
public int setcode;
public int type;
public int level;
public int attribute;
public int race;
public int attack;
public int defence;
}
}
namespace ImgGen
{
using System;
using System.Collections.Generic;
using System.Data.SQLite;
using System.Drawing;
using System.Text.RegularExpressions;
using System.Drawing.Drawing2D;
public class DataManager
{
private static Bitmap[] bAttributes = new Bitmap[8];
private static Bitmap[] bStar = new Bitmap[2];
private static Bitmap[] bTemplates = new Bitmap[15];
private static Bitmap[] bType = new Bitmap[15];
private static Dictionary<int, Data> cardDatas = new Dictionary<int, Data>();
private static Dictionary<int, Bitmap> cardImages = new Dictionary<int, Bitmap>();
private static Dictionary<int, Text> cardTexts = new Dictionary<int, Text>();
private static SQLiteConnection conn = new SQLiteConnection("Data Source=../cards.cdb");
private static Dictionary<int, string> ctStrings = new Dictionary<int, string>();
private static object locker = new object();
private static SolidBrush nameBrush = new SolidBrush(Color.FromArgb(0x40, 0x40, 0));
private static Font nameFont;
private static Font numFont;
private static Dictionary<int, string> sysStrings = new Dictionary<int, string>();
private static SolidBrush textBrush = new SolidBrush(Color.FromArgb(0x40, 0x40, 0x40));
private static Font txtFont;
private static SolidBrush typeBrush = new SolidBrush(Color.FromArgb(0x20, 0x20, 0x20));
private static Font typeFont;
private static Dictionary<int, string> winStrings = new Dictionary<int, string>();
private static string regex_monster = @"[果|介|述|報]】\n([\S\s]*)";
private static string regex_pendulum = @"】[\s\S]*?\n([\S\s]*?)\n【";
public static Data GetCardData(int code)
{
if (!cardDatas.ContainsKey(code))
{
LoadCard(code);
}
return cardDatas[code];
}
public static string GetCardDescription(int code)
{
if (!cardTexts.ContainsKey(code))
{
LoadCard(code);
}
return cardTexts[code].text;
}
public static string GetCardName(int code)
{
if (!cardTexts.ContainsKey(code))
{
LoadCard(code);
}
return cardTexts[code].name;
}
public static string GetCardString(int desc)
{
int key = (desc >> 4) & 0xfffffff;
int index = desc & 15;
if (!cardTexts.ContainsKey(key))
{
LoadCard(key);
}
return cardTexts[key].desc[index];
}
public static string GetCounterName(int code)
{
if (ctStrings.ContainsKey(code))
{
return ctStrings[code];
}
return "";
}
public static Bitmap GetImage(int code)
{
if (!cardImages.ContainsKey(code))
{
LoadCard(code);
}
return cardImages[code];
}
public static string GetSystemString(int code)
{
if (sysStrings.ContainsKey(code))
{
return sysStrings[code];
}
return "";
}
private static string gettypestring(Data dat)
{
string str = "【";
switch (dat.race)
{
case 0x10:
str = str + "不死族";
break;
case 0x20:
str = str + "机械族";
break;
case 0x40:
str = str + "水族";
break;
case 1:
str = str + "战士族";
break;
case 2:
str = str + "魔法师族";
break;
case 4:
str = str + "天使族";
break;
case 8:
str = str + "恶魔族";
break;
case 0x80:
str = str + "炎族";
break;
case 0x100:
str = str + "岩石族";
break;
case 0x200:
str = str + "鸟兽族";
break;
case 0x400:
str = str + "植物族";
break;
case 0x800:
str = str + "昆虫族";
break;
case 0x4000:
str = str + "兽族";
break;
case 0x8000:
str = str + "兽战士族";
break;
case 0x10000:
str = str + "恐龙族";
break;
case 0x1000:
str = str + "雷族";
break;
case 0x2000:
str = str + "龙族";
break;
case 0x20000:
str = str + "鱼族";
break;
case 0x40000:
str = str + "海龙族";
break;
case 0x80000:
str = str + "爬虫类族";
break;
case 0x100000:
str = str + "念动力族";
break;
case 0x200000:
str = str + "幻神兽族";
break;
case 0x400000:
str = str + "创造神族";
break;
case 0x800000:
str = str + "幻龙族";
break;
}
if ((dat.type & 0x8020c0) != 0)
{
if ((dat.type & 0x800000) != 0)
{
str = str + "/超量";
}
else if ((dat.type & 0x2000) != 0)
{
str = str + "/同调";
}
else if ((dat.type & 0x40) != 0)
{
str = str + "/融合";
}
else if ((dat.type & 0x80) != 0)
{
str = str + "/仪式";
}
}
if ((dat.type & 0x200) != 0)
{
str = str + "/灵魂";
}
else if ((dat.type & 0x800) != 0)
{
str = str + "/二重";
}
else if ((dat.type & 0x400) != 0)
{
str = str + "/同盟";
}
else if ((dat.type & 0x400000) != 0)
{
str = str + "/卡通";
}
else if ((dat.type & 0x1000000) != 0)
{
str = str + "/灵摆";
}
if ((dat.type & 0x1000) != 0)
{
str = str + "/调整";
}
if ((dat.type & 0x20) != 0)
{
str = str + "/效果";
}
return (str + "】");
}
public static void InitialDatas()
{
numFont = new Font("Arial", 5.5f);
nameFont = new Font("文泉驿微米黑", 10f);
typeFont = new Font("文泉驿微米黑", 6f);
txtFont = new Font("文泉驿微米黑", 5f);
bTemplates[0] = new Bitmap("./textures/card_spell.jpg");
bTemplates[1] = new Bitmap("./textures/card_trap.jpg");
bTemplates[2] = new Bitmap("./textures/card_synchro.jpg");
bTemplates[3] = new Bitmap("./textures/card_xyz.jpg");
bTemplates[4] = new Bitmap("./textures/card_fusion.jpg");
bTemplates[5] = new Bitmap("./textures/card_ritual.jpg");
bTemplates[6] = new Bitmap("./textures/card_token.jpg");
bTemplates[7] = new Bitmap("./textures/card_effect.jpg");
bTemplates[8] = new Bitmap("./textures/card_normal.jpg");
bTemplates[9] = new Bitmap("./textures/card_pxyz.jpg");
bTemplates[10] = new Bitmap("./textures/card_peffect.jpg");
bTemplates[11] = new Bitmap("./textures/card_pnormal.jpg");
bAttributes[0] = new Bitmap("./textures/att_earth.png");
bAttributes[1] = new Bitmap("./textures/att_water.png");
bAttributes[2] = new Bitmap("./textures/att_fire.png");
bAttributes[3] = new Bitmap("./textures/att_wind.png");
bAttributes[4] = new Bitmap("./textures/att_light.png");
bAttributes[5] = new Bitmap("./textures/att_dark.png");
bAttributes[6] = new Bitmap("./textures/att_devine.png");
bStar[0] = new Bitmap("./textures/star.png");
bStar[1] = new Bitmap("./textures/starb.png");
bType[0] = new Bitmap("./textures/spell1.png");
bType[1] = new Bitmap("./textures/spell2.png");
bType[2] = new Bitmap("./textures/trap1.png");
bType[3] = new Bitmap("./textures/trap2.png");
bType[4] = new Bitmap("./textures/type_continuous.png");
bType[5] = new Bitmap("./textures/type_counter.png");
bType[6] = new Bitmap("./textures/type_equip.png");
bType[7] = new Bitmap("./textures/type_field.png");
bType[8] = new Bitmap("./textures/type_quickplay.png");
bType[9] = new Bitmap("./textures/type_ritual.png");
}
private static int LoadCard(int code)
{
lock (locker)
{
int num2;
if (cardDatas.ContainsKey(code))
{
return 0;
}
Data data = new Data();
Text text = new Text();
data.code = code;
text.desc = new string[0x10];
text.name = "???";
text.text = "???";
try
{
conn.Open();
SQLiteCommand command = new SQLiteCommand(string.Format("select * from datas where id={0}", code), conn);
SQLiteDataReader reader = command.ExecuteReader();
if (reader.Read())
{
data.code = reader.GetInt32(0);
data.alias = reader.GetInt32(2);
data.setcode = reader.GetInt32(3);
data.type = reader.GetInt32(4);
data.attack = reader.GetInt32(5);
data.defence = reader.GetInt32(6);
data.level = reader.GetInt32(7);
data.race = reader.GetInt32(8);
data.attribute = reader.GetInt32(9);
}
reader.Close();
string str = string.Format("select * from texts where id={0}", code);
command.CommandText = str;
reader = command.ExecuteReader();
if (reader.Read())
{
text.name = reader.GetString(1);
text.text = reader.GetString(2);
num2 = 0;
while (num2 < 0x10)
{
text.desc[num2] = reader.GetString(3 + num2);
num2++;
}
}
reader.Close();
}
catch
{
}
finally
{
conn.Close();
}
cardDatas.Add(code, data);
cardTexts.Add(code, text);
if (!cardImages.ContainsKey(code))
{
Bitmap bitmap;
SizeF ef;
int num4;
if ((data.type & 2) != 0)
{
bitmap = new Bitmap(bTemplates[0]);
}
else if ((data.type & 4) != 0)
{
bitmap = new Bitmap(bTemplates[1]);
}
else if ((data.type & 0x2000) != 0)
{
bitmap = new Bitmap(bTemplates[2]);
}
else if ((data.type & 0x800000) != 0)
{
if ((data.type & 0x1000000) != 0)
{
bitmap = new Bitmap(bTemplates[9]);
}
else
{
bitmap = new Bitmap(bTemplates[3]);
}
}
else if ((data.type & 0x40) != 0)
{
bitmap = new Bitmap(bTemplates[4]);
}
else if ((data.type & 0x80) != 0)
{
bitmap = new Bitmap(bTemplates[5]);
}
else if ((data.type & 0x4000) != 0)
{
bitmap = new Bitmap(bTemplates[6]);
}
else if ((data.type & 0x20) != 0)
{
if ((data.type & 0x1000000) != 0)
{
bitmap = new Bitmap(bTemplates[10]);
}
else
{
bitmap = new Bitmap(bTemplates[7]);
}
}
else
{
if ((data.type & 0x1000000) != 0)
{
bitmap = new Bitmap(bTemplates[11]);
}
else
{
bitmap = new Bitmap(bTemplates[8]);
}
}
Graphics graphics = Graphics.FromImage(bitmap);
text.text = tosbc(text.text);
if ((data.type & 1) != 0)
{
int y = 15;
if ((data.type & 0x800000) == 0)
{
if ((data.type & 0x1000000) == 0)
{
for (num2 = 0; num2 < (data.level & 0xff); num2++)
{
graphics.DrawImage(bStar[0], 149 - (12 * num2), 0x25, 11, 11);
}
}
else
{
for (num2 = 0; num2 < (data.level & 0xff); num2++)
{
graphics.DrawImage(bStar[0], 149 - (12 * num2), 0x23, 11, 11);
}
y = 12;
}
}
else
{
for (num2 = 0; num2 < (data.level & 0xff); num2++)
{
graphics.DrawImage(bStar[1], 17 + (12 * num2), 0x23, 11, 11);
}
y = 12;
}
if (data.attribute == 1)
{
graphics.DrawImage(bAttributes[0], 0x90, y, 0x12, 0x12);
}
else if (data.attribute == 2)
{
graphics.DrawImage(bAttributes[1], 0x90, y, 0x12, 0x12);
}
else if (data.attribute == 4)
{
graphics.DrawImage(bAttributes[2], 0x90, y, 0x12, 0x12);
}
else if (data.attribute == 8)
{
graphics.DrawImage(bAttributes[3], 0x90, y, 0x12, 0x12);
}
else if (data.attribute == 0x10)
{
graphics.DrawImage(bAttributes[4], 0x90, y, 0x12, 0x12);
}
else if (data.attribute == 0x20)
{
graphics.DrawImage(bAttributes[5], 0x90, y, 0x12, 0x12);
}
else if (data.attribute == 0x40)
{
graphics.DrawImage(bAttributes[6], 0x90, y, 0x12, 0x12);
}
if ((data.type & 0x1000000) == 0)
{
if ((data.type & 0x800000) == 0)
{
if (data.attack >= 0)
{
graphics.DrawString(data.attack.ToString(), numFont, Brushes.Black, (float)105f, (float)231f);
}
else
{
graphics.DrawString("?", numFont, textBrush, (float)115f, (float)231f);
}
if (data.defence >= 0)
{
graphics.DrawString(data.defence.ToString(), numFont, Brushes.Black, (float)142f, (float)231f);
}
else
{
graphics.DrawString("?", numFont, textBrush, (float)152f, (float)231f);
}
}
else
{
if (data.attack >= 0)
{
graphics.DrawString(data.attack.ToString(), numFont, Brushes.Black, (float)109f, (float)231f);
}
else
{
graphics.DrawString("?", numFont, textBrush, (float)119f, (float)231f);
}
if (data.defence >= 0)
{
graphics.DrawString(data.defence.ToString(), numFont, Brushes.Black, (float)145f, (float)231f);
}
else
{
graphics.DrawString("?", numFont, textBrush, (float)155f, (float)231f);
}
}
}
else
{
if (data.attack >= 0)
{
graphics.DrawString(data.attack.ToString(), numFont, Brushes.Black, (float)105f, (float)231f);
}
else
{
graphics.DrawString("?", numFont, textBrush, (float)115f, (float)231f);
}
if (data.defence >= 0)
{
graphics.DrawString(data.defence.ToString(), numFont, Brushes.Black, (float)142f, (float)231f);
}
else
{
graphics.DrawString("?", numFont, textBrush, (float)152f, (float)231f);
}
}
if ((data.type & 0x800000) == 0 && (data.type & 0x1000000) == 0)
{
graphics.DrawString(gettypestring(data), typeFont, typeBrush, (float) 13f, (float) 195f);
ef = graphics.MeasureString(text.text, txtFont, 0x91);
num4 = 0x91;
while (ef.Height > (((float) (0x19 * num4)) / 145f))
{
num4 += 3;
ef = graphics.MeasureString(text.text, txtFont, num4);
}
graphics.TranslateTransform(16f, 205f);
graphics.ScaleTransform(145f / ((float) num4), 145f / ((float) num4));
graphics.DrawString(text.text, txtFont, textBrush, new RectangleF(0f, 0f, ef.Width, ef.Height));
graphics.ResetTransform();
}
else if ((data.type & 0x1000000) == 0)//xyz
{
graphics.DrawString(gettypestring(data), typeFont, typeBrush, (float) 12f, (float) 192f);
ef = graphics.MeasureString(text.text, txtFont, 0x91);
num4 = 0x91;
while (ef.Height > (((float) (0x1c * num4)) / 145f))
{
num4 += 3;
ef = graphics.MeasureString(text.text, txtFont, num4);
}
graphics.TranslateTransform(16f, 202f);
graphics.ScaleTransform(145f / ((float) num4), 145f / ((float) num4));
graphics.DrawString(text.text, txtFont, textBrush, new RectangleF(0f, 0f, ef.Width, ef.Height));
graphics.ResetTransform();
}
else//pendulum
{
graphics.DrawString(gettypestring(data), typeFont, typeBrush, (float)12f, (float)192f);
string monster_effect = GetDesc(text.text, regex_monster);
string pendulum_effect = GetDesc(text.text, regex_pendulum);
int lscale = (data.level >> 0x18) & 0xff;
int rscale = (data.level >> 0x10) & 0xff;
if (lscale > 9)
{
graphics.DrawString(lscale.ToString(), new Font("文泉驿微米黑", 7f), Brushes.Black, (float)13f, (float)174f);
}
else
{
graphics.DrawString(lscale.ToString(), new Font("文泉驿微米黑", 8f), Brushes.Black, (float)16f, (float)174f);
}
if (rscale > 9)
{
graphics.DrawString(rscale.ToString(), new Font("文泉驿微米黑", 7f), Brushes.Black, (float)150f, (float)174f);
}
else
{
graphics.DrawString(rscale.ToString(), new Font("文泉驿微米黑", 8f), Brushes.Black, (float)151f, (float)174f);
}
ef = graphics.MeasureString(monster_effect, txtFont, 0x91);
num4 = 0x91;
while (ef.Height > (((float)(0x1c * num4)) / 145f))
{
num4 += 3;
ef = graphics.MeasureString(monster_effect, txtFont, num4);
}
graphics.TranslateTransform(16f, 202f);
graphics.ScaleTransform(145f / ((float)num4), 145f / ((float)num4));
graphics.DrawString(monster_effect, txtFont, textBrush, new RectangleF(0f, 0f, ef.Width, ef.Height));
graphics.ResetTransform();
int num5;
SizeF pf;
pf = graphics.MeasureString(pendulum_effect, txtFont, 0x77);
num5 = 0x77;
while (pf.Height > (((float)(0x18 * num5)) / 119f))
{
num5 += 1;
pf = graphics.MeasureString(pendulum_effect, txtFont, num5);
}
graphics.TranslateTransform(29f, 162f);
graphics.ScaleTransform(119f / ((float)num5), 119f / ((float)num5));
graphics.DrawString(pendulum_effect, txtFont, textBrush, new RectangleF(0f, 0f, pf.Width, pf.Height));
graphics.ResetTransform();
}
}
else
{
if ((data.type & 2) != 0)
{
if (data.type == 2)
{
graphics.DrawImage(bType[0], 0x65, 0x25);
}
else
{
graphics.DrawImage(bType[1], 0x5c, 0x25);
if ((data.type & 0x20000) != 0)
{
graphics.DrawImage(bType[4], 0x8f, 40);
}
else if ((data.type & 0x40000) != 0)
{
graphics.DrawImage(bType[6], 0x8f, 40);
}
else if ((data.type & 0x80000) != 0)
{
graphics.DrawImage(bType[7], 0x8f, 40);
}
else if ((data.type & 0x10000) != 0)
{
graphics.DrawImage(bType[8], 0x8f, 40);
}
else if ((data.type & 0x80) != 0)
{
graphics.DrawImage(bType[9], 0x8f, 40);
}
}
}
else if ((data.type & 4) != 0)
{
if (data.type == 4)
{
graphics.DrawImage(bType[2], 0x6f, 0x25);
}
else
{
graphics.DrawImage(bType[3], 0x66, 0x25);
if ((data.type & 0x20000) != 0)
{
graphics.DrawImage(bType[4], 0x8f, 40);
}
else if ((data.type & 0x100000) != 0)
{
graphics.DrawImage(bType[5], 0x8f, 40);
}
}
}
ef = graphics.MeasureString(text.text, txtFont, 0x91);
num4 = 0x91;
while (ef.Height > (((float) (40 * num4)) / 145f))
{
num4 += 3;
ef = graphics.MeasureString(text.text, txtFont, num4);
}
graphics.TranslateTransform(16f, 195f);
graphics.ScaleTransform(145f / ((float) num4), 145f / ((float) num4));
graphics.DrawString(text.text, txtFont, textBrush, new RectangleF(0f, 0f, ef.Width, ef.Height));
graphics.ResetTransform();
}
try
{
Bitmap image = new Bitmap("./pico/" + code.ToString() + ".jpg");
if ((data.type & 0x1000000) > 0)
{
graphics.DrawImage(image, 0xF, 0x32, 0x93, 0x6d);
}
else if((data.type & 0x800000) == 0)
{
graphics.DrawImage(image, 0x19, 0x36, 0x80, 0x80);
}
else
{
graphics.DrawImage(image, 0x18, 0x33, 0x80, 0x80);
}
}
catch
{
}
string str3 = text.name.Replace('\x00b7', '・');
float width = graphics.MeasureString(str3, nameFont).Width;
float sx = 1f;
if (width > 125f)
{
sx *= 125f / width;
}
if ((data.type & 0x800000) > 0)
{
graphics.TranslateTransform(12f, 13f);
}
else if ((data.type & 0x1000000) > 0)
{
graphics.TranslateTransform(12f, 13f);
}
else
{
graphics.TranslateTransform(14f, 17f);
}
graphics.ScaleTransform(sx, 1f);
graphics.DrawString(str3, nameFont, nameBrush, (float) 0f, (float) 0f);
graphics.DrawString(str3, nameFont, Brushes.Gold, (float) 1f, (float) 1f);
graphics.ResetTransform();
cardImages.Add(code, bitmap);
}
return 0;
}
}
private static string tosbc(string r)
{
char[] chArray = r.ToCharArray();
for (int i = 0; i < chArray.Length; i++)
{
if ((chArray[i] > ' ') && (chArray[i] < '\x007f'))
{
chArray[i] = (char) (chArray[i] + 0xfee0);
}
if (chArray[i] == '\x00b7')
{
chArray[i] = '・';
}
}
string desc = new string(chArray);
desc = desc.Replace(Environment.NewLine, "\n");
desc = Regex.Replace(desc, @"(?<=。)([\n\s]+)(?=[①②③④⑤⑥⑦⑧⑨⑩●])", "");
return desc;
}
private static string GetDesc(string cdesc, string regx)
{
string desc = cdesc;
desc = desc.Replace(Environment.NewLine, "\n");
Regex regex = new Regex(regx, RegexOptions.Multiline);
Match mc = regex.Match(desc);
if (mc.Success)
return ((mc.Groups.Count > 1) ?
mc.Groups[1].Value : mc.Groups[0].Value);
//.Trim('\n').Replace("\n", "\n\t\t");
return "";
}
public static Bitmap Zoom(Bitmap sourceBitmap, int newWidth, int newHeight)
{
if (sourceBitmap != null)
{
Bitmap b = new Bitmap(newWidth, newHeight);
Graphics graphics = Graphics.FromImage(b);
//合成:高质量,低速度
graphics.CompositingQuality = CompositingQuality.HighQuality;
//去除锯齿
graphics.SmoothingMode = SmoothingMode.HighQuality;
//偏移:高质量,低速度
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
//插补算法
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
Rectangle newRect = new Rectangle(0, 0, newWidth, newHeight);
Rectangle srcRect = new Rectangle(0, 0, sourceBitmap.Width, sourceBitmap.Height);
graphics.DrawImage(sourceBitmap, newRect, srcRect, GraphicsUnit.Pixel);
graphics.Dispose();
return b;
}
return sourceBitmap;
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<ProjectGuid>{5230788D-FFF9-4B8A-99F5-91CDE7383369}</ProjectGuid>
<OutputType>Exe</OutputType>
<NoStandardLibraries>false</NoStandardLibraries>
<AssemblyName>ImgGen</AssemblyName>
<TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
<TargetFrameworkProfile>
</TargetFrameworkProfile>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
<PropertyGroup>
<RootNamespace>ImgGen</RootNamespace>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Data.SQLite">
<HintPath>.\System.Data.SQLite.dll</HintPath>
</Reference>
<Reference Include="System.Drawing" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Attribute.cs" />
<Compile Include="Data.cs" />
<Compile Include="DataManager.cs" />
<Compile Include="Location.cs" />
<Compile Include="Position.cs" />
<Compile Include="Program.cs" />
<Compile Include="Race.cs" />
<Compile Include="Text.cs" />
<Compile Include="Type.cs" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSHARP.Targets" />
<ProjectExtensions>
<VisualStudio AllowExistingFolder="true" />
</ProjectExtensions>
</Project>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
</Project>
\ No newline at end of file

Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ImgGen", "ImgGen.csproj", "{5230788D-FFF9-4B8A-99F5-91CDE7383369}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x86 = Debug|x86
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{5230788D-FFF9-4B8A-99F5-91CDE7383369}.Debug|x86.ActiveCfg = Debug|x86
{5230788D-FFF9-4B8A-99F5-91CDE7383369}.Debug|x86.Build.0 = Debug|x86
{5230788D-FFF9-4B8A-99F5-91CDE7383369}.Release|x86.ActiveCfg = Release|x86
{5230788D-FFF9-4B8A-99F5-91CDE7383369}.Release|x86.Build.0 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
namespace ImgGen
{
using System;
public enum Location : byte
{
LOCATION_DECK = 1,
LOCATION_EXTRA = 0x40,
LOCATION_GRAVE = 0x10,
LOCATION_HAND = 2,
LOCATION_MZONE = 4,
LOCATION_ONFIELD = 12,
LOCATION_OVERLAY = 0x80,
LOCATION_REMOVED = 0x20,
LOCATION_SZONE = 8
}
}
namespace ImgGen
{
using System;
public enum Position : byte
{
POS_ATTACK = 3,
POS_DEFENCE = 12,
POS_FACEDOWN = 10,
POS_FACEDOWN_ATTACK = 2,
POS_FACEDOWN_DEFENCE = 8,
POS_FACEUP = 5,
POS_FACEUP_ATTACK = 1,
POS_FACEUP_DEFENCE = 4
}
}
namespace ImgGen
{
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
internal class Program
{
private static ImageCodecInfo GetEncoderInfo(string mimeType)
{
ImageCodecInfo[] imageEncoders = ImageCodecInfo.GetImageEncoders();
for (int i = 0; i < imageEncoders.Length; i++)
{
if (imageEncoders[i].MimeType == mimeType)
{
return imageEncoders[i];
}
}
return null;
}
private static void Main(string[] args)
{
DataManager.InitialDatas();
Encoder quality = Encoder.Quality;
ImageCodecInfo encoderInfo = GetEncoderInfo("image/jpeg");
EncoderParameters encoderParams = new EncoderParameters(1);
EncoderParameter parameter = new EncoderParameter(quality, 0x5fL);
encoderParams.Param[0] = parameter;
string[] files = Directory.GetFiles("./pico");
Directory.CreateDirectory("./picn/thumbnail");
foreach (string str in files)
{
int code = int.Parse(Path.GetFileNameWithoutExtension(str));
string fileName = Path.GetFileName(str);
Console.WriteLine("Generating {0}", fileName);
Bitmap image = DataManager.GetImage(code);
image.Save("./picn/" + fileName, encoderInfo, encoderParams);
DataManager.Zoom(image, 44, 64).Save("./picn/thumbnail/" + fileName, encoderInfo, encoderParams);
/*
Bitmap thumbnail = new Bitmap(44, 64);
Graphics graph = Graphics.FromImage(thumbnail);
graph.DrawImage(image, 0, 0, 44, 64);
thumbnail.Save("./picn/thumbnail/" + fileName, encoderInfo, encoderParams);
thumbnail.Dispose();
*/
/*
Bitmap thumbnail = new Bitmap(image, 44, 64);
thumbnail.Save("./picn/thumbnail/" + fileName, encoderInfo, encoderParams);
thumbnail.Dispose();
*/
image.Dispose();
}
}
}
}
namespace ImgGen
{
using System;
public enum Race
{
RACE_AQUA = 0x40,
RACE_BEAST = 0x4000,
RACE_BEASTWARRIOR = 0x8000,
RACE_DEVINE = 0x200000,
RACE_DINOSAUR = 0x10000,
RACE_DRAGON = 0x2000,
RACE_FAIRY = 4,
RACE_FIEND = 8,
RACE_FISH = 0x20000,
RACE_INSECT = 0x800,
RACE_MACHINE = 0x20,
RACE_PLANT = 0x400,
RACE_PSYCHO = 0x100000,
RACE_PYRO = 0x80,
RACE_REPTILE = 0x80000,
RACE_ROCK = 0x100,
RACE_SEASERPENT = 0x40000,
RACE_SPELLCASTER = 2,
RACE_THUNDER = 0x1000,
RACE_WARRIOR = 1,
RACE_WINDBEAST = 0x200,
RACE_ZOMBIE = 0x10,
RACE_WYRM = 0x800000
}
}
namespace ImgGen
{
using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential)]
public struct Text
{
public string name;
public string text;
public string[] desc;
}
}
namespace ImgGen
{
using System;
public enum Type
{
TYPE_CONTINUOUS = 0x20000,
TYPE_COUNTER = 0x100000,
TYPE_DUAL = 0x800,
TYPE_EFFECT = 0x20,
TYPE_EQUIP = 0x40000,
TYPE_XYZ = 0x800000,
TYPE_FIELD = 0x80000,
TYPE_FLIP = 0x200000,
TYPE_FUSION = 0x40,
TYPE_MONSTER = 1,
TYPE_NORMAL = 0x10,
TYPE_QUICKPLAY = 0x10000,
TYPE_RITUAL = 0x80,
TYPE_SPELL = 2,
TYPE_SPIRIT = 0x200,
TYPE_SYNCRO = 0x2000,
TYPE_TOKEN = 0x4000,
TYPE_TOON = 0x400000,
TYPE_TRAP = 4,
TYPE_TRAPMONSTER = 0x100,
TYPE_TUNER = 0x1000,
TYPE_UNION = 0x400,
TYPE_PENDULUM = 0x1000000
}
}
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup><supportedRuntime version="v2.0.50727"/></startup></configuration>
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup><supportedRuntime version="v2.0.50727"/></startup></configuration>
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup><supportedRuntime version="v2.0.50727"/></startup></configuration>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<requestedExecutionLevel level="asInvoker" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup><supportedRuntime version="v2.0.50727"/></startup></configuration>
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup><supportedRuntime version="v2.0.50727"/></startup></configuration>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<requestedExecutionLevel level="asInvoker" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
脚本中用到的数据类型为以下几类:
integer: 整数类型
boolean: 布尔类型(true 或者 false)
string: 字符串
function: 函数
Card: 卡片类
Effect: 效果类
Group: 卡片组类
any: 任意类型
为方便说明,采用类似c的函数表示方法说明
[]表示有默认值可省略的参数
注:关于过滤条件函数
过滤条件函数是指第一个参数是Card类型,并且返回值是boolean的函数。此函数用于在一些获取满足条件的卡片组的过滤函数中重复调用。过滤条件函数可以有不定的参数,第二个开始的参数从过滤函数的额外参数获得。举例:
function sample_filter(c, atk, def)
return c:GetAttack()>=atk and c:GetDefence()>=def
end
此函数对于一张卡c,如果攻击力>=atk并且守备力>=def则返回true,否则返回false
g=Duel.GetFieldGroup(0,LOCATION_HAND,0) --获取玩家1的手卡
fg=g:Filter(sample_filter, nil, 1000,500) --从g中筛选攻击力>=1000并且守备>=500的卡
Group.Filter只需要3个参数,第4个参数开始为额外参数,额外的参数会传给sample_filter
========== bit ==========
●integer bit.band(integer a, integer b)
a与b的位与
●integer bit.bor(integer a, integer b)
a与b的位或
●integer bit.bxor(integer a, integer b)
a与b的位异或
●integer bit.bls(integer a, integer b)
a左移b
●integer bit.brs(integer a, integer b)
a右移b
========== Card ==========
●integer Card.GetCode(Card c)
返回c的当前代号(可能因为效果改变)
●integer Card.GetOriginalCode(Card c)
返回c的卡片记载的代号
●boolean Card.IsSetCard(Card c, integer setname)
检查c是否是名字含有setname的卡
●integer Card.GetType(Card c)
返回c的当前类型。
●integer Card.GetOriginalType(Card c)
返回c的卡片记载的类型。
●integer Card.GetLevel(Card c)
返回c的当前等级
●integer Card.GetSynchroLevel(Card c)
返回c的同调用等级。此函数除了某些特定卡如调节支援士,返回值与Card.GetLevel(c)相同
●integer Card.GetRitualLevel(Card c)
返回c的仪式解放等级。此函数除了某些特定卡如仪式供物,返回值与Card.GetLevel(c)相同
●integer Card.GetOriginalLevel(Card c)
返回c的卡片记载的等级
●integer Card.GetAttribute(Card c)
返回c的当前属性。注:对某些多属性怪物如光与暗之龙,此函数的返回值可能是几个属性的组合值。
●integer Card.GetOriginalAttribute(Card c)
返回c的卡片记载的属性
●integer Card.GetRace(Card c)
返回c的当前种族。注:对某些多种族怪物如动画效果的魔术猿,此函数的返回值可能是几个种族的组合值。
●integer Card.GetOriginalRace(Card c)
返回c的卡片记载的种族
●integer Card.GetAttack(Card c)
返回c的当前攻击力,返回值是负数表示是"?"
●integer Card.GetBaseAttack(Card c)
返回c的原本攻击力
●integer Card.GetTextAttack(Card c)
返回c的卡片记载的攻击力
●integer Card.GetDefence(Card c)
返回c的当前守备力,返回值是负数表示是"?"
●integer Card.GetBaseDefence(Card c)
返回c的原本守备力
●integer Card.GetTextDefence(Card c)
返回c的卡片记载的守备力
●integer Card.GetOwner(Card c)
返回c的持有者
●integer Card.GetControler(Card c)
返回c的当前控制者
●integer Card.GetPreviousControler(Card c)
返回c的位置变化之前的控制者
●integer Card.GetReason(Card c)
返回c的位置变化原因
●Card Card.GetReasonCard(Card c)
返回导致c的位置变化的卡。此函数仅在某卡被战斗破坏时,因为上级召唤被解放,或者成为特殊召唤使用的素材时有效。
●Effect Card.GetReasonEffect(Card c)
返回导致c的位置变化的效果。
●integer Card.GetPosition(Card c)
返回c当前的表示形式
●integer Card.GetPreviousPosition(Card c)
返回c位置变化前的表示形式
●integer Card.GetBattlePosition(Card c)
返回c在本次战斗发生之前的表示形式
●integer Card.GetLocation(Card c)
返回c当前的所在位置
●integer Card.GetPreviousLocation(Card c)
返回c位置变化前的所在的位置
●integer Card.GetSequence(Card c)
返回c在当前位置的序号
在场上时,序号代表所在的格子,从左往右分别是0-4,场地魔法格的序号为5
在其它地方时,序号表示的是第几张卡。最底下的卡的序号为0
●integer Card.GetPreviousSequence(Card c)
返回c位置变化前的序号
●integer Card.GetSummonType(Card c)
返回c上场的方式。
●integer Card.GetSummonPlayer(Card c)
返回召唤,特殊召唤c上场的玩家
●integer Card.GetDestination(Card c)
返回c位置变化的目的地。此函数仅在处理位置转移代替效果时有效。
●integer Card.GetTurnID(Card c)
返回c转移到当前位置的回合
●integer Card.GetFieldID(Card c)
返回c转移到当前位置的时间标识。此数值唯一,越小表示c是越早出现在那个位置。
●boolean Card.IsCode(Card c, integer code)
检查c的代号是否是code。
●boolean Card.IsType(Card c, integer type)
检查c是否属于类型type。
●boolean Card.IsRace(Card c, integer race)
检查c是否属于种族race。
●boolean Card.IsAttribute(Card c, integer attribute)
检查c是否属于属性attribute。
●boolean Card.IsReason(Card c, integer reason)
检查c是否包含原因reason。
●boolean Card.IsStatus(Card c, integer status)
检查c是否包含某个状态码。
●boolean Card.IsNotTuner(Card c)
检查c是否可以当成非调整来使用。
●void Card.SetStatus(Card c, integer state, boolean enable)
给c设置或者取消状态码。除非妳清楚的了解每个状态码的含意,否则不要轻易使用此函数。
●boolean Card.IsDualState(Card c)
检查c属否处于再召唤状态。
●void Card.EnableDualState(Card c)
把c设置成再召唤状态。
●void Card.SetTurnCounter(Card c, integer counter)
设置c的回合计数器(光之护封剑等)
●integer Card.GetTurnCounter(Card c)
返回c的回合计数器
●void Card.SetCustomValue(Card c, string tag, any object)
以tag作为标签为c设置一个自定义值object
●any Card.GetCustomValue(Card c, string tag)
返回c的以tag作为标签的自定义值
●void Card.SetMaterial(Card c, Group g)
把g中的所有卡作为c的素材(上级召唤,特殊召唤)
●Group Card.GetMaterial(Card c)
返回c出场使用的素材
●integer Card.GetMaterialCount(Card c)
返回c出场使用的素材数量
●Group Card.GetEquipGroup(Card c)
返回c当前装备着的卡片组
●integer Card.GetEquipCount(Card c)
返回c当前装备着的卡片数量
●Card Card.GetEquipTarget(Card c)
返回c当前的装备对象
●boolean Card.CheckEquipTarget(Card c1, Card c2)
检查c2是否是c1的正确的装备对象
●integer Card.GetUnionCount(Card c)
返回c当前装备的同盟卡数量
●Group Card.GetOverlayGroup(Card c)
返回c当前叠放着的卡片组
●integer Card.GetOverlayCount(Card c)
返回c当前叠放着的卡片数量
●integer Card.RemoveOverlayCard(Card c,integer player, integer min, integer max, integer reason)
以reason为原因,让玩家player移除c叠放的min-max张卡
●Group Card.GetAttackGroup(Card c)
返回c本回合攻击过的卡片组
●integer Card.GetAttackedGroupCount(Card c)
返回c本回合攻击过的卡片数量
●integer Card.GetAttackedCount(Card c)
返回c本回合攻击过的次数
注:如果此值与上一个函数的返回值不同,那么说明此卡本回合进行过直接攻击
●Group Card.GetBattledGroup(Card c)
返回与c本回合进行过战斗的卡片组
进行过战斗指发生过伤害的计算。用于剑斗兽等卡的判定。
●integer Card.GetBattledGroupCount(Card c)
返回与c本回合进行过战斗的的卡片数量
●integer Card.GetAttackAnnouncedCount(Card c)
返回c本回合攻击宣言的次数
注:攻击被无效不会被计入攻击过的次数,但是会计入攻击宣言的次数。
●void Card.SetCardTarget(Card c1, Card c2)
把c2作为c1的永续对象。
c1和c2的联系会在c1活c2任意一卡离场或变成里侧表示时reset。
●Group Card.GetCardTarget(Card c)
返回c当前所有的永续对象
●integer Card.GetCardTargetCount(Card c)
返回c当前的永续对象的数量
●boolean Card.IsHasCardTarget(Card c1, Card c2)
检查c1是否取c2为永续对象
●Group Card.GetOwnerTarget(Card c)
返回取c作为永续对象的所有卡
●integer Card.GetOwnerTargetCount(Card c)
返回取c作为永续对象的卡的数量
●Effect Card.GetActivateEffect(Card c)
返回c的“卡片发动”的效果。仅对魔法和陷阱有效。
●integer Card.RegisterEffect(Card c, Effect e, [boolean forced=false])
把效果e注册给c,返回效果的全局id。
默认情况下注册时如果c带有免疫e的效果那么注册会失败。如果forced为true则不会检查c对e的免疫效果。
●boolean Card.IsHasEffect(Card c, integer code)
检查c是否受到效果种类是code的效果的影响
●integer Card.GetEffectCount(Card c, integer code)
返回c受到影响的种类是code的效果的数量
●Effect Card.RegisterFlagEffect(Card c, integer code, integer reset_flag, integer property, integer reset_count)
为c注册一个标识用效果。
注:注册给卡的标识用效果不会用于系统,即使code与内置效果code重合也不会影响,并且类型总是EFFECT_TYPE_SINGLE。reset方法,property和一般的效果相同,并且不会无效化,不受卡的免疫效果影响。
●integer Card.GetFlagEffect(Card c, integer code)
返回c的种类是code的标识效果的数量。
●void Card.ResetFlagEffect(Card c, integer code)
手动清除c的种类是code的标识效果。
●void Card.CreateRelation(Card c1, Card c2, integer reset_flag)
为c1建立于c2的联系。此联系仅会由于RESET_EVENT的事件reset。
●void Card.ReleaseRelation(Card c1, Card c2)
手动释放c1对于c2的联系
●boolean Card.IsRelateToEffect(Card c, Effect e)
检查c是否和效果e有联系。
注:每次发动进入连锁的效果时,发动效果的卡,以及发动效果时指定的对象(用Duel.SetTargetCard或者Duel.SelectTarget指定的,包括取对象和不取对象)会自动与那个效果建立联系。一旦离场,联系会重置。
●boolean Card.IsRelateToCard(Card c1, Card c2)
检查c1是否和c2有联系。
●boolean Card.IsRelateToBattle(Card c)
检查c是否和本次战斗关联。
注:此效果通常用于伤害计算后伤害阶段结束前,用于检查战斗的卡是否离场过。
●integer Card.CopyEffect(Card c, integer code, integer reset_flag, integer reset_count)
为c添加代号是code的卡的可复制的效果,并且添加额外的reset条件。
返回值是表示复制效果的代号id。
●void Card.EnableReviveLimit(Card c)
为c添加苏生限制。此函数也可通过Card.SetStatus实现。
●void Card.CompleteProcedure(Card c)
使c完成正规的召唤手续。此函数也可通过Card.SetStatus实现。
●boolean Card.IsDisabled(Card c)
检查c是否处于无效状态
●boolean Card.IsDestructable(Card c)
检查c是否是可破坏的。
注:不可破坏指的是类似场地护罩,宫廷的规矩等“破壊できない”的效果
●boolean Card.IsSummonableCard(Card c)
检查c是否是可通常召唤的卡。
●boolean Card.IsSpecialSummonable(Card c)
检查是否可以对c进行特殊召唤手续。
●boolean Card.IsSynchroSummonable(Card c, [Card tuner=nil])
检查是否可以以tuner作为调整对c进行同调召唤手续。如果tuner是nil,此函数与上一个函数作用相同。
●boolean Card.IsSummonable(Card c)
检查c是否可进行通常召唤(不包含通常召唤的set)
●boolean Card.IsMSetable(Card c)
检查c是否可进行通常召唤的set
●boolean Card.IsSSetable(Card c)
检查c是否可以set到魔法陷阱区
●boolean Card.IsCanBeSpecialSummoned(Card c, Effect e, integer sumtype, integer sumplayer, boolean nocheck, boolean nolimit, [integer sumpos=POS_FACEUP, integer target_player=sumplayer])
检查c是否可以被玩家sumplayer用效果e以sumtype方式和sumpos表示形式特殊召唤到target_player场上。如果nocheck是true则不检查c的召唤条件,如果nolimit是true则不检查c的苏生限制。
●boolean Card.IsAbleToHand(Card c)
检查c是否可以送去手牌。
注:仅当卡片或者玩家受到“不能加入手牌”的效果的影响时(如雷王)此函数才返回false。以下几个函数类似。
●boolean Card.IsAbleToDeck(Card c)
检查c是否可以送去卡组。
●boolean Card.IsAbleToExtra(Card c)
检查c是否可以送去额外卡组。
对于非融合,同调,超量卡此函数均返回false。
●boolean Card.IsAbleToGrave(Card c)
检查c是否可以送去墓地。
●boolean Card.IsAbleToRemove(Card c)
检查c是否可以除外。
●boolean Card.IsAbleToHandAsCost(Card c)
检查c是否可以作为cost送去手牌。
注:此函数会在Card.IsAbleToHand的基础上追加检测c的实际目的地。当c送往手牌会被送去其它地方时(如缩退回路适用中,或者c是融合,同调和超量怪的一种),此函数返回false。以下几个函数类似。
●boolean Card.IsAbleToDeckAsCost(Card c)
检查c是否可以作为cost送去卡组。
●boolean Card.IsAbleToExtraAsCost(Card c)
检查c是否可以作为cost送去额外卡组。
●boolean Card.IsAbleToGraveAsCost(Card c)
检查c是否可以作为cost送去墓地。
●boolean Card.IsAbleToRemoveAsCost(Card c)
检查c是否可以作为cost除外。
●boolean Card.IsReleaseable(Card c)
检查c是否可以解放(非上级召唤用)
●boolean Card.IsDiscardable(Card c)
检查c是否可以丢弃
注:此函数仅用于检测,以REASON_DISCARD作为原因把一张手卡送墓并不会导致那张卡不能丢弃。
●boolean Card.IsAttackable(Card c)
检查c是否可以攻击
●boolean Card.IsChainAttackable(Card c)
检查c是否可以连续攻击
注:当c因为闪光之双剑等效果进行过多次攻击之后此函数返回false。
●boolean Card.IsFaceup(Card c)
检查c是否是表侧表示
●boolean Card.IsFacedown(Card c)
检查c是否是里侧测表示
●boolean Card.IsAttack(Card c)
检查c是否是攻击表示
●boolean Card.IsDefence(Card c)
检查c是否是守备表示
●boolean Card.IsControler(Card c, integer con)
检查c的当前控制着是否是con
●boolean Card.IsOnField(Card c)
检查c是否在场。
注:当怪物召唤,反转召唤,特殊召唤时召唤成功之前,此函数返回false
●boolean Card.IsLocation(Card c, integer loc)
检查c当前位置是否是loc。
注:当怪物召唤,反转召唤,特殊召唤时召唤成功之前,并且loc=LOCATION_MZONE时,此函数返回false
●boolean Card.IsPublic(Card c)
检查c是否处于公开状态
●boolean Card.IsForbidden(Card c)
检查c是否处于被宣言禁止状态
●boolean Card.IsAbleToChangeControler(Card c)
检查c是否可以改变控制权
注:仅当卡收到了“不能改变控制权”的效果的影响时,此函数返回false
●boolean Card.IsControlerCanBeChanged(Card c)
检查c的控制权是否可以改变
注:此函数会在上一个函数的基础上追加检测场上的空格位
●void Card.AddCounter(Card c, integer countertype, integer count)
为c放置count个countertype类型的指示物
●void Card.RemoveCounter(Card c, integer player, integer countertype, integer count, integer reason)
让玩家player以原因reason移除c上的count个countertype类型的指示物
●integer Card.GetCounter(Card c, integer countertype)
返回c上的countertype类型的指示物的数量
●void Card.EnableCounterPermit(Card c, integer countertype)
允许c放置那个需要“可以放置”才能放置的指示物countertype
●void Card.SetCounterLimit(Card c, integer countertype, integer count)
设定c放置countertype类型指示物的上限
●boolean Card.IsCanTurnSet(Card c)
检查c是否可以转成里侧表示。
●boolean Card.IsCanAddCounter(Card c, integer countertype, integer count)
检查c是否可以放置count个countertype类型的指示物
●boolean Card.IsCanRemoveCounter(Card c, integer player, integer countertype, integer count, integer reason)
检查玩家player是否可以以原因reason移除c上的count个countertype类型的指示物
●boolean Card.IsCanBeFusionMaterial(Card c)
检查c是否可以成为融合素材
●boolean Card.IsCanBeSynchroMaterial(Card c)
检查c是否可以成为同调素材
●boolean Card.IsCanBeExceedMaterial(Card c)
检查c是否可以成为超量素材
●boolean Card.CheckFusionMaterial(Card c, Group g)
检查g是否包含了c需要的一组融合素材
●boolean Card.IsImmuneToEffect(Card c, Effect e)
检查c是否免疫效果e(即不受效果e的影响)
●boolean Card.IsCanBeEffectTarget(Card c, Effect e)
检查c是否可以成为效果e的对象
●boolean Card.IsCanBeBattleTarget(Card c1, Card c2)
检查c1是否可以成为c2的攻击目标
●void Card.AddTrapMonsterAttribute(Card c, boolean is_effect)
为c添加陷阱怪物属性。is_effect=true表示视作效果怪物,否则视为通常怪物
注:陷阱怪物属性指的是同时作为怪物和陷阱,并且额外使一个魔法陷阱的格子不能使用。
●void Card.CancelToGrave(Card c)
取消送墓确定状态。
注:送墓确定状态指的是在场上发动的不留场的魔法和陷阱后,这些卡片的状态。送墓确定状态中的卡无法返回手牌和卡组,并且连锁结束时送去墓地。此函数的作用是取消此状态使其留场。用于光之护封剑和废铁稻草人等卡。
●integer,integer Card.GetTributeRequirement(Card c)
返回通常召唤c所需要的祭品的最小和最大数量
========== Effect ==========
●Effect Effect.CreateEffect(Card c)
新建一个空效果,并且效果的拥有者为c
●Effect Effect.Clone(Effect e)
新建一个效果e的副本
●void Effect.Reset(Effect e)
把效果e重置。重置之后不可以再使用此效果
●void Effect.SetDescription(Effect e, integer desc)
为效果e设置效果描述
●void Effect.SetCode(Effect e, integer code)
为效果e设置Code属性
●void Effect.SetRange(Effect e, integer range)
为效果e设置Range属性
●void Effect.SetTargetRange(Effect e, integer s_range, integer o_range)
为效果e设置Target Range属性
s_range指影响的我方区域。o_range值影响的对方区域。
如果property属性中指定了EFFECT_FLAG_ABSOLUTE_RANGE标志,那么s_range指玩家1收到影响的区域,o_range指玩家2受到影响的区域。
如果这是一个特殊召唤手续(EFFECT_SPSUMMON_PROC)的效果,并且property指定了EFFECT_FLAG_SPSUM_PARAM标志,那么s_range表示特殊召唤到的哪个玩家的场地,o_range表示可选择的表示形式。
●void Effect.SetAbsoluteRange(Effect e, integer s_range, integer o_range)
设置target range属性并设置EFFECT_FLAG_ABSOLUTE_RANGE标志
●void Effect.SetCountLimit(Effect e, integer count)
设置一回合可以发动的次数(仅触发型效果有效)
●void Effect.SetReset(Effect e, integer reset_flag, [integer reset_count=1])
设置reset参数
●void Effect.SetReset(Effect e, integer type)
设置Type属性
●void Effect.SetProperty(Effect e, integer prop)
设置Property属性
●void Effect.SetLabel(Effect e, integer label)
设置Label属性
●void Effect.SetCategory(Effect e, integer cate)
设置Category属性
●void Effect.SetCategory(Effect e, integer cate)
设置Category属性
●void Effect.SetCondition(Effect e, function con_func)
设置Condition属性
●void Effect.SetCost(Effect e, function cost_func)
设置Cost属性
●void Effect.SetTarget(Effect e, function targ_func)
设置Target属性
●void Effect.SetOperation(Effect e, function op_func)
设置Operation属性
●void Effect.SetValue(Effect e, integer|function val)
设置Value属性
●void Effect.SetOwnerPlayer(Effect e, integer player)
设置Owner player属性
●integer Effect.GetDescription(Effect e)
返回效果描述
●integer Effect.GetCode(Effect e)
返回code属性
●integer Effect.GetType(Effect e)
返回Type属性
●integer Effect.GetProperty(Effect e)
返回Property属性
●integer Effect.GetLabel(Effect e)
返回Label属性
●integer Effect.GetCategory(Effect e)
返回Category属性
●Card Effect.GetOwner(Effect e)
返回效果拥有者
●Card Effect.GetHandler(Effect e)
返回效果在哪一张卡上生效(通常是注册该效果的卡)
●function Effect.GetCondition(Effect e)
返回condition属性
●function Effect.GetCost(Effect e)
返回cost属性
●function Effect.GetTarget(Effect e)
返回target属性
●function Effect.GetOperation(Effect e)
返回operation属性
●function|integer Effect.GetValue(Effect e)
返回value属性
●boolean Effect.IsHasProperty(Effect e, integer prop)
检查效果是否含有标志prop
●boolean Effect.IsHasCategory(Effect e, integer cate)
检查效果是否含有效果分类cate
●boolean Effect.IsHasType(Effect e, integer type)
检查效果是否属于类型type
========== group ==========
●Group Group.CreateGroup()
新建一个空的卡片组
●void Group.CreateGroup(Group g)
删除卡片组g
●Group Group.Clone(Group g)
新建卡片组g的副本
●Group Group.FromCards(Card c, ...)
不定参数,把传入的所有卡组合成一个卡片组并返回
●void Group.Clear(Group g)
清空卡片组
●void Group.AddCard(Group g, Card c)
往g中增加c
●void Group.RemoveCard(Group g, Card c)
把c从g中移除
●Card Group.GetFirst(Group g)
返回g中第一张卡,并重置当前指针到g中第一张卡。如果g中不存在卡则返回nil
●Card Group.GetNext(Group g)
返回并使指针指向下一张卡。如果g中不存在卡则返回nil
●integer Group.GetCount(Group g)
返回g中卡的数量
●void Group.ForEach(Group g, function f)
以g中的每一张卡作为参数调用一次f
●Group Group.Filter(Group g, function f, Card ex, ...)
过滤函数。从g中筛选满足筛选条件f并且不等于ex的卡。从第4个参数开始为额外参数。
●integer Group.FilterCount(Group g, function f, Card ex, ...)
过滤函数。和上一个函数基本相同。不同指出在于此函数只返回满足条件的卡的数量。
●Group Group.FilterSelect(Group g, integer player, function f,integer min, integer max, Card ex, ...)
过滤函数。让玩家player从g中选择min-max张满足筛选条件f并且不等于ex的卡。从第7个参数开始为额外参数。
●Group Group.Select(Group g, integer player, integer min, integer max, Card ex)
让玩家player从g中选择min-max张不等于ex的卡。
●Group Group.RandomSelect(Group g, integer player, integer count)
让玩家player从g中随机选择count张卡。因为是随机算则,所以参数player基本无用,由系统随机选取。
●boolean Group.IsExists(Group g, function f, integer count, Card ex, ...)
过滤函数。检查g中是否存在至少count张满足筛选条件f并且不等于ex的卡。从第5个参数开始为额外参数。
●boolean Group.CheckWithSumEqual(Group g, function f, integer sum, integer min)
子集求和判定函数。f为返回一个interger值的函数(通常用于同调判定)。检查g中是否存在一个数量至少为min的子集满足以f对子集的每一个元素求值的和等于sum。
比如:g:CheckWithSumEqual(Card.GetSynchroLevel,7,2)检查g中是否存在一个子集满足子集的同调用等级之和等于7
●Group Group.SelectWithSumEqual(Group g, integer player, function f, integer sum, integer min)
让玩家player从g中选取一个数量至少是min的子集使子集的特定函数的和等于sum
●boolean Group.CheckWithSumGreater(Group g, function f, integer sum)
子集求和判定函数之二。f为返回一个interger值的函数(通常用于仪式判定)。检查g中是否存在一个子集满足以f对子集的每一个元素求值的和刚好大于或者等于sum。
比如:g:CheckWithSumGreater(Card.GetRitualLevel,8)检查g中是否存在一个子集满足子集的仪式用等级之和大于等于8
注:判定必须是“刚好”大于或者等于。以等级为例,要使等级合计大于等于8,可以选择LV1+LV7而不可以选择LV1+LV4+LV4
●Group Group.SelectWithSumGreater(Group g, integer player, function f, integer sum)
让玩家player从g中选取一个子集使子集的特定函数的和大于等于sum
●Group Group.GetMinGroup(Group g, function f)
f为返回一个interger值的函数。从g中筛选出具有最小的f的值的卡。用于地裂等卡。
●Group Group.GetMaxGroup(Group g, function f)
f为返回一个interger值的函数。从g中筛选出具有最大的f的值的卡。用于地碎等卡。
●integer Group.GetSum(Group g, function f)
计算g中所有卡的取值的总和。f为为每张卡的取值函数。
●integer Group.GetSortCount(Group g, function f)
计算g中所有卡的种类数量。f为分类的依据,返回相同的值视为同一种类。
●Group Group.Remove(Group g, function f, ...)
过滤函数。从g中移除满足筛选条件f的所有卡。第三个参数开始是额外参数。
●Group Group.Merge(Group g1, Group g2)
把g2中的所有卡合并到g1。
注:g2本身不会发生变化。
●boolean Group.IsContains(Group g, Card c)
检查g中是否存在卡片c
●Card Group.SearchCard(Group g, function f, ...)
过滤函数。返回g中满足筛选条件f的第一张卡。第三个参数为额外参数。
========== Duel ==========
●integer Duel.GetLP(integer player)
返回玩家player的当前LP
●void Duel.SetLP(integer player, integer lp)
设置玩家player的当前LP为lp
●integer Duel.GetTurnPlayer()
返回当前的回合玩家
●integer Duel.GetTurnCount()
返回当前的回合数
●integer Duel.GetDrawCount(integer player)
返回玩家player每回合的规则抽卡数量
●void Duel.DebugMessage(any msg)
Debug用函数,用于显示信息
●void Duel.RegisterEffect(Effect e, integer player)
把效果作为玩家player的效果注册给全局环境。
●Effect Duel.RegisterFlagEffect(integer player, integer code, integer reset_flag, integer property, integer reset_count)
此函数为玩家player注册全局环境下的标识效果。此效果总是影响玩家的(EFFECT_FLAG_PLAYER_TARGET)并且不会被无效化。其余部分与Card.RegisterFlagEffect相同
●integer Duel.GetFlagEffect(integer player, integer code)
返回玩家player的特定的标识效果的数量
●void Duel.ResetFlagEffect(integer player, integer code)
手动reset玩家player的特定的标识效果
●integer Duel.Destroy(Card|Group targets, integer reason)
以reason原因破坏targets。返回值是实际被破坏的数量。
如果reason包含REASON_RULE,则破坏事件将不会检查卡片是否免疫效果,不会触发代破效果并且无视“不能破坏”。
●integer Duel.Remove(Card|Group targets, integer pos, integer reason)
以reason原因,pos表示形式除外targets。返回值是实际被操作的数量。
如果reason包含REASON_TEMPORARY,那么视为是暂时除外,可以通过Duel.ReturnToField返回到场上
●integer Duel.SendtoGrave(Card|Group targets, integer reason)
以reason原因把targets送去墓地。返回值是实际被操作的数量。
●integer Duel.SendtoHand(Card|Group targets, integer player | nil, integer reason)
以reason原因把targets送去玩家player的手牌。返回值是实际被操作的数量。
如果player是nil则返回卡的持有者的手牌。
●integer Duel.SendtoDeck(Card|Group targets, integer player | nil, integer seq, integer reason)
以reason原因把targets送去玩家player的卡组。返回值是实际被操作的数量。
如果player是nil则返回卡的持有者的卡组。
如果seq=0,则是返回卡组最顶端;seq=1则是返回卡组最低端;其余情况则是返回最顶端并且标记需要洗卡组。
●Group Duel.GetOperatedGroup()
此函数返回之前一次卡片操作实际操作的卡片组。包括Duel.Destroy, Duel.Remove, Duel.SendtoGrave, Duel.SendtoHand, Duel.SendtoDeck, Duel.Release, Duel.ChangePosition, Duel.SpecialSummon
●void Duel.Summon(integer player, Card c, boolean ignore_count, Effect e)
让玩家以效果e对c进行通常召唤(非set)。如果e=nil,那么就按照一般的通常召唤规则进行通常召唤。如果ignore_count=true,则忽略每回合的通常召唤次数限制。
●void Duel.SpecialSummonRule(integer player, Card c)
让玩家player对c进行特殊召唤手续。
●void Duel.SynchroSummon(integer player, Card c, Card tuner)
让玩家player以tuner作为调整对c进行特殊召唤手续。
●void Duel.MSet(integer player, Card c, boolean ignore_count, Effect e)
让玩家以效果e对c进行通常召唤的Set。如果e=nil,那么就按照一般的通常召唤规则进行通常召唤。如果ignore_count=true,则忽略每回合的通常召唤次数限制。
●void Duel.SSet(integer player, Card c)
让玩家player把c放置到魔法陷阱区
●Card Duel.CreateToken(integer player, integer code, integer setcode, integer attack, integer defence, integer level, integer race, integer attribute)
以传入的参数数值新建一个Token
●integer Duel.SpecialSummon(Card|Group targets, integer sumtype, integer sumplayer, integer target_player, boolean nocheck, boolean nolimit, integer pos)
让玩家player以sumtype方式,pos表示形式把targets特殊召唤到target_player场上。如果nocheck为true则无视卡的召唤条件。如果nolimit为true则无视卡的苏生限制。返回值是特殊召唤成功的卡的数量。
●boolean Duel.SpecialSummonStep(Card c, integer sumtype, integer sumplayer, integer target_player, boolean nocheck, boolean nolimit, integer pos)
此函数是上一个函数的分解过程,只特殊召唤一张卡c。此函数用于一个效果需要双方同时特殊召唤时。此函数必须和下面的函数一起使用。返回值表示是否特殊召唤成功。
●integer Duel.SpecialSummonComplete()
此函数在确定复数个上一个函数调用完毕之后调用。用于触发事件。
●void Duel.RemoveCounter(integer player, integer s, integer o, integer countertype, integer count, integer reason)
让玩家player移除场上存在的countertype类型的count个指示物。s表示对player来说的己方的可移除指示物的位置,o表示对player来说的对方的可移除指示物的位置
●boolean Duel.IsCanRemoveCounter(integer player, integer s, integer o, integer countertype, integer count, integer reason)
检查玩家player是否能移除场上的countertype类型的count个指示物。s和o参数作用同上。
●integer Duel.GetCounter(integer player, integer s, integer o, integer countertype)
返回场上存在的countertype类型的指示物的数量。s和o参数作用同上。
●integer Duel.ChangePosition(Card|Group targets,integer au, [integer ad=au, integer du=au, integer dd=au, boolean noflip=false])
改变targets的表示形式。表侧攻击表示的变成au,里侧攻击表示的变成ad, 表侧守备表示变成du,里侧守备表示变成dd
如果noflip=true则不触发翻转效果(但会触发翻转时的诱发效果)
●integer Duel.Release(Card|Group targets, integer reason)
以reason原因解放targets。返回值是实际解放的数量。
如果reason含有REASON_COST,则不会检查卡片是否不受效果影响
●void Duel.MoveToField(Card c, integer move_player, integer target_player,integer dest, integer pos, boolean enabled)
让玩家move_player把c移动的target_player的场上。dest只能是LOCATION_MZONE或者LOCATION_SZONE。pos表示可选表示形式。enable表示是否立刻适用c的效果。
●void Duel.ReturnToField(Card c)
把c返回到场上。c必须是以REASON_TEMPORARY原因离场,并且离场后没有离开过那个位置。
●void Duel.MoveSequence(Card c, integer seq)
移动c的序号。通常用于在场上换格子或者在卡组中移动到最上方或者最下方。
●void Duel.SetChainLimit(function f)
设定连锁条件。f是接受一个Effect类型作为参数并且返回boolean值的函数。在cost或者target处理中调用此函数可以限制可以连锁的效果的种类(如超融合)。如果f返回false表示不能连锁。一旦设置连锁条件后发生了新的连锁那么连锁条件将会解除。
●void Duel.SetChainLimitTillChainEnd(function f)
功能同上,但是此函数设定的连锁条件直到连锁结束才会解除。
●Effect Duel.GetChainMaterial(integer player)
返回玩家player受到的连锁素材的效果。此函数仅用于融合类卡的效果。
●void Duel.ConfirmDeckTop(integer player, integer count)
确认玩家player卡组最上方的count张卡。双方均可确认。
●void Duel.ConfirmCards(integer player, Card|Group targets)
给玩家player确认targets
●void Duel.SortDecktop(integer sort_player, integer target_player, integer count)
让玩家sort_player对玩家target_player的卡组最上方count张卡进行排序
●boolean Duel.CheckEvent(integer event)
检查当前是否是event时点
●void Duel.RaiseEvent(Group eg,integer code, Effect reason_effect, integer reason, integer reason_player,integer event_player, integer event param)
触发一个事件。
●void Duel.RaiseSingleEvent(Card ec,integer code, Effect reason_effect, integer reason, integer reason_player,integer event_player, integer event param)
触发一个单体事件。
●integer, integer Duel.GetEnvironment()
返回两个值,表示当前场地代号,以及当前场地效果的来源玩家。场地代号指当前生效的场地卡的代号,或者海神的巫女把场地变化效果的值。来源玩家指当前生效的场地卡的控制者,或者海神的巫女等卡的控制者。
●void Duel.Win(function f, Effect e, integer player)
在当前效果处理完之后调用f进行胜负检测。e和player作为f的两个参数传递给f。f返回值的低16位表示胜负判定玩家,0表示玩家1胜利,1表示玩家2胜利,2表示平局,此外是无胜负兵继续进行。高16位表示胜负的原因。
●integer Duel.Draw(integer player, integer count, integer reason)
让玩家player以原因reason抽count张卡。返回实际抽的卡的数量。
如果reason含有REASON_RULE则此次抽卡不受“不能抽卡”的效果的影响。
●integer Duel.Damage(integer player, integer value, integer reason)
以reason原因给与玩家player造成value的伤害。返回实际收到的伤害值。如果受到伤害变成回复等效果的影响时,返回值为0.
●integer Duel.Recover(integer player, integer value, integer reason)
以reason原因使玩家player回复value的LP。返回实际的回复值。如果受到回复变成伤害等效果的影响时,返回值为0.
●boolean Duel.Equip(integer player, Card c1, Card c2)
把c1作为玩家player的装备卡装备给c2。返回值表示是否成功。
●boolean Duel.GetControler(integer player, Card c)
让玩家player得到c的控制权。返回值表示是否成功。
●boolean Duel.SwapControler(Card c1, Card c2)
交换c1和c2的控制权。返回值表示是否成功。
●boolean Duel.CheckLPCost(integer player, integer cost)
检查玩家player是否能支付cost点lp
●void Duel.PayLPCost(integer player, integer cost)
让玩家player支付cost点lp
●integer Duel.DiscardDeck(integer player, integer count, integer reason)
以原因reason把玩家player的卡组最上端count张卡送去墓地.返回实际转移的数量。
●integer Duel.DiscardHand(integer player, function f, integer min, integer max, integer reason, Card ex, ...)
过滤函数。让玩家player选择并丢弃满足筛选条件f兵不等于ex的min-max张手卡。第7个参数开始为额外参数。
●void Duel.DisableShuffleCheck()
使下一个操作不检查是否需要洗卡组或者洗手卡。
注:如果不调用此函数,除了调用Duel.DiscardDeck和Duel.Draw之外从卡组中取出卡或者把卡加入手卡或者把卡加入卡组(非最上端或最底端)时,系统会自动在效果处理结束时洗卡组或手卡。如果不希望如此,比如从卡组顶端除外一张卡等操作,那么需要调用此函数。此函数仅保证紧接着的一次操作不会进行洗卡检测。
●void Duel.ShuffleDeck(integer player)
手动洗玩家player的卡组
●void Duel.ShuffleHand(integer player)
手动洗玩家player的手卡
注:以上两个操作会重置洗卡检测的状态。
●void Duel.ChaingeAttacker(Card c)
把当前的攻击卡替换成c进行攻击
●void Duel.ReplaceAttacker(Card c)
用c代替当前攻击的卡进行伤害阶段
●void Duel.ChaingeAttackTarget(Card c)
把当前的攻击目标替换成c。如果c=nil则变成直接攻击。
●void Duel.ReplaceAttackTarget(Card c)
(预留)
●integer Duel.GetBattleDamage(integer player)
返回玩家player在本次战斗中收到的伤害
●void Duel.ChangeBattleDamage(integer player, integer value)
把玩家player在本次战斗中收到的伤害变成value
●void Duel.ChangeTarget(integer chainc, Group g)
把连锁chainc的对象换成g
●void Duel.ChangeTargetPlayer(integer chainc, integer player)
把连锁chainc的对象玩家换成player
●void Duel.ChangeTargetParam(integer chainc, integer param)
把连锁chainc的对象参数换成param
●void Duel.BreakEffect()
中断当前效果,使之后的效果处理视为不同时处理。此函数会造成错时点。
●void Duel.ChangeChainOperation(integer chainc, function f)
把连锁chainc的效果的处理函数换成f。用于实现“把效果变成”等的效果
●void Duel.NegateActivation(integer chainc)
使连锁chainc的发动无效
●void Duel.NegateEffect(integer chainc)
使连锁chainc的效果无效
●void Duel.NegateSummon(Card c)
使正在召唤,反转召唤,特殊召唤的c的召唤无效
●void Duel.IncreaseSummonCount()
本回合的通常召唤限制计数+1
●boolean Duel.CheckSummonCount()
检查回合玩家本回合的通常召唤限制计数。
●integer Duel.GetLocationCount(integer player, integer location)
返回玩家player的指定场地location剩余的空格数。location只能是LOCATION_MZONE或者LOCATION_SZONE。
●Card Duel.GetFieldCard(integer controler, integer location, integer sequence)
返回指定玩家指定地点指定序号的卡
●integer Duel.GetCurrentChain()
返回当前正在处理的连锁序号
●... Duel.GetChainInfo(integer chainc, ...)
返回连锁chainc的信息。如果chainc=0,则返回当前正在处理的连锁的信息。
此函数根据传入的参数个数按顺序返回相应数量的返回值。参数可以是:
CHAININFO_CHAIN_COUNT 连锁序号
CHAININFO_TRIGGERING_EFFECT 连锁的效果
CHAININFO_TRIGGERING_PLAYER 连锁的玩家
CHAININFO_TRIGGERING_CONTROLER 连锁发生位置所属玩家
CHAININFO_TRIGGERING_LOCATION 连锁发生位置
CHAININFO_TRIGGERING_SEQUENCE 连锁发生的位置的序号
CHAININFO_TARGET_CARDS 连锁的对象卡片组
CHAININFO_TARGET_PLAYER 连锁的对象玩家
CHAININFO_TARGET_PARAM 连锁的对象参数
CHAININFO_DISABLE_REASON 连锁被无效的原因效果
CHAININFO_DISABLE_PLAYER 连锁被无效的原因玩家
CHAININFO_CHAIN_ID 连锁的唯一标识
举例:Duel.GetChainInfo(0,CHAININFO_TRIGGERING_LOCATION,CHAININFO_TARGET_CARDS)将会返回当前连锁发生的位置和对象卡。
●integer Duel.GetCurrentPhase()
返回当前的阶段
●void Duel.SkipPhase(integer player, integer phase, integer reset_flag, integer reset_count)
跳过玩家player的phase阶段,并在特定的阶段后reset。reset参数和效果相同。
●boolean Duel.IsDamageCalculated()
用于在伤害阶段检查是否已经计算了战斗伤害。
●Card Duel.GetAttacker()
返回此次战斗攻击的卡
●Card Duel.GetAttackTarget()
返回此次战斗被攻击的卡。如果返回nil表示是直接攻击。
●void Duel.DisableAttack()
使本次攻击无效
●void Duel.ChainAttack()
使攻击卡再进行一次连续攻击(开辟,破灭的女王)
●void Duel.Readjust()
刷新场上的卡的信息。非特定情况或者不清楚原理请勿使用此函数以免形成死循环。
●Group Duel.GetFieldGroup(integer player, integer s, integer o)
返回指定位置的卡。s指对玩家player来说的己方的位置,o指对玩家player来说的对方的位置。下面提到的指定位置均为此意。
比如Duel.GetFieldGroup(0,LOCATION_GRAVE,LOCATION_MZONE)返回玩家1墓地和玩家2的怪兽区的所有卡
●integer Duel.GetFieldGroupCount(integer player, integer s, integer o)
同上,返回值变成卡的数量
●Group Duel.GetDecktopGroup(integer player, integer count)
返回玩家player的卡组最上方的count张卡
●Group Duel.GetMatchingGroup(function f, integer player, integer s, integer o, Card ex, ...)
过滤函数,返回指定位置满足过滤条件f并且不等于ex的卡。第6个参数开始为额外参数。
●integer Duel.GetMatchingGroupCount(function f, integer player, integer s, integer o, Card ex, ...)
同上,返回值变成符合的卡的数量。
●Card Duel.GetFirstMatchingCard(function f, integer player, integer s, integer o, Card ex, ...)
过滤函数,返回指定位置满足过滤条件f并且不等于ex的第一张卡。第6个参数开始为额外参数。
●boolean Duel.IsExistingMatchingCard(function f, integer player, integer s, integer o, integer count, Card ex, ...)
过滤函数,检查指定位置是否存在至少count张满足过滤条件f并且不等于ex的卡。第7个参数开始为额外参数。
●Group Duel.SelectMatchingCard(integer sel_player, function f, integer player, integer s, integer o, integer min, integer max, Card ex, ...)
过滤函数,让玩家sel_player选择指定位置满足过滤条件f并且不等于ex的min-max张卡。第9个参数开始为额外参数。
●Group Duel.GetReleaseGroup(integer player)
返回玩家player可解放(非上级召唤用)的卡片组
●integer Duel.GetReleaseGroupCount(integer player)
返回玩家player可解放(非上级召唤用)的卡片数量
●boolean Duel.ChecktReleaseGroup(integer player, function f, integer count, Card ex, ...)
过滤函数,检查玩家player是否存在至少count张不等于ex的满足条件f的可解放的卡
●Group Duel.SelectReleaseGroup(integer player, function f, integer min, integer max, Card ex, ...)
过滤函数,让玩家player选择min-max张不等于ex的满足条件f的可解放的卡并返回
●Group Duel.GetTributeGroup(Card c)
返回用于通常召唤c可解放(上级召唤用)的卡片组
●integer Duel.GetTributeCount(Card c)
返回用于通常召唤c的祭品数量。此数量不一定等于上一个函数的返回值中的卡片数量。因为某些卡可以作为两个祭品来使用。
●Group Duel.SelectTribute(integer player, Card c, integer min, integer max)
让玩家player选择用于通常召唤c的min-max个祭品。
●integer Duel.GetTargetCount(function f, integer player, integer s, integer o, Card ex, ...)
基本同Duel.GetMatchingGroupCount,不同之处在于需要追加判定卡片是否能成为当前正在处理的效果的对象。
●boolean Duel.IsExistingTarget(function f, integer player, integer s, integer o, integer count, Card ex, ...)
过滤函数,检查指定位置是否存在至少count张满足过滤条件f并且不等于ex并且可以成为当前正在处理的效果的对象的卡。第7个参数开始为额外参数。
●Group Duel.SelectTarget(integer sel_player, function f, integer player, integer s, integer o, integer min, integer max, Card ex, ...)
过滤函数,让玩家sel_player选择指定位置满足过滤条件f并且不等于ex并且可以成为当前正在处理的效果的对象的min-max张卡。第9个参数开始为额外参数。此函数会同时酱当前正在处理的连锁的对象设置成选择的卡
●Group Duel.SelectFusionMaterial(integer player, Card c, Group g)
让玩家player从g中选择一组满足c的融合素材的卡
●void Duel.SetFusionMaterial(Group g)
设置g为需要使用的融合素材
●void Duel.SetSynchroMaterial(Group g)
设置g为需要使用的同调素材
●Group Duel.SelectSynchroMaterial(integer player, Card c, function f1, function f2, integer min)
让玩家选择用于同调c需要的满足条件的数量至少是min的一组素材。
f1是调整需要满足的过滤条件。f2是调整以外的部分需要满足的过滤条件。
●boolean Duel.CheckSynchroMaterial(Card c, function f1, function f2, integer min)
检查是否存在一组满足条件的卡作为同调召唤c的素材。f1,f2,min同上。
●Group Duel.SelectTunerMaterial(integer player, Card c, Card tuner, function f1, function f2, integer min)
让玩家选择用于同调c需要的满足条件的以tuner作为调整的数量至少是min的一组素材。
f1是调整需要满足的过滤条件。f2是调整以外的部分需要满足的过滤条件。
●boolean Duel.CheckTunerMaterial(Card c, Card tuner, function f1, function f2, integer min)
检查以tuner作为调整是否存在一组满足条件的卡作为同调召唤c的素材。f1,f2,min同上。
●Group Duel.GetRitualMaterial(integer player)
返回玩家player可用的用于仪式召唤素材的卡片组。包含手上,场上可解放的以及墓地的仪式魔人等卡。
●void Duel.ReleaseRitualMaterial(Group g)
解放仪式用的素材g。如果是墓地的仪式魔人等卡则除外。
●void Duel.SetTargetCard(Group g)
把当前正在处理的连锁的对象设置成g。
注,这里的对象指的的广义的对象,包括不取对象的效果可能要处理的对象。
●void Duel.SetTargetPlayer(integer player)
把当前正在处理的连锁的对象玩家设置成player。
●void Duel.SetTargetParam(integer param)
把当前正在处理的连锁的对象参数设置成param。
●void Duel.SetOperationInfo(integer chainc, integer category, Card|Group targets, integer count, integer target_player, integer target_param)
设置当前处理的连锁的操作信息。此操作信息包含了效果处理中确定要处理的效果分类。比如潜行狙击手需要设置CATEGORY_DICE,但是不能设置CATEGORY_DESTROY,因为不确定。对于破坏效果,targets需要设置成发动时可能成为连锁的影响对象的卡,并设置count为发动时确定的要处理的卡的数量。比如黑洞发动时,targets需要设定为场上的所有怪物,count设置成场上的怪的数量。对于CATEGORY_SPECIAL_SUMMON,CATEGORY_TOHAND,CATEGORY_TODECK等分类,如果取对象则设置targets为对象,count为对象的数量;如果不取对象则设置targets为nil,count为预计要处理的卡的数量,并设置target_param为预计要处理的卡的位置。例如增援:SetOperationInfo(0,CATEGORY_TOHAND,nil,1,0,LOCATION_DECK)。操作信息用于很多效果的发动的检测,例如星尘龙,王家沉眠之谷等。
●... Duel.GetOperationInfo(integer chainc, integer category)
返回连锁chainc的category分类的操作信息。返回值为5个,第一个返回值是false的话表示不存在该分类。后4个返回值对应上一个函数的后4个参数。
●integer Duel.GetOperationCount(integer chainc)
返回连锁chainc包含的操作分类的数量
●Group Duel.GetExceedMaterial(Card c)
返回c的超量素材
●void Duel.Overlay(Card c, Card|Group ocard)
把ocard作为c的叠放卡叠放
●Group Duel.GetOverlayGroup(integer player, integer s, integer o)
返回指定位置的所有叠放的卡
●Integer Duel.GetOverlayCount(integer player, integer s, integer o)
返回指定位置的所有叠放的卡的数量
●void Duel.RemoveOverlayCard(integer player, integer s, integer o, integer min, integer max, integer reason)
以reason原因移除指定位置的min-max张叠放卡
●void Duel.Hint(integer player, integer desc)
给玩家发送内置消息提示
●boolean Duel.SelectEffectYesNo(integer player, integer code)
让玩家选择是否发动卡的效果
●boolean Duel.SelectYesNo(integer player, integer desc)
让玩家选择是或否
●integer Duel.SelectOption(integer player, ...)
让玩家选择选项。从第二个参数开始,每一个参数代表一条选项。
返回选择的选项的序号。
●integer Duel.SelectDisableField(integer player, integer count, integer s, integer o, integer filter)
让玩家player选择指定位置的count个位置不能使用。
●integer Duel.AnnounceRace(integer player, integer count, integer available)
让玩家player从可选的种族中宣言count个种族。available是所有可选种族的组合值。
●integer Duel.AnnounceAttribute(integer player, integer count, integer available)
让玩家player从可选的属性中宣言count个属性。available是所有可选属性的组合值。
●integer Duel.AnnounceCard(integer player)
让玩家player宣言一个卡片代号。
●integer Duel.AnnounceType(integer player)
让玩家player宣言一个卡片类型。
●integer Duel.AnnounceNumber(integer player, ...)
让玩家player宣言一个数字。从第二个参数开始,每一个参数代表一个可宣言的数字。
返回选择的选项的序号。
●integer Duel.AnnounceCoin(integer player)
让玩家player宣言硬币的正反面。
●... Duel.TossCoin(integer player, integer count)
让玩家player投count次硬币。返回值为count个结果。结果是0或者1.
●... Duel.TossDice(integer player, integer count)
让玩家player投count次骰子。返回值为count个结果。结果是1-6.
●void Duel.SetCoinResult( ... )
强行修改投硬币的结果。此函数用于永续的EVENT_TOSS_COIN事件中
●void Duel.SetDiceResult( ... )
强行修改投骰子的结果。此函数用于永续的EVENT_TOSS_DICE事件中
●boolean Duel.IsPlayerAffectByEffect(integer player, integer code)
检查玩家player是否受特性效果的影响
●boolean Duel.IsPlayerCanDraw(integer player)
检查玩家player是否可以效果抽卡
●boolean Duel.IsPlayerCanDiscardDeck(integer player)
检查玩家player是否可以把卡组顶端的卡送去墓地
●boolean Duel.IsPlayerCanDiscardDeckAdCost(integer player, int count)
检查玩家player是否可以把卡组顶端的卡送去墓地作为cost。当卡组没有足够数量的卡,或者当卡组中的卡受到送墓转移效果的影响时(如大宇宙,次元裂缝,即使不是全部)此函数会返回false
●boolean Duel.IsPlayerCanSummon(integer player, integer sumtype, Card c)
检查玩家player是否可以以sumtype方式通常召唤c。仅当玩家收到“不能上级召唤”等效果的影响时返回false。
●boolean Duel.IsPlayerCanFlipSummon(integer player, Card c)
检查玩家player是否可以反转召唤c。
●boolean Duel.IsPlayerCanSpecialSummonMonster(integer player, integet code, integer setcode, integer attack, integer defence integer level, integer race, integer attribute, [integer pos=POS_FACEUP, integer target_player=player])
检查玩家player是否可以以pos的表示形式特殊召唤特定属性值的怪物到target_player场上。此函数通常用于判定是否可以特招token和陷阱怪物。
●boolean Duel.IsPlayerCanRelease(integer player, Card c)
检查玩家是否能解放c
●boolean Duel.IsPlayerCanRemove(integer player, Card c)
检查玩家是否能除外c
●boolean Duel.IsPlayerCanSendtoHand(integer player, Card c)
检查玩家是否能把c送去手牌
●boolean Duel.IsPlayerCanSendtoGrave(integer player, Card c)
检查玩家是否能把c送去墓地
●boolean Duel.IsPlayerCanSendtoDeck(integer player, Card c)
检查玩家是否能把c送去卡组
●boolean Duel.IsChainInactivatable(integer chainc)
检查连锁chainc的发动是否可以被无效化
●boolean Duel.IsChainDisablable(integer chainc)
检查连锁chainc的效果是否可以被无效化
●boolean Duel.CheckChainTarget(integer chainc, Card c)
检查c是否是连锁chainc的正确的对象
●boolean Duel.CheckChainUniqueness()
检查当前连锁中是否存在同名卡的发动。true表示无同名卡。
●boolean Duel.SwapDeckAndGrave(integer player)
现世与冥界的逆转专用。把玩家player的卡组和墓地交换
●boolean Duel.CheckSummonActivity(integer player)
检查玩家player本回合有没有进行过召唤的行为。召唤被无效视作进行过召唤行为。
●boolean Duel.CheckNormalSummonActivity(integer player)
检查玩家player本回合有没有进行过通常召唤的行为。包括召唤和set
●boolean Duel.CheckFlipSummonActivity(integer player)
检查玩家player本回合有没有进行过反转召唤的行为。
●boolean Duel.CheckFlipSummonActivity(integer player)
检查玩家player本回合有没有进行过特殊召唤的行为。
特殊召唤的行为包括:进行了入连锁和不入连锁的特殊召唤;发动了确定要特殊召唤的效果但是效果被无效
不包括:发动了确定要特殊召唤的效果但是发动被无效
●boolean Duel.CheckAttackActivity(integer player)
检查玩家player本回合有没有进行过攻击。
\ No newline at end of file

一 编写脚本的前提条件:
1 了解了lua的相关知识(至少要知道语法,语句,基本的运算,Table和Metatable)
2 熟悉游戏王的规则,包含常见的和各种不常见的规则
3 一个文本编辑器。
二 关于脚本系统的简要架构说明
脚本系统中包含4个主函数库,Card,Effect,Group和Duel,这几个函数库包含了脚本中需要的所有的基本功能。另外还有一个简单的位操作库bit和辅助函数库Auxiliary,包含了一些辅助用的函数。具体的函数清参考函数手册。
脚本系统包含3种自定义类型(Userdata),包括Card,Effect,Group。这几个类型分别以相应的函数库作为Metatable来实现模拟的OOP功能。Effect和Group直接以上述的同名函数库作为Metatable,Card则多了一个中间的模板Metatable。
对于Card类型,系统每载入一张卡,首先会根据那张卡的唯一代号(8位密码)创建一个模板Table('c'+8位密码),然后调用那张卡的脚本文件(即那些.lua文件)一次初始化模板。然后会生成一个Card的Userdata作为新卡的变量,并设置这个模板Table作为变量的Metatable。最后会将这个变量作为参数调用模板Table的initial_effect函数来对这张卡经行初始化工作。卡的静态效果都是在initial_effect函数中注册。对于通常怪物,此函数通常是一个空函数,不写这个函数也没问题,但是会报告一个“函数未找到”的错误。
对于Effect类型,此类型包含了卡的效果的信息,具体后面会详细介绍此类型的设置和说明。
Group类型即是卡片组,顾名思义就是存多张卡片使用的。此类型通常用于对多张卡片同时进行操作。Group库中提供了一些函数进行添加,删除,搜索特定的卡片。要注意的是:1、Group中卡片的排列顺序随机(但操作时会进行排序以满足replay的需要) 2、一个Group中同一张卡只能存在一次
三 脚本中的一些常量说明
--Locations
LOCATION_DECK 卡组
LOCATION_HAND 手牌
LOCATION_MZONE 怪兽区域
LOCATION_SZONE 魔陷区域
LOCATION_GRAVE 墓地
LOCATION_REMOVED 除外区
LOCATION_EXTRA 额外
LOCATION_OVERLAY 叠放卡
--Positions
POS_FACEUP_ATTACK 表侧攻击
POS_FACEDOWN_ATTACK 里侧攻击
POS_FACEUP_DEFENCE 表侧守备
POS_FACEDOWN_DEFENCE 里侧守备
POS_FACEUP 表侧
POS_FACEDOWN 里侧
POS_ATTACK 攻击
POS_DEFENCE 守备
--Phase
PHASE_DRAW 抽卡阶段
PHASE_STANDBY 准备阶段
PHASE_MAIN1 主要阶段1
PHASE_BATTLE 战斗阶段
PHASE_DAMAGE 伤害阶段
PHASE_DAMAGE_CAL 伤害计算时
PHASE_MAIN2 主要阶段2
PHASE_END 结束阶段
--Player
PLAYER_NONE 无玩家
PLAYER_ALL 双方
玩家的标识: 0=玩家1, 1=玩家2
四 Effect(效果)详解?
Effect是实现各种效果的中心部分。在此系统中,根据一个效果是否有操作动作(比如破坏,伤害等),卡的效果主要被分成两种,一种是永续型,另一种是触发型。永续型一般是表示状态变化的效果,触发型一般是需要有动作或者需要执行特定的函数才能实现的效果。当然也有特例,具体参考效果说明文档。
Effect可以通过两个函数来创建
●Effect.CreateEffect() 此函数将会建议一个新的空效果
●Effect.Clone(e) 此函数将会创建一个已存在的效果e的副本
当然,Effect不注册是不能生效的。Effect可以通过以下两个函数注册给卡片或者全局环境
●Card.RegisterEffect(c,e) 将效果e注册给卡片c
●Duel.RegisterEffect(e,player) 将效果e作为玩家player的效果注册给全局环境
Effect主要包含了以下需要设置的值:
description,code,type,category,range,target range,count limit,reset,property,label,
condition,target,cost,operation,value,owner player
这些属性基本都可以通过相关的Set和Get函数来设置和获取。具体参考Effect库的函数说明。
两种类型通用的属性:
●Description: 效果描述,大部分效果可不用,从多个效果中选择一个发动时才会用到这一属性
●Code: 此属性表示效果的种类。效果列表清查阅效果手册。
●Category: 效果分类。仅用于那些进入连锁的效果,用于标识该效果包含了那些分类。需要注意的是,只要包含了某个效果,即使效果处理时不会处理那个效果,也要把那个效果的分类加入此属性。举例:大宇宙和星光大道,这两张卡“包含”了特殊召唤的效果,即使不一定特殊召唤。此属性用于某些卡的发动的判定(如弹压)。
此属性可以是以下值的组合:
CATEGORY_DESTROY 破坏效果
CATEGORY_RELEASE 解放效果
CATEGORY_REMOVE 除外效果
CATEGORY_TOHAND 送去手牌效果
CATEGORY_TODECK 送去卡组效果
CATEGORY_TOGRAVE 送去墓地效果
CATEGORY_DECKDES 卡组破坏效果
CATEGORY_HANDES 手牌破坏效果
CATEGORY_SUMMON 召唤效果
CATEGORY_SPECIAL_SUMMON 特殊召唤效果
CATEGORY_TOKEN 生成Token效果
CATEGORY_FLIP 反转效果
CATEGORY_POSITION 改变表示形式效果
CATEGORY_CONTROL 改变控制权效果
CATEGORY_DISABLE 无效效果的效果
CATEGORY_DISABLE_SUMMON 无效召唤,特殊召唤的效果
CATEGORY_DRAW 抽卡效果
CATEGORY_SEARCH 检索效果(一般是卡组)
CATEGORY_EQUIP 装备效果
CATEGORY_DAMAGE 直接伤害效果
CATEGORY_RECOVER 回复效果
CATEGORY_ATKCHANGE 攻击变化效果
CATEGORY_DEFCHANGE 守备变化效果
CATEGORY_COUNTER 指示物相关效果
CATEGORY_COIN 需要扔硬币的效果
CATEGORY_DICE 需要扔骰子的效果
●Type: 此属性用于表示效果的分类,可以是下面的值的组合。组合方法见下面的分类解释。
EFFECT_TYPE_SINGLE 单体
EFFECT_TYPE_FIELD 群体
EFFECT_TYPE_EQUIP 装备
EFFECT_TYPE_ACTIONS 触发型
EFFECT_TYPE_ACTIVATE 发动
EFFECT_TYPE_FLIP 反转
EFFECT_TYPE_IGNITION 启动
EFFECT_TYPE_TRIGGER_O 诱发(选发)
EFFECT_TYPE_QUICK_O 诱发即使(选发)
EFFECT_TYPE_TRIGGER_F 诱发(必发)
EFFECT_TYPE_QUICK_F 诱发即时(必发)
EFFECT_TYPE_CONTINUOUS 永续
●Reset: 此属性用于标识效果被Reset的时机。此属性可以是以下值的组合:
RESET_DRAW 抽卡阶段
RESET_STANDBY 准备阶段
RESET_MAIN1 主要阶段1
RESET_BATTLE 战斗阶段
RESET_DAMAGE 伤害阶段
RESET_DAMAGE_CAL 伤害计算阶段
RESET_MAIN2 主要阶段2
RESET_END 结束阶段
RESET_SELF_TURN 我方回合
RESET_OPPO_TURN 对方回合
RESET_PHASE 阶段结束时Reset,此flag需要配合以上值一起使用
RESET_LABEL 根据标签Reset
RESET_EVENT 根据事件Reset,此flag需要配合从RESET_DISABLE开始的标志一起使用
RESET_USE 效果计数变成0之后Reset
RESET_CODE 根据效果种类Reset
RESET_COPY 复制效果Reset
RESET_DISABLE 进入无效化状态时Reset
RESET_TURN_SET 变成里侧表示时Reset
RESET_TOGRAVE 送去墓地时Reset
RESET_REMOVE 除外(永久)时Reset
RESET_TEMP_REMOVE 除外(暂时)时Reset
RESET_TOHAND 送去手牌时Reset
RESET_TODECK 送去卡组时Reset
RESET_LEAVE 离场时Reset
RESET_TOFIELD 上场时Reset
RESET_CONTROL 控制权转移时Reset
脚本中一般只需要使用RESET_PHASE和RESET_EVENT以及相关的值
●Property: 此属性包含了此效果的一些额外的信息,可以是以下值的组合:
EFFECT_FLAG_FUNC_VALUE 此效果的Value属性是函数
EFFECT_FLAG_COUNT_LIMIT 此效果有内置的次数限制
EFFECT_FLAG_FIELD_ONLY 此效果是注册给全局环境的
//以上3个属性为系统内置,无法在脚本中进行设置
EFFECT_FLAG_CARD_TARGET 此效果取对象
EFFECT_FLAG_IGNORE_RANGE 忽略Target Range属性,
EFFECT_FLAG_ABSOLUTE_TARGET Target Range不会因为控制权的改变而改变
EFFECT_FLAG_IGNORE_IMMUNE 忽略免疫属性
EFFECT_FLAG_SET_AVAILABLE 影响里侧表示的卡
EFFECT_FLAG_AUXILIARY (预留)
EFFECT_FLAG_CANNOT_DISABLE 不能无效化的效果
EFFECT_FLAG_PLAYER_TARGET 以玩家为对象
EFFECT_FLAG_BOTH_SIDE 双方都可以发动
EFFECT_FLAG_COPY_INHERIT 继承复制的效果的Reset属性
EFFECT_FLAG_DAMAGE_STEP 伤害阶段可以发动
EFFECT_FLAG_DAMAGE_CAL 伤害计算时可以发动
EFFECT_FLAG_DELAY 延迟处理
EFFECT_FLAG_SINGLE_RANGE 单体效果
EFFECT_FLAG_UNCOPYABLE 不可被黑豹,混沌幻影等卡复制
EFFECT_FLAG_OATH 契约效果
EFFECT_FLAG_SPSUM_PARAM 特殊召唤参数
一些特定的标志的使用见分类解释。
●Label: 此属性不会被系统使用,通常用于脚本传递或者保存简单的整数参数使用
●owner player: 此属性表示这个效果属于那个玩家。一般注册效果时,此属性会被自动设置成当前正在发动效果的那个玩家。当然也可以手动设置此值。
以下根据两种不同的类型解释需要设置的值
1 永续型
永续型效果主要表现状态的变化,首先Type属性只能是EFFECT_TYPE_SINGLE,EFFECT_TYPE_FIELD以及EFFECT_TYPE_EQUIP中的一个。其中EFFECT_TYPE_SINGLE表示效果只影响注册的卡本身,EFFECT_TYPE_FIELD表示效果影响某个区域的卡,EFFECT_TYPE_EQUIP表示效果影响注册的卡装备着的卡。
●对于EFFECT_TYPE_FIELD效果需要设置Range和Target Range属性。其中Range表示注册的卡在什么地方生效,Target Range表示影响那个区域的卡。举例:
local e=Effect.CreateEffect(c)
e:SetType(EFFECT_TYPE_FIELD)
e:SetRange(LOCATION_SZONE) 此效果在魔陷区生效
e:SetTargetRange(LOCATION_MZONE,LOCATION_MZONE) 此效果影响双方的怪兽区域
c:RegisterEffect(e)
如果Range属性被设置成怪兽区域或者魔陷区,那么那张卡必须是表侧表示这个效果才能生效。
一些额外的property说明
EFFECT_FLAG_IGNORE_RANGE: 当设置了这个标志时,target range属性将会被忽略,此时所有区域的卡收回收到影响
EFFECT_FLAG_PLAYER_TARGET: 设置了这个标志时 这个效果被视为影响玩家,此时需要通过类似以下的方式设定影响的范围
e:SetTargetRange(0,1) 只影响对方玩家
EFFECT_FLAG_PLAYER_TARGET: 设置了这个标志时,这个效果影响的区域不会随着卡的控制权的改变而改变。例子可参考“仪式魔人解放者”的不能特殊召唤的效果。
EFFECT_FLAG_SET_AVAILABLE: 此效果影响场上里侧的卡。默认情况下不会影响。比如“场地防护罩”的“不能破坏”的效果。
●对于EFFECT_TYPE_SINGLE效果,一般情况下不需要设定Range和Target range。此时次效果被视为是暂时性的状态改变。如果设置了EFFECT_FLAG_SINGLE_RANGE属性,那么需要同时设置Range属性来注明这个单体效果在何处生效。使用了EFFECT_FLAG_SINGLE_RANGE标志的single效果视为永续型的效果。
●EFFECT_TYPE_EQUIP无特定的Property标志
Condition表示这个效果生效的条件。如果不设置表示永久生效。此属性需要一个函数作为判定生效的依据。函数原型如下:
function sample_condition(e)
end
其中参数e是那个效果本身
Target表示这个效果影响的卡的具体要求。可视为是详细的过滤函数。如果不设置则表示影响区域的所有卡均适用。single和equip类型不需要设置此项。此属性同样需要需要一个函数作为判断卡是否受影响的依据。原型如下:
function sample_condition(e,c)
end
其中参数e是效果本身,c是需要判断的卡
Value用于设置效果的值,一般只用于数值变化效果和其他一些特定的效果。此属性可以直接填数值,也可以是一个函数,原型同target,用函数可以针对不同的卡设置不同的值。
2 触发型
触发型效果需要为Type设置EFFECT_TYPE_ACTIONS以下中的任意一个类型,并且设置的时候系统会自动为Type属性添加EFFECT_TYPE_ACTIONS标志。除此之外,对于EFFECT_TYPE_TRIGGER_O,EFFECT_TYPE_TRIGGER_F和EFFECT_TYPE_CONTINUOUS需要额外添加EFFECT_TYPE_SINGLE或者EFFECT_TYPE_FIELD。触发型的code一般指的是触发的事件,比如EVENT_DESTROY表示破坏时触发这一效果。某些类型不需要设定code。
●EFFECT_TYPE_ACTIVATE: 卡片的发动都应使用设个类型。非魔法或者陷阱卡添加此效果没有任何作用。此类型不需要设定Range,code则是发动时点,如果是无发动时点的卡则将code设置成EVENT_FREE_CHAIN。
●EFFECT_TYPE_FLIP: 反转效果,不需要设置code
●EFFECT_TYPE_IGNITION: 启动效果。此效果需要设置Range为发动启动效果所在的位置。比如亚特兰蒂斯的战士是手牌
,成长的鳞茎是墓地。不需要设置code。
●EFFECT_TYPE_TRIGGER_O和EFFECT_TYPE_TRIGGER_F: 诱发效果。前者表示选发,后者表示必发。诱发效果需要额外指明是single还是field类型,表示是卡本身的触发事件还是其它卡的触发事件。简单来说single类型表示“当这张卡XXX时”的效果,field类型是“当有卡XXXX时”的效果。举例:三眼怪的效果是“当这张卡从场上送去墓地时”的效果,所以是EFFECT_TYPE_TRIGGER_F+EFFECT_TYPE_SINGLE;王虎的效果是“当有卡特殊召唤时”的效果,所以是EFFECT_TYPE_TRIGGER_F+EFFECT_TYOE_FIELD。另外的区别是single类型不需要设置Range,而field类型需要设置成发动诱发效果的位置。
关于错时点的一些解释:EFFECT_TYPE_TRIGGER_F不会错时点,在当前连锁处理完之后会新开连锁;EFFECT_TYPE_TRIGGER_O一般来说如果之后进行了会中断的操作比如处理新连锁,召唤上场等行为就会错过时点。在Property的标志EFFECT_FLAG_DELAY可以让这个选发的诱发效果效果延迟发动而不会错时点,用来实现“XXXX的场合”“可以”发动的效果。加上此标志之后选发的效果也会等到当前的行为处理完之后新开连锁处理。
●EFFECT_TYPE_QUICK_O: 绝大部分的诱发即时效果,设置和EFFECT_TYPE_ACTIVATE基本相同,唯一的不同点在于这个类型需要设置Range指明发动的位置,比如死灵守卫需要指定为墓地。
●EFFECT_TYPE_QUICK_F: 只有极少数卡有此类型的效果(死灵骑士,光与暗之龙,青冰白夜龙等)。此效果会强制针对最后一个触发此效果的事件进行连锁。使用此类型的效果时要注意发动条件的判定避免形成无限连锁(比如光暗龙的自连锁,每次连锁中只能发动一次的原因)。
●EFFECT_TYPE_CONTINUOUS: 和EFFECT_TYPE_TRIGGER_F基本相同,不同点在于此类型的效果会在触发事件后立刻处理并且不会进入连锁。常用来实现一些辅助效果。
触发型效果常会用到的一些Property值:
EFFECT_FLAG_CARD_TARGET 此效果取对象,表示此效果取对象
EFFECT_FLAG_PLAYER_TARGET 以玩家为对象,通常用于抽卡效果。拥有这个标志的效果可以被精灵之镜连锁。
EFFECT_FLAG_BOTH_SIDE 双方都可以发动的效果。比如融合之门,王宫的弹压。
EFFECT_FLAG_DAMAGE_STEP 伤害阶段可以发动
EFFECT_FLAG_DAMAGE_CAL 伤害计算时可以发动
EFFECT_FLAG_DELAY 延迟处理
触发型效果的具体实现主要依赖于4个属性:Condition,Cost,Target和Operation。这4项必须是函数,或者留空。其中Condition用于发动条件判定,Cost用于发动cost的满足性判定和具体进行cost行为,Target用于发动对象判定(主要是判定是否满足对象的条件和空发判定)以及具体的指定对象等操作,Operation则是在效果处理时会执行的具体的效果操作。
函数原型分别为:
function sample_condition(e,tp,eg,ep,ev,re,r,rp) end
function sample_cost(e,tp,eg,ep,ev,re,r,rp,chk) end
function sample_target(e,tp,eg,ep,ev,re,r,rp,chk,chkc) end
function sample_operation(e,tp,eg,ep,ev,re,r,rp) end
这几个函数的前8个参数作用相同,具体解释如下:
e: 该效果本身
tp: 发动或者准备发动该效果的玩家
eg: event group, 事件涉及卡片组
ep: event player, 事件涉及的玩家
ev: event value, 事件涉及参数
re: reason effect, 触发事件的效果
r: reason, 事件原因描述
rp: reason, 触发事件的玩家
第3-8个参数记录了触发事件的信息,
举例来说:玩家1发动某效果e1对玩家2造成了500的效果伤害,那么
eg:空
ep:1 (=玩家2)
ev:500
re: e1
r: REASON_EFFECT(效果伤害)
rp: 0 (=玩家1)
触发事件的哪些参数有用具体参考事件说明。
cost和target还有第9个参数chk。此参数是在效果发动之前对效果的发动可能性经行判定。判定时,chk会被设置成0传入函数,然后在具体经行cost操作或者指定目标等操作时,chk会被设置成1传入。举例:
function c87910978.cost(e,tp,eg,ep,ev,re,r,rp,chk)
if chk==0 then return Duel.CheckLPCost(tp,800) --检查阶段,检查是否能支付800LP的cost
else Duel.PayLPCost(tp,800) end --非检查阶段,支付800LP的cost
end
如果效果是指定目标的,那么target会有第10个参数chkc,用来判断某一张卡是否是正确的对象(主要用于六武众的影武者等转移对象的效果),并且检查是chk会被置0.举例:
function c87910978.target(e,tp,eg,ep,ev,re,r,rp,chk,chkc)
if chk==0 then
if chkc then return chkc:GetLocation()==LOCATION_MZONE and chkc:GetControler()~=tp and c87910978.filter(chkc) end
--如果存在第10个参数,则检查那张卡是否满足这个效果的对象的要求。非指定对象的效果不需要此判定。
return Duel.IsExistingTarget(c87910978.filter,tp,0,LOCATION_MZONE,1,nil)
--否则进行对象的存在性判定
end
--进行对象选择
local g=Duel.SelectTarget(tp,c87910978.filter,tp,0,LOCATION_MZONE,1,1,nil)
Duel.SetOperationInfo(0,CATEGORY_CONTROL,g,1,0,0)
end
要注意的是,即使是不指定对象的效果也要进行对象的判定,用于防止空发。比如黑洞需要检查场上是否存在可破坏的怪,抽卡系效果需要判断卡组中是否存在足够的卡。
condition, cost, target都需要返回一个boolean型数据,true表示满足条件,false表示不满足。如果留空则认为总是满足条件。operation中进行实际的效果处理,并且不需要返回值。
某些效果可能有更多的额外参数,具体参考效果分类说明。
●关于契约效果的补充说明:
如果是在一个效果发动的cost和target阶段注册了一个契约效果(包含EFFECT_FLAG_OATH标志),那么当这个效果的发动被无效时,此契约效果将会被自动reset。比如强欲谦虚之壶等不能特招,一回合只能发动一张的效果。
0x3001 魔力指示物
0x2 楔指示物
0x3003 武士道指示物
0x3004 念力指示物
0x5 光指示物
0x6 宝玉指示物
0x7 指示物(剣闘獣の檻)
0x8 D指示物
0x9 毒指示物
0xa 次世代指示物
0x300b 指示物(古代の機械城)
0xc 雷指示物
0xd 强欲指示物
0xe A指示物
0xf 虫指示物
0x10 黑羽指示物
0x11 超毒指示物
0x12 机巧指示物
0x13 混沌指示物
0x14 指示物(奇跡のジュラシック·エッグ)
0x15 冰指示物
0x16 魔石指示物
0x17 橡子指示物
#forbidden
20663556 0 --イレカエル
44910027 0 --ヴィクトリー・ドラゴン
82301904 0 --混沌帝龍 -終焉の使者-
72989439 0 --カオス・ソルジャー -開闢の使者-
08131171 0 --キラー・スネーク
78010363 0 --黒き森のウィッチ
07391448 0 --ゴヨウ·ガーディアン
40737112 0 --混沌の黒魔術師
34124316 0 --サイバーポッド
63519819 0 --サウザンド·アイズ·サクリファイス
21593977 0 --処刑人-マキュラ
31560081 0 --聖なる魔術師
32646477 0 --ダーク·ダイブ·ボンバー
34853266 0 --月読命
56570271 0 --D-HERO ディスクガイ
69015963 0 --デビル·フランケン
33184167 0 --同族感染ウィルス
78706415 0 --ファイバーポッド
34206604 0 --魔導サイエンティスト
03078576 0 --八汰烏
14878871 0 --レスキューキャット
41482598 0 --悪夢の蜃気楼
44763025 0 --いたずら好きな双子悪魔
29762407 0 --王家の神殿
17375316 0 --押収
19613556 0 --大嵐
74191942 0 --苦渋の選択
42829885 0 --強引な番兵
45986603 0 --強奪
55144522 0 --強欲な壺
04031928 0 --心変わり
12580477 0 --サンダー·ボルト
23557835 0 --次元融合
57953380 0 --生還の宝札
87910978 0 --洗脳-ブレインコントロール
60682203 0 --大寒波
69243953 0 --蝶の短剣-エルマ
79571449 0 --天使の施し
18144506 0 --ハーピィの羽根帚
70828912 0 --早すぎた埋葬
34906152 0 --マスドライバー
46411259 0 --突然変異
85602018 0 --遺言状
61740673 0 --王宮の勅命
17484499 0 --現世と冥界の逆転
57728570 0 --死のデッキ破壊ウイルス
03280747 0 --第六感
35316708 0 --刻の封印
83555666 0 --破壊輪
28566710 0 --ラストバトル!
#limit
40044918 1 --E·HERO エアーマン
37742478 1 --オネスト
41470137 1 --剣闘獣ベストロウリィ
26202165 1 --クリッター
00423585 1 --召喚僧サモンプリースト
33420078 1 --ゾンビキャリア
65192027 1 --ダーク·アームド·ドラゴン
15341821 1 --ダンディライオン
98777036 1 --トラゴエディア
16226786 1 --深淵の暗殺者
80344569 1 --N·グラン·モール
04906301 1 --ネクロ·ガードナー
28297833 1 --ネクロフェイス
52687916 1 --氷結界の龍 トリシューラ
50321796 1 --氷結界の龍 ブリューナク
33396948 1 --封印されしエクゾディア
07902349 1 --封印されし者の左腕
70903634 1 --封印されし者の右腕
44519536 1 --封印されし者の左足
08124921 1 --封印されし者の右足
85215458 1 --BF-月影のカルート
02009101 1 --BF-疾風のゲイル
31305911 1 --マシュマロン
44330098 1 --冥府の使者ゴーズ
92826944 1 --馬頭鬼
33508719 1 --メタモルポット
96782886 1 --メンタルマスター
95503687 1 --ライトロード·サモナー ルミナス
48976825 1 --異次元からの埋葬
66957584 1 --インフェルニティガン
81439173 1 --おろかな埋葬
67723438 1 --緊急テレポート
91351370 1 --黒い旋風
46052429 1 --高等儀式術
83764718 1 --死者蘇生
73915051 1 --スケープ·ゴート
37520316 1 --精神操作
32807846 1 --増援
14087893 1 --月の書
45809008 1 --デステニー·ドロー
72892473 1 --手札抹殺
42703248 1 --ハリケーン
94886282 1 --光の援軍
72302403 1 --光の護封剣
53129443 1 --ブラック·ホール
77565204 1 --未来融合-フューチャー·フュージョン
58577036 1 --名推理
43040603 1 --モンスターゲート
01475311 1 --闇の誘惑
23171610 1 --リミッター解除
03136426 1 --レベル制限B地区
27970830 1 --六武の門
02295440 1 --ワン·フォー·ワン
27174286 1 --異次元からの帰還
93016201 1 --王宮の弾圧
41420027 1 --神の宣告
85742772 1 --グラヴィティ·バインド-超重力の網-
53582587 1 --激流葬
44095762 1 --聖なるバリア-ミラーフォース-
64697231 1 --ダスト·シュート
36468556 1 --停戦協定
46652477 1 --転生の予言
17078030 1 --光の護封壁
15800838 1 --マインドクラッシュ
32723153 1 --マジカル·エクスプロージョン
97077563 1 --リビングデッドの呼び声
#semi limit
85087012 2 --カードガンナー
57774843 2 --裁きの龍
59509952 2 --大天使クリスティア
23205979 2 --魂を削る死霊
09411399 2 --D-HERO ディアボリックガイ
14943837 2 --デブリ·ドラゴン
48686504 2 --ローンファイア·ブロッサム
03659803 2 --オーバーロード·フュージョン
72405967 2 --王家の生け贄
22046459 2 --巨大化
05318639 2 --サイクロン
91623717 2 --連鎖爆撃
98494543 2 --魔法石の採掘
29843091 2 --おジャマトリオ
84749824 2 --神の警告
53567095 2 --ゴッドバードアタック
29401950 2 --奈落の落とし穴
62279055 2 --魔法の筒
\ No newline at end of file
#forbidden
20663556 0 --イレカエル
44910027 0 --ヴィクトリー・ドラゴン
82301904 0 --混沌帝龍 -終焉の使者-
72989439 0 --カオス・ソルジャー -開闢の使者-
08131171 0 --キラー・スネーク
78010363 0 --黒き森のウィッチ
07391448 0 --ゴヨウ·ガーディアン
40737112 0 --混沌の黒魔術師
34124316 0 --サイバーポッド
63519819 0 --サウザンド·アイズ·サクリファイス
21593977 0 --処刑人-マキュラ
31560081 0 --聖なる魔術師
32646477 0 --ダーク·ダイブ·ボンバー
34853266 0 --月読命
56570271 0 --D-HERO ディスクガイ
69015963 0 --デビル·フランケン
33184167 0 --同族感染ウィルス
78706415 0 --ファイバーポッド
34206604 0 --魔導サイエンティスト
03078576 0 --八汰烏
14878871 0 --レスキューキャット
41482598 0 --悪夢の蜃気楼
44763025 0 --いたずら好きな双子悪魔
29762407 0 --王家の神殿
17375316 0 --押収
19613556 0 --大嵐
74191942 0 --苦渋の選択
42829885 0 --強引な番兵
45986603 0 --強奪
55144522 0 --強欲な壺
04031928 0 --心変わり
12580477 0 --サンダー·ボルト
23557835 0 --次元融合
57953380 0 --生還の宝札
87910978 0 --洗脳-ブレインコントロール
60682203 0 --大寒波
69243953 0 --蝶の短剣-エルマ
79571449 0 --天使の施し
18144506 0 --ハーピィの羽根帚
70828912 0 --早すぎた埋葬
34906152 0 --マスドライバー
46411259 0 --突然変異
85602018 0 --遺言状
61740673 0 --王宮の勅命
17484499 0 --現世と冥界の逆転
57728570 0 --死のデッキ破壊ウイルス
03280747 0 --第六感
35316708 0 --刻の封印
83555666 0 --破壊輪
28566710 0 --ラストバトル!
#limit
40044918 1 --E·HERO エアーマン
37742478 1 --オネスト
41470137 1 --剣闘獣ベストロウリィ
26202165 1 --クリッター
00423585 1 --召喚僧サモンプリースト
33420078 1 --ゾンビキャリア
65192027 1 --ダーク·アームド·ドラゴン
15341821 1 --ダンディライオン
98777036 1 --トラゴエディア
16226786 1 --深淵の暗殺者
80344569 1 --N·グラン·モール
04906301 1 --ネクロ·ガードナー
28297833 1 --ネクロフェイス
52687916 1 --氷結界の龍 トリシューラ
50321796 1 --氷結界の龍 ブリューナク
33396948 1 --封印されしエクゾディア
07902349 1 --封印されし者の左腕
70903634 1 --封印されし者の右腕
44519536 1 --封印されし者の左足
08124921 1 --封印されし者の右足
85215458 1 --BF-月影のカルート
02009101 1 --BF-疾風のゲイル
31305911 1 --マシュマロン
44330098 1 --冥府の使者ゴーズ
92826944 1 --馬頭鬼
33508719 1 --メタモルポット
96782886 1 --メンタルマスター
95503687 1 --ライトロード·サモナー ルミナス
48976825 1 --異次元からの埋葬
66957584 1 --インフェルニティガン
81439173 1 --おろかな埋葬
67723438 1 --緊急テレポート
91351370 1 --黒い旋風
46052429 1 --高等儀式術
83764718 1 --死者蘇生
73915051 1 --スケープ·ゴート
37520316 1 --精神操作
32807846 1 --増援
14087893 1 --月の書
45809008 1 --デステニー·ドロー
72892473 1 --手札抹殺
42703248 1 --ハリケーン
94886282 1 --光の援軍
72302403 1 --光の護封剣
53129443 1 --ブラック·ホール
77565204 1 --未来融合-フューチャー·フュージョン
58577036 1 --名推理
43040603 1 --モンスターゲート
01475311 1 --闇の誘惑
23171610 1 --リミッター解除
03136426 1 --レベル制限B地区
27970830 1 --六武の門
02295440 1 --ワン·フォー·ワン
27174286 1 --異次元からの帰還
93016201 1 --王宮の弾圧
41420027 1 --神の宣告
85742772 1 --グラヴィティ·バインド-超重力の網-
53582587 1 --激流葬
44095762 1 --聖なるバリア-ミラーフォース-
64697231 1 --ダスト·シュート
36468556 1 --停戦協定
46652477 1 --転生の予言
17078030 1 --光の護封壁
15800838 1 --マインドクラッシュ
32723153 1 --マジカル·エクスプロージョン
97077563 1 --リビングデッドの呼び声
#semi limit
85087012 2 --カードガンナー
57774843 2 --裁きの龍
59509952 2 --大天使クリスティア
23205979 2 --魂を削る死霊
09411399 2 --D-HERO ディアボリックガイ
14943837 2 --デブリ·ドラゴン
48686504 2 --ローンファイア·ブロッサム
03659803 2 --オーバーロード·フュージョン
72405967 2 --王家の生け贄
22046459 2 --巨大化
05318639 2 --サイクロン
91623717 2 --連鎖爆撃
98494543 2 --魔法石の採掘
29843091 2 --おジャマトリオ
84749824 2 --神の警告
53567095 2 --ゴッドバードアタック
29401950 2 --奈落の落とし穴
62279055 2 --魔法の筒
\ No newline at end of file
#forbidden
20663556 0 --イレカエル
44910027 0 --ヴィクトリー・ドラゴン
82301904 0 --混沌帝龍 -終焉の使者-
08131171 0 --キラー・スネーク
78010363 0 --黒き森のウィッチ
07391448 0 --ゴヨウ·ガーディアン
40737112 0 --混沌の黒魔術師
34124316 0 --サイバーポッド
63519819 0 --サウザンド·アイズ·サクリファイス
21593977 0 --処刑人-マキュラ
31560081 0 --聖なる魔術師
32646477 0 --ダーク·ダイブ·ボンバー
34853266 0 --月読命
56570271 0 --D-HERO ディスクガイ
69015963 0 --デビル·フランケン
33184167 0 --同族感染ウィルス
78706415 0 --ファイバーポッド
93369354 0 --フィッシュボーグ-ガンナー
34206604 0 --魔導サイエンティスト
96782886 0 --メンタルマスター
03078576 0 --八汰烏
14878871 0 --レスキューキャット
41482598 0 --悪夢の蜃気楼
44763025 0 --いたずら好きな双子悪魔
29762407 0 --王家の神殿
17375316 0 --押収
74191942 0 --苦渋の選択
42829885 0 --強引な番兵
45986603 0 --強奪
55144522 0 --強欲な壺
04031928 0 --心変わり
12580477 0 --サンダー·ボルト
23557835 0 --次元融合
57953380 0 --生還の宝札
87910978 0 --洗脳-ブレインコントロール
60682203 0 --大寒波
69243953 0 --蝶の短剣-エルマ
79571449 0 --天使の施し
42703248 0 --ハリケーン
18144506 0 --ハーピィの羽根帚
70828912 0 --早すぎた埋葬
34906152 0 --マスドライバー
46411259 0 --突然変異
85602018 0 --遺言状
61740673 0 --王宮の勅命
93016201 0 --王宮の弾圧
17484499 0 --現世と冥界の逆転
57728570 0 --死のデッキ破壊ウイルス
03280747 0 --第六感
35316708 0 --刻の封印
83555666 0 --破壊輪
28566710 0 --ラストバトル!
#limit
40044918 1 --E·HERO エアーマン
37742478 1 --オネスト
72989439 1 --カオス・ソルジャー -開闢の使者-
41470137 1 --剣闘獣ベストロウリィ
26202165 1 --クリッター
29981921 1 --真六武衆-シエン
33420078 1 --ゾンビキャリア
65192027 1 --ダーク·アームド·ドラゴン
15341821 1 --ダンディライオン
90953320 1 --TG ハイパー·ライブラリアン
14943837 1 --デブリ·ドラゴン
16226786 1 --深淵の暗殺者
80344569 1 --N·グラン·モール
28297833 1 --ネクロフェイス
52687916 1 --氷結界の龍 トリシューラ
50321796 1 --氷結界の龍 ブリューナク
33396948 1 --封印されしエクゾディア
07902349 1 --封印されし者の左腕
70903634 1 --封印されし者の右腕
44519536 1 --封印されし者の左足
08124921 1 --封印されし者の右足
50091196 1 --フォーミュラ·シンクロン
85215458 1 --BF-月影のカルート
02009101 1 --BF-疾風のゲイル
31305911 1 --マシュマロン
44330098 1 --冥府の使者ゴーズ
92826944 1 --馬頭鬼
33508719 1 --メタモルポット
95503687 1 --ライトロード·サモナー ルミナス
48686504 1 --ローンファイア·ブロッサム
48976825 1 --異次元からの埋葬
66957584 1 --インフェルニティガン
23701465 1 --原初の種
81439173 1 --おろかな埋葬
19613556 1 --大嵐
67723438 1 --緊急テレポート
91351370 1 --黒い旋風
46052429 1 --高等儀式術
83764718 1 --死者蘇生
54031490 1 --紫炎の狼煙
73915051 1 --スケープ·ゴート
37520316 1 --精神操作
32807846 1 --増援
67169062 1 --貪欲な壺
14087893 1 --月の書
72892473 1 --手札抹殺
94886282 1 --光の援軍
53129443 1 --ブラック·ホール
77565204 1 --未来融合-フューチャー·フュージョン
58577036 1 --名推理
43040603 1 --モンスターゲート
01475311 1 --闇の誘惑
23171610 1 --リミッター解除
03136426 1 --レベル制限B地区
27970830 1 --六武の門
02295440 1 --ワン·フォー·ワン
27174286 1 --異次元からの帰還
41420027 1 --神の宣告
53582587 1 --激流葬
44095762 1 --聖なるバリア-ミラーフォース-
64697231 1 --ダスト·シュート
36468556 1 --停戦協定
46652477 1 --転生の予言
17078030 1 --光の護封壁
32723153 1 --マジカル·エクスプロージョン
#semi limit
00423585 2 --召喚僧サモンプリースト
85087012 2 --カードガンナー
59509952 2 --大天使クリスティア
09411399 2 --D-HERO ディアボリックガイ
98777036 2 --トラゴエディア
70583986 2 --氷結界の虎王ドゥローレン
04906301 2 --ネクロ·ガードナー
72405967 2 --王家の生け贄
45809008 2 --デステニー·ドロー
91623717 2 --連鎖爆撃
98494543 2 --魔法石の採掘
72302403 2 --光の護封剣
29843091 2 --おジャマトリオ
84749824 2 --神の警告
85742772 2 --グラヴィティ·バインド-超重力の網-
29401950 2 --奈落の落とし穴
15800838 2 --マインドクラッシュ
62279055 2 --魔法の筒
97077563 2 --リビングデッドの呼び声
0x0 N/A
0x1 A·O·J
0x2 ジェネクス
0x1002 レアル·ジェネクス
0x2002 A·ジェネクス
0x4 アマズネス
0x5 アルカナフォース
0x6 暗黑界
0x7 アンティーク・ギア
0x8 HERO
0x3008 E·HERO
0x5008 V·HERO
0x6008 E-HERO
0xa008 M·HERO
0xc008 D·HERO
0x9 ネオス
0xa ヴェルズ
0x100a インヴェルズ
0xb インフェルニティ
0xc エーリアン
0xd セイバー
0x100d X-セイバー
0x300d XX-セイバー
0xe エレキ
0xf オジャマ
0x10 ガスタ
0x11 カラクリ
0x12 ガエル
0x13 機皇
0x3013 機皇帝
0x6013 機皇兵
0x14 儀式魔人
0x15 巨大戦艦
0x16 ロイド
0x1016 超级交通机人
0x17 シンクロン
0x18 雲魔物
0x19 剣闘獣
0x1a 黒蠍
0x1b 幻獣
0x101b 幻獣機
0x1c 幻魔
0x1d コアキメイル
0x1e C(コクーン)
0x1f N(ネオスペーシアン)
0x20 紫炎
0x21 地縛神
0x22 ジュラック
0x23 SIN
0x24 スクラップ
0x25 C(チェーン)
0x26 D(ディフォーマー)
0x27 TG(テックジーナス)
0x28 電池メン
0x29 ドラグニティ
0x2a ナチュル
0x2b 忍者
0x102b 機甲忍者
0x2c フレムベル
0x2d ハーピィ
0x2e 墓守
0x2f 氷結界
0x30 ヴァイロン
0x31 フォーチュンレディ
0x32 ヴォルカニック
0x33 BF(ブラックフェザー)
0x34 宝玉獣
0x35 魔轟神
0x1035 魔轟神獣
0x36 マシンナーズ
0x37 霞の谷
0x38 ライトロード
0x39 ラヴァル
0x3a リチュア
0x3b レッドアイズ
0x3c レプティレス
0x3d 六武衆
0x3e ワーム
0x3f セイヴァ
0x40 封印されし
0x41 LV
0x42 極星
0x3042 極星天
0x5042 極星宝
0x6042 極星獣
0xa042 極星霊
0x43 ジャンク
0x44 代行者
0x45 デーモン
0x46 融合/フュージョン
0x47 ジェム
0x1047 ジェムナイト
0x48 NO
0x1048 CNO
0x49 铳士
0x4a 時械神
0x4b 極神
0x4c 落とし穴
0x4d ゼンマイ
0x4e エヴォル
0x304e エヴォルド
0x604e エヴォルダ
0x4f バスター
0x104f /バスター
0x50 ヴェノム
0x51 ガジェット
0x52 ガーディアン
0x53 セイクリッド
0x54 ガガガ
0x55 フォトン
0x56 甲虫装機
0x57 リゾネーター
0x58 ゼンマイ
0x59 ゴゴゴ
0x5a 企鹅
0x5b 番茄小子
0x5c 斯芬克斯
0x60 竹光
0x61 忍法
0x62 トゥーン
0x63 リアクター
0x64 ハーピィ
0x65 侵略の
0x66 音響戦士
0x67 アイアン
0x68 ブリキ
0x69 聖刻
0x6a 幻蝶
0x6b 利刃保镖
0x6c 光芒使者
0x6d 魔人
0x306d 龙魔人
0x606d 仪式魔人
0x6e 魔导
0x106e 魔导书
0x6f 英豪
0x106f 英豪挑战者
0x206f 英豪冠军
0x70 先史遗产
0x71 魔偶甜点
0x72 齿轮齿轮
0x1072 齿轮齿轮人
0x73 超量
0x1073 混沌超量
0x74 水精鳞
0x75 深渊
0x76 纹章兽
0x77 海皇
0x78 迅捷
0x79 炎星
0x7a 骑士
0x107a 神圣骑士王
0x207a 圣剑
0x7b 银河
0x107b 银河眼
0x307b 银河眼时空龙
0x7c 炎舞
0x7d 阳炎
0x107d 阳炎兽
0x7e 异热同心武器
0x7f 希望皇
0x80 红
0x81 炎王
0x1081 炎王兽
0x82 怒怒怒
0x83 机关傀儡
0x84 燃烧拳击手
0x85 超级防卫机器人
0x86 光天使
0x87 阴影
0x88 武神
0x1088 武神器
0x89 二重落穴
0x8a 虫惑
0x108a 虫惑魔
0x8b 食恶
0x8c 暗跃
0x8d 鬼计
0x8e 吸血鬼
0x8f 刷拉拉将军
0x90 森罗
0x91 王家长眠之谷
0x92 纹章
0x93 电子
0x1093 电子龙
0x94 电子科技区
0x95 升阶魔法
0x96 电子鱼人-博士
0x97 古遗物-圣枪
0x98 魔术师
0x99 异色眼
0x9a 超重武者
0x9b 幻奏
0x9c 星因士
0x9d 影依
0x9e 龙星
0x9f 娱乐伙伴
0xa0 传说的骑士
0xa1 传说之龙
0xa2 黑魔术
0xa3 星尘
0xa4 羽翼栗子球
0x100 同调士相关同调怪兽
0x101 奇迹同调融合相关怪兽
0x102 暗黑融合限定怪兽
0x103 嵌合
1 通常召唤
2 特殊召唤
3 翻转召唤
4 通常召唤成功
5 特殊召唤成功
6 翻转召唤成功
7 发动
10 移除指示物
11 支付LP
20 抽卡阶段中
21 准备阶段中
22 主要阶段中
23 即将结束主要阶段
24 战斗阶段中
25 战斗结束阶段中
26 结束阶段中
27 抽卡前
28 战斗阶段开始
30 战斗回卷,是否继续攻击?
31 是否直接攻击?
40 伤害阶段中
41 即将计算战斗伤害
42 即将结束伤害阶段
43 即将产生战斗伤害
50 请选择一张手卡丢弃
60 正面
61 反面
70 怪物卡
71 魔法卡
72 陷阱卡
80 进入战斗阶段
81 进入结束阶段
90 是否不解放怪物通常召唤?
91 是否使用额外的召唤机会?
\ No newline at end of file
15341822 绵毛衍生物1
15341823 绵毛衍生物2
29843092 扰乱衍生物1
29843093 扰乱衍生物2
29843094 扰乱衍生物3
44330099 冥府之使者衍生物
83239740 牡蛎衍生物
73915052 羊衍生物1
73915053 羊衍生物2
73915054 羊衍生物3
73915055 羊衍生物4
53855410 二重身衍生物1
53855411 二重身衍生物2
85771020 阿斯蒙衍生物
85771021 蒂斯衍生物
46173680 黑焰衍生物1
46173681 黑焰衍生物2
12958920 铳士衍生物
24874631 金属恶魔衍生物
71645243 蔷薇衍生物
14089429 闪电子机衍生物
93130022 子机衍生物
35514097 分机衍生物
47658965 熔岩衍生物
40703223 栗子球衍生物
15394084 极星兽衍生物
40844553 英灵衍生物
42671152 邪精衍生物
21179144 爬虫妖衍生物
66661679 冰棺衍生物
69890968 幻魔衍生物
44689689 棘龙衍生物
48411997 侏罗纪衍生物
1 LP变成0
2 没有卡可抽
3 被封印的埃及使者
4 終焉のカウントダウン
5 毒蛇神ヴェノミナーガ
File added
C:\Users\Twinkle\Desktop\ImgGen\bin\Debug\ImgGen.exe.config
C:\Users\Twinkle\Desktop\ImgGen\bin\Debug\ImgGen.exe
C:\Users\Twinkle\Desktop\ImgGen\bin\Debug\ImgGen.pdb
C:\Users\Twinkle\Desktop\ImgGen\bin\Debug\System.Data.SQLite.dll
C:\Users\Twinkle\Desktop\ImgGen\obj\x86\Debug\ImgGen.exe
C:\Users\Twinkle\Desktop\ImgGen\obj\x86\Debug\ImgGen.pdb
C:\Users\Twinkle\Desktop\ImgGen\obj\x86\Debug\ImgGen.csprojResolveAssemblyReference.cache
C:\Users\Twinkle\Documents\Github\ImgGen\bin\Debug\ImgGen.exe.config
C:\Users\Twinkle\Documents\Github\ImgGen\obj\x86\Debug\ImgGen.exe
C:\Users\Twinkle\Documents\Github\ImgGen\obj\x86\Debug\ImgGen.pdb
C:\Users\Twinkle\Documents\Github\ImgGen\bin\Debug\ImgGen.exe
C:\Users\Twinkle\Documents\Github\ImgGen\bin\Debug\ImgGen.pdb
C:\Users\Twinkle\Documents\Github\ImgGen\bin\Debug\System.Data.SQLite.dll
C:\Users\Twinkle\Documents\Github\ImgGen\obj\x86\Debug\ImgGen.csprojResolveAssemblyReference.cache
C:\Users\Twinkle\Desktop\ImgGen\bin\Release\ImgGen.exe.config
C:\Users\Twinkle\Desktop\ImgGen\bin\Release\ImgGen.exe
C:\Users\Twinkle\Desktop\ImgGen\bin\Release\ImgGen.pdb
C:\Users\Twinkle\Desktop\ImgGen\bin\Release\System.Data.SQLite.dll
C:\Users\Twinkle\Desktop\ImgGen\obj\x86\Release\ImgGen.csprojResolveAssemblyReference.cache
C:\Users\Twinkle\Desktop\ImgGen\obj\x86\Release\ImgGen.exe
C:\Users\Twinkle\Desktop\ImgGen\obj\x86\Release\ImgGen.pdb
C:\Users\Twinkle\Documents\Github\ImgGen\bin\Release\ImgGen.exe.config
C:\Users\Twinkle\Documents\Github\ImgGen\obj\x86\Release\ImgGen.exe
C:\Users\Twinkle\Documents\Github\ImgGen\obj\x86\Release\ImgGen.pdb
C:\Users\Twinkle\Documents\Github\ImgGen\bin\Release\ImgGen.exe
C:\Users\Twinkle\Documents\Github\ImgGen\bin\Release\ImgGen.pdb
C:\Users\Twinkle\Documents\Github\ImgGen\bin\Release\System.Data.SQLite.dll
C:\Users\Twinkle\Documents\Github\ImgGen\obj\x86\Release\ImgGen.csprojResolveAssemblyReference.cache
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment