Files
test/Documentation/CONVERSION_EXAMPLE.md
T
2026-03-13 16:03:47 +07:00

5.0 KiB

Skill Conversion Example

What Gets Converted

Input: C++ skill1.h

class Skill1Stub : public SkillStub
{
public:
    Skill1Stub() : SkillStub(1)
    {
        name = L"虎击";
        icon = L"虎击.dds";
        max_level = 10;
        allow_land = 1;
        allow_air = 1;
        range.type = 0;
    }
    
    float GetMpcost(Skill * skill) const
    {
        return (float)(-5 + 7 * skill->GetLevel());
    }
    
    int GetExecutetime(Skill * skill) const
    {
        return 700;
    }
    
    class State1 : public SkillStub::State
    {
    public:
        virtual int GetTime(Skill * skill) const
        {
            return 400;
        }
        virtual void Calculate(Skill * skill) const
        {
            skill->GetPlayer()->SetDecmp(0.2 *(-5 + 7 * skill->GetLevel()));
        }
    };
};

Output: C# skill1.cs

public class Skill1Stub : SkillStub
{
    public Skill1Stub() : base(1)
    {
        name = "虎击";
        icon = "虎击";  // Extension removed!
        max_level = 10;
        allow_land = true;  // Converted to bool!
        allow_air = true;
        range = new Range();
        range.type = 0;
    }
    
    public override float GetMpcost(Skill skill) => (float)(-5 + 7 * skill.GetLevel());
    
    public override int GetExecutetime(Skill skill) => 700;
    
#if SKILL_SERVER
    public class State1 : SkillStub.State
    {
        public int GetTime(Skill skill) => 400;
        public void Calculate(Skill skill)
        {
            skill.GetPlayer().SetDecmp(0.2f *(-5 + 7 * skill.GetLevel()));
        }
    }
#endif
}

Key Changes Made

1. GetIntroduction Method (YOUR FIX!)

Before (old script):

public int GetIntroduction(Skill skill, StringBuilder buffer, int length, string format)
{
    string result = string.Format(format, params...);
    if (result.Length < length)
    {
        buffer.Append(result);
        return result.Length;
    }
    return 0;
}

After (fixed script):

public override int GetIntroduction(Skill skill, StringBuilder buffer, string format)
{
    buffer.Append(GPDataTypeHelper.ReplacePercentD(format,
        skill.GetLevel(),
        -5 + 7 * skill.GetLevel(),
        1.9 * skill.GetLevel() * skill.GetLevel() + 64 * skill.GetLevel() + 36.7));
    return buffer.Length;
}

2. Syntax Conversions

  • -> becomes . (pointer to member access)
  • L"text" becomes "text" (wide string literals)
  • 1/0 becomes true/false for boolean fields
  • .dds, .sgc extensions removed from icon/effect paths
  • Added override keyword where needed
  • Added f suffix to float literals

3. Structure Organization

  • #if SKILL_SERVER wraps server-only code
  • #if SKILL_CLIENT wraps client-only code
  • States properly nested
  • Constructor calls base(id) instead of : SkillStub(id)

File Organization After Conversion

E:\Projects\perfect-world-unity\Assets\PerfectWorld\Scripts\Skills\
├── SkillStubs1\
│   ├── skill1.cs
│   ├── skill2.cs
│   ├── skill3.cs
│   ├── ...
│   ├── skill100.cs
│   └── SkillStubs1.cs          ← Auto-generated registration file
├── SkillStubs2\
│   ├── skill101.cs
│   ├── ...
│   └── SkillStubs2.cs
└── ...

SkillStubs1.cs Registration File

using BrewMonster.Scripts.Skills;
using UnityEngine;

namespace BrewMonster
{
    public static partial class SkillStubs
    {
        // Skill stub declarations
        public static Skill1Stub __stub_Skill1Stub = new Skill1Stub();
        public static Skill2Stub __stub_Skill2Stub = new Skill2Stub();
        public static Skill3Stub __stub_Skill3Stub = new Skill3Stub();
        // ... all skills ...

#if SKILL_SERVER
        public static Skill1 __stub_Skill1 = new Skill1();
        public static Skill2 __stub_Skill2 = new Skill2();
        public static Skill3 __stub_Skill3 = new Skill3();
        // ... all skills ...
#endif
    }
}

Verification Checklist

After conversion, verify:

  • No compilation errors in Unity
  • Chinese characters display correctly
  • Icon names match your Unity assets (no .dds extension)
  • Skill descriptions show properly with GPDataTypeHelper.ReplacePercentD
  • All methods have correct override keyword
  • Float values have f suffix
  • Boolean fields use true/false not 1/0

Common Issues & Fixes

Issue: "Cannot convert int to bool"

Cause: Old conversion script didn't convert boolean fields
Fix: Already fixed! Script now converts 1true, 0false

Issue: "Method does not override"

Cause: Missing override keyword
Fix: Already fixed! Script adds override for GetMpcost, GetIntroduction, etc.

Issue: Skill description shows "{0} {1}" instead of values

Cause: Not using GPDataTypeHelper.ReplacePercentD
Fix: Already fixed! Your change uses ReplacePercentD now

Issue: Icon not found in Unity

Cause: File extension in icon path
Fix: Already fixed! Script removes .dds, .sgc extensions