Cùng làm patch Der Langrisser trên SNES

Thảo luận trong 'Turn Based Strategy' bắt đầu bởi asm65816, 12/7/09.

  1. thief_fighter

    thief_fighter Legend of Zelda GVN Veteran

    Tham gia ngày:
    5/8/05
    Bài viết:
    1,151
    Nơi ở:
    The world god only knows
    nếu viết = VB hoặc java thì 2 người có thể cùng viết
    chỉ là lâu ko đụng vào nên lười
     
  2. Antomy

    Antomy Mr & Ms Pac-Man

    Tham gia ngày:
    6/5/06
    Bài viết:
    183
    Nơi ở:
    Ho Chi Minh city
    Mới đi công việc về, giờ tới sáng mai sẽ cố gắng hoàn thành...
    Mình viết bằng Java, thuật toán cũng gần xong rồi...
    Có gì viết xong share lên Thief_fighter, asm65816 và các bạn test dùm.

    Nghĩ gần 30 phút và rút ra được công thức sau:
    Gọi A = Số thẻ <line>
    Gọi B = số thẻ <pause><page>
    Nếu (A-2)/3 = B thì thẻ kế tiếp thêm vào phải là <pause><page>
    Nếu (A-2)/3 không bằng B thì thẻ kế tiếp thêm vào phải là <line>

    Ví dụ: Đúng theo yêu cầu thì phải có trình tự (L = line, p2 là pausepage)
    <L><L><p2><L><L><L><p2><L><L><L><p2><L><L><L><p2><L><L><L><p2>...
    Nếu ta đã có 2 thẻ <L> và chưa có thẻ <p2> tức là ta có
    A = 2; B= 0; áp dụng công thức (A-2)/3 = B tức là thẻ kế tiếp phải là <p2>
    Sau đó ta đã có 2 thẻ <L> và 1 thẻ <p2> tức là ta có
    A = 2; B= 1; lại áp dụng công thức (A-2)/3 không bằng B tức là thẻ kế tiếp phải là <L>
    Cứ thế cho tới hết.

    Mình cũng lâu lắm rồi không lập trình Java2SE, giờ toàn lập trình Java2EE nên cần 1 ít thời gian coi lại Swing... sẽ cố gắng...

    Các bạn tạm ngưng đừng làm bằng tay nữa, tốn giờ lắm... để chương trình hoàn thiện xong thì chỉ việc nhập file vào là nó sinh ngay kết quả... Dù làm nổi hay không thì mình cũng sẽ lên thông báo, hạn chót là mai, nếu sớm hơn sẽ post lên đây!
     
  3. thief_fighter

    thief_fighter Legend of Zelda GVN Veteran

    Tham gia ngày:
    5/8/05
    Bài viết:
    1,151
    Nơi ở:
    The world god only knows
    thay line = page break thì ko khó, cái chính là đếm chữ để căn line, đếm đến ký tự thứ 15 thì quay lại khoảng trắng trc đó và insert line

    mà ông có thể làm đơn giản là copy text vào cái text field, rồi convert() ra thành 1 đoạn đã insert thôi, ko phải đọc file với ghi file đỡ dc 1 đoạn code
     
  4. asm65816

    asm65816 Mega Man

    Tham gia ngày:
    23/5/09
    Bài viết:
    3,320
    Nơi ở:
    El Sallia
    Cám ơn mọi người đã quan tâm. Chắc là không cần đưa cái <pause><page> vào đâu, vì như thế sẽ phức tạp hơn.

    Vì mỗi block hội thoại, cứ 2 dòng đầu tiên là có 1 <pause><page>, nhưng các hàng tiếp theo thì cần 3 dòng mới cần <pause><page>.
    Và điều này nữa: mỗi dòng nên để 14 ký tự chứ không phải 15. Chiều rộng của các ký tự là như nhau.

    PS: Có ai viết được chương trình insert script vào rom dựa trên file text không nhỉ. Nghĩa là dịch vào trong txt, chạy chương trình thì nó sẽ tự động chèn những gì mình dịch trong txt vào rom.
     
  5. Antomy

    Antomy Mr & Ms Pac-Man

    Tham gia ngày:
    6/5/06
    Bài viết:
    183
    Nơi ở:
    Ho Chi Minh city
    @asm65816: mình không biết cách insert script vào rom... :( sorry Việc đưa pause page vào không khó, mình đã nghĩ ra thuật toán bên trang trước rồi.
    @thief_fighter: mình viết gần xong nhưng giờ bị dính một lỗi cực kỳ nghiêm trọng, đó chính là không đọc được tiếng Việt :((
    Test chạy với đoạn script tiếng anh ngon lành, nhưng tiếng Việt thì lúc chạy, lúc không chạy, mà nếu chạy cũng chạy sai.
    Ông giúp tôi với, cụ thể là đếm số ký tự trong từ bị sai, vd:
    Cụm từ "viet nam" nếu đếm bằng hàm length() sẽ cho kết quả là 8
    nhưng cụm từ đó có dấu "việt nam" thì lại không ra số 8 nên chương trình tui bị lỗi rồi.
    Ông trợ giúp cái... gần xong rồi mà bị dính chỗ này :(
     
  6. Antomy

    Antomy Mr & Ms Pac-Man

    Tham gia ngày:
    6/5/06
    Bài viết:
    183
    Nơi ở:
    Ho Chi Minh city
    Mới đọc được cái này, nhưng chưa biết làm có được không??
    http://java.sun.com/developer/technicalArticles/Intl/Supplementary/
    http://globalizer.wordpress.com/2007/01/16/utf-8-and-string-length-limitations/
    http://java.sun.com/mailers/techtips/corejava/2006/tt0822.html
    Mình không có time test thử, ai vào test xem đếm chuỗi "việt nam cộng hòa xã hội chủ nghĩa" xem kết quả có bao nhiêu ký tự? (34 ký tự là đáp án đúng)
    Chỉ cần giải quyết chỗ này là đã có thể release đoạn script cho mọi người test...
     
  7. thief_fighter

    thief_fighter Legend of Zelda GVN Veteran

    Tham gia ngày:
    5/8/05
    Bài viết:
    1,151
    Nơi ở:
    The world god only knows
    vừa test xong

    public static void main(String[] args) {
    String s = "việt nam cộng hòa xã hội chủ nghĩa";
    System.out.println(s.length());
    }


    run:
    34
    BUILD SUCCESSFUL (total time: 0 seconds)


    cho KQ là 34, sao của ông ko ra dc nhỉ
     
  8. asm65816

    asm65816 Mega Man

    Tham gia ngày:
    23/5/09
    Bài viết:
    3,320
    Nơi ở:
    El Sallia
    Hỗ trợ Unicode nha.
    Đang điên đầu với cái trình chèn script.
    Bình thường, chỉ cần tính toán chút là ra, nhưng dùng chương trình thì nhanh hơn, chỉ cần click chuột. Mấy game trước chạy ngon lành, tới lượt DL thì nó insert sai tùm lum.
     
  9. thief_fighter

    thief_fighter Legend of Zelda GVN Veteran

    Tham gia ngày:
    5/8/05
    Bài viết:
    1,151
    Nơi ở:
    The world god only knows
    viết xong đoạn code insert line rồi
    [spoil]
    Mã:
        public static String Convert(String s) {
            int i;
            int k = 0;
            int l = 0;
            char ch;
            String st = s;
            i = s.length();
            while (i > 14) {
                for (int j = 14 + k; j > k; j--) {                                
                    ch = s.charAt(j);
                    switch (ch) {
                        case ' ': {                        
                            st = st.substring(0, j + l) + st.substring(j + l + 1);
                            st = new java.lang.StringBuffer(st).insert(j + l, "<line>").toString();
                            j = j - k;
                            i = i - j;
                            k = k + j;
                            l = l + 5;
                            j = 0;                        
                            break;
                            
                        }
                    }
                }
            }
            return st;
    [/spoil]
    CHỈ CÒN MỘT TÍ NỮA THÔI! CHẲNG LÂU NỮA SẼ PHÁ ĐƯỢC CẦU!

    ->

    run:
    CHỈ CÒN MỘT TÍ<line>NỮA THÔI!<line>CHẲNG LÂU NỮA<line>SẼ PHÁ ĐƯỢC<line>CẦU!
    BUILD SUCCESSFUL (total time: 1 second)

    vấn đề là cả dấu ! , . ? cũng bị đếm

    đáng nhẽ phải là
    CHỈ CÒN MỘT TÍ<line>NỮA THÔI! CHẲNG<line>LÂU NỮA SẼ PHÁ<line>ĐƯỢC CẦU!

    ông Antomy làm phần pause page xong xem có làm nốt phần này giúp tôi dc ko
     
  10. asm65816

    asm65816 Mega Man

    Tham gia ngày:
    23/5/09
    Bài viết:
    3,320
    Nơi ở:
    El Sallia
    Không sao cả, cứ làm như thế là được.
    Thực ra khoảng trắng sau những dấu đó là do mình quy định, có thể sửa được.
     
  11. thief_fighter

    thief_fighter Legend of Zelda GVN Veteran

    Tham gia ngày:
    5/8/05
    Bài viết:
    1,151
    Nơi ở:
    The world god only knows
    vậy thì xong rồi
    thiếu đoạn code thay <line> = <pause><page> của Antomy nữa thôi
     
  12. asm65816

    asm65816 Mega Man

    Tham gia ngày:
    23/5/09
    Bài viết:
    3,320
    Nơi ở:
    El Sallia
    Tiện đây post luôn cấu trúc của cái DL lên để mọi người tham khảo

    Mã:
    CHARACTER BASE STATS
    
    These are the stats each playable character begins with before he/she/it 
    starts gaining experience. Struct entries are each 16 bytes long. There are
    18 entries which correspond to the 18 entries in the array COMMANDER_NAMES.
    
    Start Offset: 0x016ce0
    
    struct BASE_STATS
    {
      int8 AT,
      int8 DF,
      int24 Spells,    /* Bit string where turns entries in magic array on/off */
      bool Summon,     /* Store as int8, 0=off/1=on */
      int8 UNKNOWN1,
      int8 Portrait,
      int8 Troops,     /* Number of troops hireable */
      int8 Unit 1,     /* From CLASS_NAMES array */
      int8 Unit 2,
      int8 Unit 3,
      int32 UNKNOWN2
    }
    
    Regarding the Spells entry. It works like this. If you had the big Endian 
    value 0x800200, that is 100000000000001000000000 in binary. However, the bits 
    of each byte are mirrored left to right. This should be interpreted to be: 
    000000010100000000000000. Laying this over the SPELL_NAMES array, it will turn 
    on the spells Heal 1 and Turn Undead.
    
    -------------------------------------------------------------------------------
    
    ITEM STATS
    
    Each item is able to have four properties assigned to it. The four can be 
    mixed and matched from the array ITEM_PROPS. The following value is a signed 
    8-bit integer to offset that property. In the case of Summon, it pulls the 
    spell name from the array SUMMONS. The struct contains 36 entries which 
    correspond to the array ITEM_NAMES. Each entry is 8 bytes.
    
    Start Offset: 0x014fb1
    
    struct ITEM_STATS
    {
      int8 Property1,  /* From ITEM_PROPS */
      int8 Value1,
      int8 Property2,  /* From ITEM_PROPS */
      int8 Value2,
      int8 Property3,  /* From ITEM_PROPS */
      int8 Value3,
      int8 Property4,  /* From ITEM_PROPS */
      int8 Value4
    }
    
    -------------------------------------------------------------------------------
    
    CLASS STATS
    
    These are the statistics used to determine what base values a class has. In 
    the case of a class change, certain stats will be added cumulatively to the 
    character's base: for example, AT/DF/A/D/MP. You will notice certain stats are 
    far higher in hireable units, because you cannot change to classes such as 
    Lizard Man. There are 255 entries corresponding to the game's class index 
    table stored in array CLASS_NAMES. Each entry is 26 bytes.
    
    Start Offset: 0x036240
    
    struct CLASS_STATS
    {
      int8 0x0,
      bool Flying,     /* Determines true flying status. Battle screen y placement? */
      int8 0x0,
      uint8 Type,      /* from UNIT_TYPES */
      uint8 Tier,
      int8 AT,
      int8 DF,
      int8 MV,
      int8 Range,      /* Command range */
      int8 A,
      int8 D,
      uint8 MP,
      int8 MagicDef,
      int8 Troops,
      uint8 Cost,      /* Cost to hire in P. Multiply by 10 */
      int32 UNKNOWN,
      uint8 Unit1,     /* From CLASS_NAMES array */
      uint8 Unit2,
      uint8 Unit3,
      uint8 Spell1,    /* From SPELL_NAMES array */
      uint8 Spell2,
      uint8 Spell3,
      uint8 Spell4,
    }
    
    -------------------------------------------------------------------------------
    
    WINDOW COLORS
    
    While not a data structure, some people may wish to experiment with these. 
    These values will only work in a Japanese Der Langrisser ROM. In the English 
    version, we hijacked these values to store them elsewhere because of the new 
    color switch option.
    
    The dialogue windows use what is called Color Add/Sub, not alpha blending. 
    What it does is add or subtract a fixed amount of each color from each pixel 
    within the field. Color Add will make things brighter, and Color Subtract will 
    make them darker. You can't have it both ways.
    
    Offset: 0x0042d4
    
    Possible Values
    {
      0x03 = Color Add
      0x83 = Color Subtract
    }
    
    The actual color additions and subtractions are stored a little further in.
    
    Offset: 0x00437a
    
    struct COLOR_TABLE
    {
      int8 AllyColor1,
      int8 AllyColor2,
      int8 AllyColor3,
      int8 NPCColor1,
      int8 NPCColor2,
      int8 NPCColor3,
      int8 EnemyColor1,
      int8 EnemyColor2,
      int8 EnemyColor3
    }
    
    These color entries are SFC colors. For example, the default Ally window 
    colors are 0x30 0x50 0x81, or binary 001 10000, 010 10000 and 100 00001. In 
    the SFC Add/Sub, colors follow a pattern of bgriiiii. The first three bits are 
    a toggle saying whether to modify Blue (100), Green (010) or Red (001). The 
    last 5 bits are a value to offset by, giving you a possibility of 00000 to 
    11111, or 32 levels.
    
    The last value is the background color used in all non-dialogue windows. This 
    is a 16-bit color.
    
    Offset: 0x007ba5
    
    The default value is the little Endian word 0x1800 (stored in the ROM as 00 
    18), or 0001100000000000 in binary. The format for any SFC palette color is 
    xbbbbbgggggrrrrr, where red, green and blue are 5 bits each. Using the above 
    example, we have a value of rgb(0, 0, 6).
    
    -------------------------------------------------------------------------------
    
    ENABLE THE BATTLE TEST
    
    The Battle Test was first discovered in alamone's Der Langrisser script dumps 
    in 1998, and for years people scratched their heads over how to add it. The 
    Der Langrisser English patch was the first time people could see the battle 
    menu, and here is how it happened.
    
    Offset: 0x10e075
    
    In the Japanese game, this value is 0x02. This is the number of options to 
    show in the Media Test (from the load menu: Left, Right, Select A). All one 
    needs to do is change this value to 0x03, and magically the Battle Test 
    option will appear.
    
    Be warned, the Japanese one is nowhere near as refined as the English one, 
    and the majority of options in it appear as total nonsense with random 
    letters tacked onto the end. If you want a clear list of what each unit will 
    be, you are better off using the English patch.
    
    byuu is the one who found this offset.
    
    -------------------------------------------------------------------------------
    
    APPENDIX I
    
    static array UNIT_TYPES
    {
      string "Infantry",
      string "Infantry (Holy)",
      string "Spearmen",
      string "Cavalry",
      string "Cavalry (Mystic)",
      string "Flier",
      string "Infantry (Stealth)",
      string "Sailor",
      string "Gel",
      string "Demon",
      string "Sailor (Monster)",
      string "Infantry (Ranger)",
      string "Infantry (Mage)",
      string "Undead (Spirit)",
      string "Undead",
      string "Bowmen",
      string "Bowmen (Ballista)",
      string "Dragon"
    }
    
    static array ITEM_PROPS
    {
      string "AT",
      string "DF",
      string "MV",
      string "Range",
      string "A",
      string "D",
      string "Magic Range",
      string "Magic Damage",
      string "Magic Defense",
      string "Summon"
    }
    
    static array COMMANDER_NAMES
    {
      string "Erwin",
      string "Liana",
      string "Lana",
      string "Cherie",
      string "Hein",
      string "Scott",
      string "Keith",
      string "Aaron",
      string "Lester",
      string "Lana",           /* Dark Princess */
      string "Rohga",
      string "Sonya",
      string "Leon",
      string "Vargas",
      string "Imelda",
      string "Egbert",
      string "Esto",
      string "Osto"
    };
    
    static array ITEM_NAMES
    {
      string "Not Equipped",
      string "Dagger",
      string "War Hammer",
      string "Long Sword",
      string "Magic Wand",
      string "Inferno Lance",
      string "Devil Axe",
      string "Dragon Slayer",
      string "Langrisser",
      string "Langrisser",     /* Unsealed */
      string "Iron Dumbbell",
      string "Masayan Sword",
      string "Orb",
      string "Holy Rod",
      string "Holy Rod",
      string "Dark Rod",
      string "Long Bow",
      string "Arbalest",
      string "Alhazard",
      string "Alhazard",       /* Unsealed */
      string "Odin's Buckler",
      string "Buckler",
      string "Shield",
      string "Chainmail",
      string "Platemail",
      string "Assault Suit",
      string "Cloak",
      string "Dragon Scale",
      string "Wizard's Robe",
      string "Amulet",
      string "Cross",
      string "Necklace",
      string "Swift Boots",
      string "Crown",
      string "Gleipnir",
      string "Rune Stone"
    }
    
    static array CLASS_NAMES
    {
      string "        ",
      string "Fighter",        /* Imperial */
      string "Fighter",        /* Light */
      string "Fighter",
      string "Gladiator",      /* Imperial */
      string "Vampire",
      string "Knight",         /* Imperial */
      string "Knight",         /* Light */
      string "Pirate",         /* Light */
      string "Hawk Knight",    /* Imperial */
      string "Hawk Knight",    /* Light */
      string "Sister",
      string "Shaman",         /* Imperial */
      string "Warlock",        /* Imperial */
      string "Warlock",        /* Light */
      string "Werewolf",
      string "Gelgazer",
      string "Ghost",
      string "Scylla",
      string "Roc",
      string "Lord",           /* Imperial */
      string "Lord",           /* Light */
      string "Lord",
      string "Assassin",       /* Imperial */
      string "Assassin",       /* Light */
      string "Silver Knight",  /* Imperial */
      string "Silver Knight",  /* Light */
      string "Silver Knight",
      string "Captain",        /* Imperial */
      string "Captain",        /* Light */
      string "Hawk Lord",      /* Imperial */
      string "Hawk Lord",      /* Light */
      string "Cleric",
      string "Necromancer",    /* Imperial */
      string "Sorcerer",       /* Imperial */
      string "Sorcerer",       /* Light */
      string "Sorcerer",
      string "Paladin",
      string "Paladin",
      string "Kerberos",
      string "Dullahan",
      string "Lich",
      string "Serpent",
      string "Wyvern",
      string "High Lord",      /* Imperial */
      string "High Lord",      /* Light */
      string "High Lord",
      string "Swordsman",      /* Imperial */
      string "Swordsman",      /* Light */
      string "Highlander",     /* Imperial */
      string "Highlander",     /* Light */
      string "Highlander",
      string "Serpent Knight",
      string "Gladiator",
      string "Dragon Knight",  /* Imperial */
      string "Dragon Knight",  /* Light */
      string "Priest",
      string "Summoner",       /* Imperial */
      string "Mage",           /* Imperial */
      string "Mage",           /* Light */
      string "Mage",
      string "Saint",
      string "Saint",
      string "Unicorn Knight", /* Cherie */
      string "Minotaur",
      string "Living Armour",
      string "Succubus",
      string "Kraken",
      string "Phoenix",
      string "General",        /* Imperial */
      string "General",        /* Light */
      string "General",
      string "Sword Master",   /* Imperial */
      string "Sword Master",   /* Light */
      string "Knight Master",  /* Imperial */
      string "Knight Master",  /* Light */
      string "Knight Master",
      string "Serpent Lord",   /* Imperial */
      string "Pirate",
      string "Dragon Lord",    /* Chaos */
      string "Dragon Lord",    /* Light */
      string "High Priest",
      string "Zauberer",       /* Imperial */
      string "Zauberer",       /* Chaos */
      string "Archmage",       /* Imperial */
      string "Archmage",       /* Light */
      string "Archmage",
      string "Sage",
      string "Sage",
      string "Ranger",         /* Aaron */
      string "Ranger",         /* Rohga */
      string "Master Dino",
      string "Stone Golem",
      string "Vampire Lord",
      string "Jormungandr",
      string "Great Dragon",
      string "King",
      string "Emperor",        /* Bernhardt */
      string "Hero",
      string "Hero",
      string "Hero",
      string "Queen",          /* Imelda */
      string "Royal Guard",    /* Sonya */
      string "Royal Guard",    /* Leon */
      string "Royal Guard",    /* Scott */
      string "Royal Guard",    /* Erwin */
      string "Serpent Master", /* Light */
      string "Dragon Master",  /* Light */
      string "Agent",          /* Liana */
      string "Dark Master",    /* Boser */
      string "Dark Master",    /* Egbert */
      string "Wizard",         /* Imperial */
      string "Wizard",         /* Imperial */
      string "Wizard",         /* Light */
      string "Wizard",         /* Light */
      string "Princess",       /* Cherie */
      string "Sorcerer",       /* Imperial */
      string "High Master",    /* Aaron */
      string "High Master",    /* Rohga */
      string "Monk",
      string "Barbarian",
      string "Soldier",        /* Imperial */
      string "Soldier",        /* Light */
      string "Soldier",
      string "Berserker",
      string "Grenadier",      /* Imperial */
      string "Grenadier",      /* Light */
      string "Grenadier",
      string "Dark Guard",
      string "Lancer",
      string "Trooper",        /* Light */
      string "Trooper",
      string "Hell Hound",
      string "Royal Lancer",
      string "Dragoon",        /* Light */
      string "Dragoon",
      string "Bone Dino",
      string "Pike",           /* Imperial */
      string "Pike",           /* Light */
      string "Pike",
      string "Phalanx",        /* Imperial */
      string "Phalanx",        /* Light */
      string "Phalanx",
      string "Golem",
      string "Elf",            /* Imperial */
      string "Elf",            /* Light */
      string "Elf",
      string "Dark Elf",
      string "High Elf",       /* Imperial */
      string "High Elf",       /* Light */
      string "High Elf",
      string "Witch",
      string "Ballista",       /* Chaos */
      string "Ballista",       /* Imperial */
      string "Ballista",       /* Light */
      string "Ballista",
      string "Ghost",
      string "Spectre",
      string "Demon",
      string "Archdemon",
      string "Merman",         /* Light */
      string "Merman",
      string "Lizard Man",     /* Chaos */
      string "Lizard Man",     /* Imperial */
      string "Nixie",          /* Light */
      string "Nixie",
      string "Leviathan",      /* Chaos */
      string "Leviathan",      /* Imperial */
      string "Harpy",          /* Imperial */
      string "Harpy",
      string "Fairy",
      string "Bat",
      string "Griffin",        /* Imperial */
      string "Griffin",
      string "Angel",
      string "Gargoyle",
      string "Monk",           /* Light */
      string "Barbarian",      /* Imperial */
      string "Crusader",       /* Light */
      string "Crusader",
      string "Barbarian",      /* Imperial */
      string "Barbarian",
      string "Bandit",         /* Imperial */
      string "Bandit",
      string "Zombie",
      string "Skeleton",
      string "Wolfman",
      string "Ogre",
      string "Gel",
      string "Elemental",
      string "Civilian",
      string "Valkyrie",
      string "Freyja",
      string "White Dragon",
      string "Salamander",
      string "Iron Golem",
      string "Demon Lord",
      string "Sleipnir",
      string "Fenrir",
      string "Aniki",
      string "Bodybuilder",
      string "Knight Master",  /* Leon */
      string "Emperor",        /* Rohga */
      string "Zauberer",       /* Egbert */
      string "Assassin",
      string "Dark Princess",  /* Lana */
      string "Wizard",         /* Lana */
      string "Serpent Knight", /* Lester */
      string "Dragon Knight",  /* Keith */
      string "Dragon Lord",    /* Keith */
      string "Noble",          /* Eliza */
      string "Dragon Knight",  /* Cherie */
      string "Royal Guard",    /* Imelda */
      string "Archmage",       /* Jessica */
      string "High Lord",      /* Aaron */
      string "Sword Master",   /* Aaron */
      string "Knight",         /* Imperial */
      string "Serpent Lord",   /* Lester */
      string "Knight Master",  /* Scott */
      string "Assassin",       /* Imperial */
      string "Ranger",         /* Rohga */
      string "High Master",    /* Rohga */
      string "Archmage",       /* Sonya */
      string "Wizard",         /* Sonya */
      string "High Priest",    /* Liana */
      string "Chaos",
      string "Bishop",
      string "Lushiris",
      string "Sorcerer",       /* Imperial */
      string "Silver Knight",  /* Imperial */
      string "Necromancer",    /* Imperial */
      string "Saint",          /* Imperial */
      string "Mage",           /* Imperial */
      string "Swordsman",      /* Imperial */
      string "Highlander",     /* Imperial */
      string "Saint",          /* Imperial */
      string "Summoner",       /* Imperial */
      string "Swordsman",      /* Light */
      string "Serpent Knight", /* Light */
      string "Priest",
      string "Hawk Knight",
      string "Dragon Lord",    /* Chaos */
      string "Sage",           /* Chaos */
      string "Sage",           /* Chaos */
      string "Archmage",       /* Imperial */
      string "General",        /* Imperial */
      string "Sword Master",   /* Chaos */
      string "Serpent Lord",   /* Imperial */
      string "Sword Master",   /* Light */
      string "High Priest",
      string "Sage",           /* Cherie */
      string "General",        /* Vargas */
      string "Knight Master",  /* Imperial */
      string "Pirate",         /* Imperial */
      string "Knight"          /* Light */
    }
    
    static array SPELL_NAMES
    {
      string "Magic Arrow",
      string "Blast",
      string "Thunder",
      string "Fireball",
      string "Meteor",
      string "Blizzard",
      string "Tornado",
      string "Turn Undead",
      string "Earthquake",
      string "Heal 1",
      string "Heal 2",
      string "Force Heal 1",
      string "Force Heal 2",
      string "Sleep",
      string "Mute",
      string "Protection 1",
      string "Protection 2",
      string "Attack 1",
      string "Attack 2",
      string "Zone",
      string "Teleport",
      string "Resist",
      string "Charm",
      string "Quick",
      string "Again",
      string "Decrease",
      string "Valkyrie",
      string "Freyja",
      string "White Dragon",
      string "Salamander",
      string "Iron Golem",
      string "Demon Lord"
    }
    
    static array SUMMON_NAMES
    {
      string "Valkyrie",
      string "Freyja",
      string "White Dragon",
      string "Salamander",
      string "Iron Golem",
      string "Demon Lord",
      string "Sleipnir",
      string "Fenrir",
      string "Aniki",
      string "Aniki"           /* Enemy? */
    }
    :D
     
  13. Antomy

    Antomy Mr & Ms Pac-Man

    Tham gia ngày:
    6/5/06
    Bài viết:
    183
    Nơi ở:
    Ho Chi Minh city
    Mình đã cố hết sức, xong toàn bộ trừ không hỗ trợ tiếng Việt được thôi :((
    Ông thief_fighter thử cố gắng phát triển tiếp được không?

    Một số hình chụp lại từ ứng dụng đây:
    [spoil]
    Mở chương trình...
    [​IMG]
    Bấm Open...
    [​IMG]
    Chọn file TXT...
    [​IMG]
    Hoàn tất...
    [​IMG]
    Tập tin mới được sinh ra trên cùng thư mục có đuôi thêm hậu tố _fixed
    [​IMG]
    [/spoil]

    Mình đã test thử với file không dấu tiếng Việt (định dạng ANSI) thì kết quả khá mỹ mãn:

    File a2.txt có nội dung như sau:
    Mã:
    van chua xong ha, bon le me! bon le me! bon le me! bon le me! bon le me! bon le me! bon le me! bon le me! bon le me! bon le me! bon le me! bon le me!
    
    bon le me!
    
    van chua xong ha, bon le me!van chua xong ha?
    
    Kết quả sinh ra a2_fixed.txt có nội dung như sau:
    Mã:
    van chua xong<line>ha, bon le me! <line>bon le me! bon<pause><page>le me! bon le<line>me! bon le me! <line>bon le me! bon<line>le me! bon le<pause><page>me! bon le me! <line>bon le me! bon<line>le me! bon le<line>me! <pause><page><$00>
    
    bon le me! <line><$00>
    
    van chua xong<line>ha, bon le<line>me!van chua<pause><page>xong ha? <line><$00>
    
    Mình đính kèm file jar thực thi, asm65816 có thể down về và chạy kiểm thử. Nhớ chú ý máy phải hỗ trợ java, còn không thì lên trang web down file hỗ trợ về. Down cái JRE về.

    @thief_fighter: file nguồn java có 10KB thôi, bạn cố đọc mã nguồn mình viết rồi phát triển tiếp nhé, dễ hiểu lắm. Mình viết kiểu gọi hàm con đơn giản, chỗ nào không hiểu thì hỏi mình sẽ giải thích rõ ràng.
    Mình chỉ còn lại DUY NHẤT một hàm không làm nổi đó là hàm

    Mã:
        public static int countUnicodeChar(String s) {
            //char[] array = s.toCharArray();
            return s.codePointCount(0, s.length());
        }
    
    Bạn phải viết lại hàm này sao cho kết quả trả về là số ký tự có trong string s là được, hiện tại kết quả chạy không đúng. Cụm từ VNCHXHCN không trả về đúng!! Hoặc có thể phải nghiên cứu cách xuất ra file đích là file Unicode nữa (hiện tại file sinh ra chỉ là file ANSI thôi)...

    p/s: @thief_fighter: nếu ta nhập luôn trong chương trình thì length() sẽ đếm đúng, nhưng nếu nhập từ file thì đếm sai! :-w Nên có thể ông nghiên cứu cách giải quyết coi sao...
     

    Các file đính kèm:

  14. Antomy

    Antomy Mr & Ms Pac-Man

    Tham gia ngày:
    6/5/06
    Bài viết:
    183
    Nơi ở:
    Ho Chi Minh city
    @asm65816: mình 1 tuần chỉ rảnh ngày chủ nhật thôi. Vì vô năm mình bt ngập đầu, lại phải tăng tốc học anh văn vì đi nước ngoài nữa. Sorry.
    Bạn biết cách chạy chương trình có đuôi jar mình gửi không? nếu không bạn search google cách chạy chương trình có đuôi jar viết bằng java nhé. Và phải down JRE, có công dụng hỗ trợ Windows chạy java, cũng như di động hỗ trợ java vậy. JRE - java runtime environment, tải miễn phí từ trang web của Sun.

    File đính kèm thì " MyApp092009Java.rar" chứa file chương trình (*.jar), bạn down cái này về chạy thử.
    Còn file đính kèm còn lại "Source.rar", chính là mã nguồn, ai thích down về tham khảo và phát triển lên tiếp nhé.
     
  15. asm65816

    asm65816 Mega Man

    Tham gia ngày:
    23/5/09
    Bài viết:
    3,320
    Nơi ở:
    El Sallia
    Cám ơn Anatomy. Java thì chạy thường xuyên mà. Tiếc là không hỗ trợ Unicode nhỉ.
     
  16. Antomy

    Antomy Mr & Ms Pac-Man

    Tham gia ngày:
    6/5/06
    Bài viết:
    183
    Nơi ở:
    Ho Chi Minh city
    @asm65816: bạn xem cái a2.txt mình chèn như thế có đúng yêu cầu chưa?
    @thief_fighter: thuật toán của bạn mình nhìn vô chóng mặt quá, mấy cái j, k, l nhìn loạn cả lên... :|

    Sơ về thuật toán của mình như sau, bạn gắng đọc hết nhé, thật bình tĩnh...
    Mình có các biến string sau đây:
    1- String nguon; <--- là chuỗi đầu vào.
    2- String dich; <--- là chuỗi lết quả, ban đầu là rỗng.
    3- String tam; <--- vùng nhớ tạm.

    Thuật toán của mình như sau:
    1- Duyệt từng chữ trong 'nguon', đưa chữ đó vào 'tam'. Nếu trong nguồn hết chữ thì nhảy đến bước 4.
    2- Kiểm tra 'tam' có số kí tự <14 (hoặc 15 đối với chữ kết thúc bằng .,!?) hay không.
    2.a- nếu 'tam' còn ít kí tự thì quay lại bước 1
    2.b- nếu 'tam' đã đủ số kí tự thì thêm <tag> vào cuối câu.
    3- Đưa 'tam' vào 'dich', xóa hết 'tam' và quay lại bước 1.
    4- 'dich' lúc này đã thoả yêu cầu.

    Mình còn xây dựng của 1 hàm con, dùng để thêm <tag>. Trong thuật toán trên mình chỉ cần biết khi nào cần thêm <tag>, nhưng là <line> hay <pause><page> thì chưa biết.
    Muốn biết lúc đó cần thêm <tag> nào thì dùng thuật toán sau để quyết định:

    Gọi A = Số thẻ <line>, viết hàm đếm toàn bộ thẻ <line> đang có trong 'dich'
    Gọi B = số thẻ <pause><page>, viết hàm đếm toàn bộ thẻ <pause><page> đang có trong 'dich'
    Nếu (A-2)/3 = B thì thẻ kế tiếp thêm vào phải là <pause><page>
    Nếu (A-2)/3 không bằng B thì thẻ kế tiếp thêm vào phải là <line>

    ------------

    Có chóng mặt lắm không?
    Mình thấy bạn có thể dùng thuật toán thứ 2 của mình để quyết định thêm <tag> nào vào thuật toán trên kia của bạn.
    Mình thấy bạn thêm chết <line> đúng không? bạn có thể dùng thuật toán của mình để quyết định lúc đó nên thêm thẻ nào.

    Thuật toán này luôn đúng, mình test kỹ lắm rồi.
    Vd ta có <line>...<line>... thì thẻ kế tiếp phải là <pause><page> đúng không?
    Dùng thuật toán trên kia nhé, ban đầu <line> = A = 2, chưa có thẻ <pause><page> nên B = 0. Ta thấy (A-2)/3 = B đúng, nên thẻ tiếp theo là <pause><page>.
    Các bạn cứ thử 1 trường hợp khác sẽ thấy nó vẫn đúng.

    ------------------------------------------------------
    Mình có câu muốn hỏi, chương trình của bạn, cụ thể trong đoạn code trên kia,
    public static String Convert(String s);
    đối số đầu vào 's' bạn nhập từ bàn phím à?
    bạn test trên console đúng không?

    Chương trình của mình chỉ còn 1 lỗi là không đếm đúng số kí tự trong chuỗi unicode nhận từ file. Mình đã test, nếu nhận từ giá trị có sẵn (nhập giá trị chuỗi unicode vào thẳng đoạn code rồi build) thì đếm tốt.

    String s = "việt nam cộng hòa xã hội chủ nghĩa";
    System.out.println(s.length());
    ------> cho ra đúng 43.

    Nhưng nếu 's' đọc chuỗi này từ file thì đếm không ra 43, mà sẽ lớn hơn 43... 1 số kí tự nó đếm thành 2 hay 3 hay 4 kí tự. Ví dụ kí tự 'ủ' nó đếm thành 2 kí tự... >__<
     
  17. thief_fighter

    thief_fighter Legend of Zelda GVN Veteran

    Tham gia ngày:
    5/8/05
    Bài viết:
    1,151
    Nơi ở:
    The world god only knows
    tại tôi lười đặt biến :)), với cả ông bảo ko hỗ trợ unicode nên viết thử 1 đoạn test thôi
    code của tôi là thêm hết tag <line>, sau đó dùng thuật toán của ông để thay line = pause page, với cả tôi input / output vào GUI chứ ko đọc từ file như ông nên ko có lỗi.

    để tí nữa xem cái source của ông

    đoạn đếm chữ có dấu sai tôi nghĩ là do lúc đọc file ông quên đặt bảng mã UTF-16. Nếu ko thêm thì mặc định sẽ dùng bảng mã UTF-8

    trong bảng mã UTF-8:

    * từ '\u0001' đến '\u007F': những kí tự này chỉ chiếm 1 byte

    * từ '\u0080' đến '\u07FF': những kí tự này chiếm 2 bytes
    những chữ tiếng việt có dấu sẽ nằm ở đoạn 2 -> đếm bị dôi ra

    lúc ghi lại file có lỗi là do nó bị convert lại UTF-8 -> các ký tự ? []

    quy định luôn từ đầu là UTF-16 thì mọi ký tự đều chiếm 2 bytes, vậy lúc đếm chữ sẽ ko gặp khó khăn

    Nếu dùng BufferedReader thì sẽ như thế này

    BufferedReader freader = new BufferedReader(new InputStreamReader(new FileInputStream(inputf), "UTF-16"));
     
  18. Antomy

    Antomy Mr & Ms Pac-Man

    Tham gia ngày:
    6/5/06
    Bài viết:
    183
    Nơi ở:
    Ho Chi Minh city
    Ok, cám ơn ông nhé.
    Làm được nhớ lên thông báo cho bà con vui cửa vui nhà ^__^

    Trong cái code tui viết, có hàm MainFunction là khó hiểu nhất, nó chính là thuật toán từ bước 1 tới bước 4 trên kia. Khuyến cáo cái này ông đọc sau cùng.

    Còn lại các hàm countLine countP2 là dùng đếm bao nhiêu thẻ <line>, bao nhiêu thẻ <pause><page>
    Hàm placeTag dùng để quyết định nên thêm thẻ nào vào... cái này dễ hiểu ông coi trước.

    Chú ý có 1 hàm <int countUnicodeChar(String s)>, thật ra tui viết nó ra để đếm số kí tự trong 1 chuỗi unicode, nhưng thất bại, giá trị nó trả về y chang như s.length( ) nên ông cứ xem như nó chính là s.length( )

    Tui tin chắc sẽ thành công tới 90%, chỉ cần bỏ cái read file, mà nhập thẳng từ GUI rồi xuất ra GUI. ^__^
    Chúc ông may mắn.

    Quên nói, vì asm65816 qui ước dấu 3 chấm là 1 ký tự nên tui đã replace toàn bộ dấu 3 chấm (nếu có) thành ký tự ( _ : dấu gạch đít) dự đoán là không bao giờ gặp trong đoạn thoại. Như thế khi đếm nó sẽ là 1 kí tự. Sau khi xong xuôi hết thì thay ngược lại...

    Mọi người ơi, cùng nhau giúp đỡ asm65816 để mau hoàn thành game tiếng Việt đầu tiên trong lịch sử game console SNES tại VN nào!! :D
     
  19. thief_fighter

    thief_fighter Legend of Zelda GVN Veteran

    Tham gia ngày:
    5/8/05
    Bài viết:
    1,151
    Nơi ở:
    The world god only knows
    ok xong rồi, đọc ghi file unicode cũng ngon rồi, ai test lại thử xem còn lỗi gì ko
    credit:
    Antomy: lập trình + thiết kế GUI
    thief_fighter: đứng ngoài cổ vũ + tranh công :-"


    file input:
    Mã:
    Buổi sáng bác sĩ trưởng khoa Ali xoay xoay đến bệnh viện và hỏi người trực đêm:
    
    Tối qua ở khoa ta có ai tử vong không?
    
    Dạ ba ca liền ạ.
    
    Sao, cả khoa chỉ có bốn bệnh nhân và chiều qua tôi đã cho họ uống thuốc mà?
    
    Vâng, nhưng có một người không chịu uống thuốc ạ. 
    
    đây là file output
    Mã:
    Buổi sáng bác<line>sĩ trưởng khoa<line>Ali xoay xoay<pause><page>đến bệnh viện<line>và hỏi người<line>trực đêm:<$00>
    
    Tối qua ở khoa<line>ta có ai tử<line>vong không? <$00>
    
    Dạ ba ca liền<line>ạ. <$00>
    
    Sao, cả khoa<line>chỉ có bốn<line>bệnh nhân và<pause><page>chiều qua tôi<line>đã cho họ uống<line>thuốc mà? <$00>
    
    Vậy, nhưng có<line>một người<line>không chịu<pause><page>uống thuốc ạ. <$00>
    


    @asm65816:
    còn cái đưa text vào ROM thì ông phải nói cụ thể làm như thế nào thì mới liệu mà viết dc


    xem file ver 1.1 trang sau
     
  20. asm65816

    asm65816 Mega Man

    Tham gia ngày:
    23/5/09
    Bài viết:
    3,320
    Nơi ở:
    El Sallia
    Cám ơn, cám ơn và không biết nói gì hơn ngoài cám ơn!

    Thêm line cuối cùng là thừa rồi. Nhưng ta có thể chữa bằng tay dễ dàng, hoặc dùng chức năng thay thế của các trình soạn văn bản.

    <line><$00>

    Thay bằng <$00> là xong!

    Còn vụ insert text thì đang có vấn đề như sau:

    http://www.romhacking.net/forum/index.php/topic,9150.0.html

    Hơi khó hiểu, hôm nay đi làm về sẽ giải thích rõ hơn.
    .
    ___________Auto Merge________________

    .
    Oài, vừa mới chạy thử thì file out put chỉ có 1 kb thôi:d
    Lạ nhỉ.
     

Chia sẻ trang này